最近用到了一些常规散列算法,学习一下SHA算法,网上SHA1介绍很多,也有实例,但代码风格似乎不符合我的审美。
经过学习验证,编写了一个简化版的SHA1算法,为什么叫简化版呢?
因为这个算法只能处理56字节以内的数据,大于等于56字节的情况要分组计算。
分组补位有点麻烦,怎么合理分组,还有待思考。
先贴出简化版的代码吧。
/** SHA1散列算法** 参考:http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf*/#include #include #include "sha1.h"#define S(x,n) (((x)< >(32-n)) //SHA定义S函数为循环左移static unsigned long h[5];static unsigned long m[16];static unsigned long w[80];//补位(余数=448)+补长度(64位)=512位Mstatic void sha1_pad(unsigned char *input, int len){ int i; int n; for(i=0;i<16;i++) { m[i] = 0; } for(i=0;i
测试用例:
void main(void){ char str[1024]; unsigned long* mac; while(1) { puts("input:"); gets(str); mac=sha1(str,strlen(str)); printf("SHA1=%08X%08X%08X%08X%08X\n",mac[0],mac[1],mac[2],mac[3],mac[4]); system("pause"); }}
运算结果:
input:
123 SHA1=40BD001563085FC35165329EA1FF5C5ECBDBBEEF 请按任意键继续. . . input: 123456 SHA1=7C4A8D09CA3762AF61E59520943DC26494F8941B 请按任意键继续. . .