设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2541|回复: 5
收起左侧

基于STC15F104系列8脚单片机实现MD5算法计算程序 (软串口发送,全套不到2kb)

[复制链接]
发表于 2018-10-5 20:14:48 | 显示全部楼层 |阅读模式
MD5.jpg
(图网无关)
md5("Hello World!")=ed076287532e86365e841e92bfc50d8c

  1. /*
  2. 晶振频率:11.0592Mhz 波特率:9600
  3. */
  4. #include "reg51.h"
  5. #include "intrins.h"
  6. sbit txd=P3^1; //数据发送口
  7. #define U8 unsigned char
  8. #define U16 unsigned int
  9. #define U32 unsigned long


  10. //--------只读数组--------
  11. U32 code ti[]={        //常量ti
  12.         0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
  13.         0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,
  14.         0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,
  15.         0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,
  16.         0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
  17.         0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,
  18.         0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,
  19.         0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,
  20.         0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
  21.         0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,
  22.         0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,
  23.         0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,
  24.         0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
  25.         };

  26. U8 code ss[]={        //向左移位数
  27.         7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
  28.         5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
  29.         4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
  30.         6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21
  31.         };

  32. U8 code xx[]={        //分组位置        
  33.         0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
  34.         1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12,
  35.         5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2,
  36.         0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9
  37.         };


  38. U32 md5_l[4];                //MD5计算结果

  39. /*
  40. 演示计算字符串 "Hello World!" (不含引号) 的MD5 (由于该型号IC的容量非常的小,所以数据在ROM中,且已填充好)
  41. */

  42. U32 code md5_x[16]={1819043144,1867980911,560229490,128,0,0,0,0,0,0,0,0,0,0,96,0};

  43. U32 rol(U32 x,U8 n){                 //循环左移
  44.         return ((x) << (n)) | ((x) >> (32-(n)));
  45. }


  46. void md5_while(U32 *x){         //MD5 一轮计算
  47.         U32 A=md5_l[0],B=md5_l[1],C=md5_l[2],D=md5_l[3];
  48.         U32 aa,bb,cc,dd;
  49.         U32 f;U8 i;
  50.         for(i=0;i<64;i++){
  51.                 switch(i>>4){
  52.                 case 0:f=(B&C)|((~B)&D);break;
  53.                 case 1:f=(D&B)|((~D)&C);break;
  54.                 case 2:f=B^C^D;break;
  55.                 case 3:f=C^(B|(~D));break;
  56.                 }
  57.         A=B+rol(A+f+x[xx[i]]+ti[i],ss[i]);
  58.         aa=A;bb=B;cc=C;dd=D;
  59.         A=dd;B=aa;C=bb;D=cc;
  60.         }
  61.         md5_l[0]+=A;md5_l[1]+=B;
  62.         md5_l[2]+=C;md5_l[3]+=D;
  63. }

  64. void md5_init(){         //初始化MD5需要的4个变量
  65.         md5_l[0]=0x67452301;        //MD5初始化的4个变量
  66.         md5_l[1]=0xefcdab89;   
  67.         md5_l[2]=0x98badcfe;
  68.         md5_l[3]=0x10325476;  
  69. }

  70. void md5(){        //计算MD5
  71.         md5_init();
  72.         md5_while(&md5_x);
  73. }



  74. void delay_uart(){ //延时时间1除以波特率秒
  75.     U8 a,b;
  76.     for(b=3;b>0;b--)
  77.         for(a=94;a>0;a--);
  78. }

  79.         void txd_data(U8 i){  //发送数据
  80.         U8 j=1;//控制移位
  81.         U8 k=8;//控制循环次数
  82.                 delay_uart();//延时时间
  83.                 txd=0; //发送起始位,低电平
  84.                 while(k--){ //下面循环8次
  85.                 delay_uart();//延时时间
  86.                 txd=(i&j)/j; //发送数据
  87.                 j<<=1; //左移1位,发送下1位数据
  88.                 }
  89.                 delay_uart();//延时时间
  90.                 txd=1;  //发送停止位
  91.         }

  92. void send_hex(U8 C){                //串口发字节(16进制大写)
  93.         U8 D=C>>4;
  94.         if(D >= 0 && D <=9){
  95.                 txd_data(D+48);
  96.                 } else {
  97.                 txd_data(D+55);
  98.         }

  99.         D=C&15;
  100.         if(D >= 0 && D <=9){
  101.                 txd_data(D+48);
  102.                 } else {
  103.         txd_data(D+55);
  104.         }
  105.         
  106. }

  107. void send_md5(){         //将MD5通过串口发出
  108.         U8 i;
  109.         for(i=0;i<16;++i) send_hex(md5_l[i>>2]>>((i&3)<<3));
  110.         }

  111. void main(){
  112. txd_data(0x4D);        //发送字符串 "MD5:" (不含引号)
  113. txd_data(0x44);
  114. txd_data(0x35);
  115. txd_data(0x3A);

  116. md5();                //计算MD5
  117. send_md5();        //发送MD5

  118. while(1);
  119. }

复制代码

评分

1

查看全部评分

发表于 2018-10-5 20:40:35 | 显示全部楼层
呵呵,你也在搞这玩意...
发表于 2018-10-6 08:30:24 | 显示全部楼层
神优化,别人写的至少得10多k。
发表于 2018-10-6 18:59:22 | 显示全部楼层
路过赞一个
发表于 2018-10-6 20:01:10 | 显示全部楼层
Cute 发表于 2018-10-6 08:30
神优化,别人写的至少得10多k。

他们想不到还可以这样写...
发表于 2018-10-7 07:04:14 | 显示全部楼层
不错不错不错6666
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 15:35 , Processed in 0.519029 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表