sha1("Hello World! 中文测试")=D1F18DCD113E4B697E551BD14A1980A36CA37F70 Build target '目标 1'
compiling SHA1.c...
SHA1.C(81): warning C182: pointer to different objects
linking...
Program Size: data=115.0 xdata=340 code=2154
creating hex file from "SHA1"...
"SHA1" - 0 Error(s), 1 Warning(s).
本程序不包含16进制文本转换以及串口发送程序,如有需有自行添加。
被蓝色包围的内存区域就是计算出的SHA1值:
- #include "reg51.h"
- #include "intrins.h"
- #define u8 unsigned char
- #define u16 unsigned int
- #define u32 unsigned long
- #define U8 unsigned char
- #define U16 unsigned int
- #define U32 unsigned long
- u32 xdata int_data2[80];
- u32 int_size,len;
- u32 len_bit;
- u32 *int_data;
- u32 sha1_kt(u32 t){
- if(t < 20){
- return 0x5A827999;
- } else if (t < 40){
- return 0x6ED9EBA1;
- } else if (t < 60){
- return 0x8F1BBCDC;
- }
- return 0xCA62C1D6;
- }
- u32 sha1_ft(u32 t,u32 b,u32 c,u32 d){
- if(t < 20){
- return (b&c) | ((~b)&d);
- } else if (t < 40){
- return b^c^d;
- } else if(t < 60){
- return (b&c) | (b&d) | (c&d);
- }
- return b^c^d;
- }
- u32 sha1_read_int_data2(u32 address){
- u32 ret;
- ret = int_data[address];
- if(address == int_size) {
- switch(len&3){
- case 0:ret=0;break;
- case 1:ret&=0xFF000000;break;
- case 2:ret&=0xFFFF0000;break;
- case 3:ret&=0xFFFFFF00;break;
- }
- } else if(address > int_size){
- return 0;
- }
- return ret;
- }
- u32 sha1_read_int_data(u32 address){
- if(address == (len_bit >> 5)){
- return sha1_read_int_data2(len_bit>>5) | (u32)128 << ((24-len_bit)&31);
- }
- if(address == ((((len_bit+64) >> 9)<<4)+15)){
- return len_bit;
- }
- return sha1_read_int_data2(address);
- }
- /*
- 计算SHA1校验码
- 参数1: 数据指针
- 参数2: 数据长度
- 参数3~7:计算结果(变量传出)
- */
- void sha1(u8 *text,u32 text_len,u32 *sha1_a,u32 *sha1_b,u32 *sha1_c,u32 *sha1_d,u32 *sha1_e){
- u32 while_size,i,t;
- u32 a,b,c,d,e;
- u32 oa,ob,oc,od,oe;
- u8 j;
- int_data = text;
- len = text_len;
- int_size = len>>2;
- len_bit=len<<3;
-
- a = 0x67452301;b = 0xEFCDAB89;
- c = 0x98BADCFE;d = 0x10325476;
- e = 0xC3D2E1F0;
-
- while_size = (((len_bit+64)>>9)<<4)+16;
- for(i=0;i < while_size;i+=16){
- oa=a;ob=b;oc=c;od=d;oe=e;
- for(j=0;j<80;j++){
- if(j<16){
- int_data2[j] = sha1_read_int_data(i+j);
- } else {
- int_data2[j] = _lrol_(int_data2[j-3] ^ int_data2[j-8] ^ int_data2[j-14] ^ int_data2[j-16],1);
- }
- t = _lrol_(a,5) + sha1_ft(j,b,c,d) + e + int_data2[j] + sha1_kt(j);
- e = d;d = c;
- c = _lrol_(b,30);
- b = a;a = t;
- }
- a+=oa;b+=ob;c+=oc;
- d+=od;e+=oe;
- }
- *sha1_a=a;*sha1_b=b;
- *sha1_c=c;*sha1_d=d;
- *sha1_e=e;
- }
- void main(){
- U32 xdata sv[5];
- sha1("Hello World! 中文测试",21,&sv[0],&sv[1],&sv[2],&sv[3],&sv[4]);
- P3=0xAA;
- while(1){
- }
- }
复制代码 |