设为首页收藏本站帮助中心
查看: 2603|回复: 4
收起左侧

C51(STC)系列8位单片机实现SHA1单向散列加密算法的移植V1.0 (只需2Kb多的ROM空间)

[复制链接]
发表于 2019-9-5 12:15:37 | 显示全部楼层 |阅读模式
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值:
图1.png


  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long
  6. #define U8 unsigned char
  7. #define U16 unsigned int
  8. #define U32 unsigned long

  9. u32 xdata int_data2[80];
  10. u32 int_size,len;
  11. u32 len_bit;
  12. u32 *int_data;

  13. u32 sha1_kt(u32 t){
  14.         if(t < 20){
  15.         return 0x5A827999;
  16.         } else if (t < 40){
  17.         return 0x6ED9EBA1;
  18.         } else if (t < 60){
  19.         return 0x8F1BBCDC;
  20.         }
  21.         return 0xCA62C1D6;
  22. }


  23. u32 sha1_ft(u32 t,u32 b,u32 c,u32 d){
  24.         if(t < 20){
  25.         return (b&c) | ((~b)&d);
  26.         } else if (t < 40){
  27.         return b^c^d;
  28.         } else if(t < 60){
  29.         return (b&c) | (b&d) | (c&d);
  30.         }
  31.         return b^c^d;
  32. }



  33. u32 sha1_read_int_data2(u32 address){
  34.         u32 ret;
  35.         ret = int_data[address];
  36.         if(address == int_size) {
  37.                 switch(len&3){
  38.                 case 0:ret=0;break;
  39.                 case 1:ret&=0xFF000000;break;
  40.                 case 2:ret&=0xFFFF0000;break;
  41.                 case 3:ret&=0xFFFFFF00;break;
  42.                 }
  43.         } else if(address > int_size){
  44.                 return 0;
  45.         }

  46.         return ret;
  47. }

  48. u32 sha1_read_int_data(u32 address){

  49.         if(address == (len_bit >> 5)){
  50.         return sha1_read_int_data2(len_bit>>5) | (u32)128 << ((24-len_bit)&31);       
  51.         }
  52.         if(address == ((((len_bit+64) >> 9)<<4)+15)){
  53.                 return len_bit;
  54.         }

  55.         return sha1_read_int_data2(address);
  56. }

  57. /*
  58. 计算SHA1校验码
  59. 参数1:        数据指针
  60. 参数2:        数据长度
  61. 参数3~7:计算结果(变量传出)
  62. */

  63. void sha1(u8 *text,u32 text_len,u32 *sha1_a,u32 *sha1_b,u32 *sha1_c,u32 *sha1_d,u32 *sha1_e){
  64.         u32 while_size,i,t;
  65.         u32 a,b,c,d,e;
  66.         u32 oa,ob,oc,od,oe;
  67.         u8 j;
  68.         int_data = text;
  69.         len = text_len;
  70.         int_size = len>>2;

  71.         len_bit=len<<3;
  72.        
  73.         a = 0x67452301;b = 0xEFCDAB89;
  74.         c = 0x98BADCFE;d = 0x10325476;
  75.         e = 0xC3D2E1F0;
  76.        
  77.         while_size = (((len_bit+64)>>9)<<4)+16;
  78.                 for(i=0;i < while_size;i+=16){
  79.                         oa=a;ob=b;oc=c;od=d;oe=e;
  80.                         for(j=0;j<80;j++){
  81.                                 if(j<16){
  82.                         int_data2[j] = sha1_read_int_data(i+j);

  83.                                 } else {
  84.                 int_data2[j] = _lrol_(int_data2[j-3] ^ int_data2[j-8] ^ int_data2[j-14] ^ int_data2[j-16],1);
  85.                                 }

  86.                                 t = _lrol_(a,5) + sha1_ft(j,b,c,d) + e + int_data2[j] + sha1_kt(j);
  87.                                 e = d;d = c;
  88.                                 c = _lrol_(b,30);
  89.                                 b = a;a = t;
  90.                         }
  91.                         a+=oa;b+=ob;c+=oc;
  92.                         d+=od;e+=oe;
  93.                 }
  94.         *sha1_a=a;*sha1_b=b;
  95.         *sha1_c=c;*sha1_d=d;
  96.         *sha1_e=e;

  97. }       


  98. void main(){

  99. U32 xdata sv[5];

  100. sha1("Hello World! 中文测试",21,&sv[0],&sv[1],&sv[2],&sv[3],&sv[4]);
  101. P3=0xAA;
  102.         while(1){

  103.         }
  104. }


复制代码

评分

1

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则