哈希加密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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值