哈希加密c语言算法,求嵌入式平台下的加密解密算法

#include 

#include 

#include 

#include 

const unsigned int s[4][4]={{7,12,17,22},{5,9,14,20},{4,11,16,23},{6,10,15,21}};

const unsigned long t[64]={//t[i]=4294967296*fabs(sin(i+1));

0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,

0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,

0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,

0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,

0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,

0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,

0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,

0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391

};

const int serial[64]={

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,

1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,

5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,

0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9

};

void func(unsigned long& a,

unsigned long b,

unsigned long c,

unsigned long d,

unsigned long M,

unsigned long t,

int s,

int turn) {

unsigned long temp;

switch(turn) {

case 0:

temp=(b&c)|((~b)&d);

break;

case 1:

temp=(d&b)|((~d)&c);

break;

case 2:

temp=b^c^d;

break;

case 3:

temp=c^(b|(~d));

break;

}

temp+=M+t+a;

_asm {

mov ecx,s

rol temp,cl

}

a=b+temp;

}

void MD512(const unsigned long M[16],unsigned long hash[4]) {

int i,j,index=0;

for (i=0;i<4;i++)

for (j=0;j<4;j++) {

func(hash[0],hash[1],hash[2],hash[3],M[serial[index]],t[index],s[i][0],i);

index++;

func(hash[3],hash[0],hash[1],hash[2],M[serial[index]],t[index],s[i][1],i);

index++;

func(hash[2],hash[3],hash[0],hash[1],M[serial[index]],t[index],s[i][2],i);

index++;

func(hash[1],hash[2],hash[3],hash[0],M[serial[index]],t[index],s[i][3],i);

index++;

}

}

void MD5(char* M,int nLen,unsigned long output[4]) {

int i,j;

unsigned long Hash[4]={0x67452301,0xefcdab89,0x98badcfe,0x10325476};

unsigned long hash[4];

//填充

__int64 BitsLen=nLen*8;

int oldlen=nLen;

while(nLen%64!=56) {

M[nLen++]=0;

}

M[oldlen]=0x80u;

*(__int64*)(M+nLen)=BitsLen;

nLen+=8;

//开始处理分组

for (i=0;i

memcpy(hash,Hash,sizeof(long)*4);

MD512((const unsigned long*)&M[i],hash);//处理512bits分组

for (j=0;j<4;j++)

Hash[j]+=hash[j];

}

//处理输出。

for (i=0;i<4;i++)

for (j=3;j>=0;j--) {

*((char*)(output+i)+j)=*((char*)(Hash+i)+3-j);

}

}

int main() {

int i;

char szMessage[1000]={0};

printf("input a string:\n>>>");

scanf("%s",szMessage);

unsigned long output[4];

MD5(szMessage,strlen(szMessage),output);

for (i=0;i<4;i++)

printf("%08lx",output[i]);

printf("\n");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希算法是一种常用的加密算法,可以将输入的任意长度的数据转化成固定长度的哈希值。在C语言中,我们可以通过一些常用的哈希算法的实现来进行加密。 一个常用的哈希算法是MD5(Message Digest Algorithm 5)。在C语言中,我们可以使用openssl库中的MD5函数来实现。 首先,我们需要引入openssl头文件并链接openssl库: ``` #include <openssl/md5.h> #include <stdio.h> #include <string.h> #include <stdlib.h> ``` 接下来,我们可以定义一个函数来实现哈希算法加密功能: ``` void md5_encrypt(char* input, char* output) { unsigned char digest[MD5_DIGEST_LENGTH]; MD5((unsigned char*)input, strlen(input), digest); for(int i = 0; i < MD5_DIGEST_LENGTH; i++) { sprintf(&(output[i*2]), "%02x", (unsigned int)digest[i]); } } ``` 在这个函数中,我们首先定义了一个unsigned char类型的数组digest用于存储MD5算法哈希值。然后,我们调用了MD5函数来对输入的input进行哈希算法的运算。最后,我们通过sprintf函数将哈希值转化为16进制的字符串并存储在output中。 我们可以在主函数中调用md5_encrypt函数,并输出结果: ``` int main() { char input[] = "Hello World"; char output[MD5_DIGEST_LENGTH*2+1]; md5_encrypt(input, output); printf("MD5 hash: %s\n", output); return 0; } ``` 运行这段代码,我们将会得到输入"Hello World"的MD5哈希值并输出。 除了MD5,C语言中还有其他的哈希算法的实现,比如SHA-1(Secure Hash Algorithm 1),SHA-256等等。实现这些哈希算法的原理和步骤类似,只需要将相应的函数和头文件进行替换即可。 需要注意的是,哈希算法是一种单向加密算法,即无法通过哈希值逆向得到原始数据。因此,哈希算法主要用于验证数据的完整性和唯一性,而不是加密敏感信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值