(图网无关)
md5("Hello World!")=ed076287532e86365e841e92bfc50d8c
- /*
- 晶振频率:11.0592Mhz 波特率:9600
- */
- #include "reg51.h"
- #include "intrins.h"
- sbit txd=P3^1; //数据发送口
- #define U8 unsigned char
- #define U16 unsigned int
- #define U32 unsigned long
- //--------只读数组--------
- U32 code ti[]={ //常量ti
- 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
- };
- U8 code ss[]={ //向左移位数
- 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,
- 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,
- 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,
- 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21
- };
- U8 code xx[]={ //分组位置
- 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
- };
- U32 md5_l[4]; //MD5计算结果
- /*
- 演示计算字符串 "Hello World!" (不含引号) 的MD5 (由于该型号IC的容量非常的小,所以数据在ROM中,且已填充好)
- */
- U32 code md5_x[16]={1819043144,1867980911,560229490,128,0,0,0,0,0,0,0,0,0,0,96,0};
- U32 rol(U32 x,U8 n){ //循环左移
- return ((x) << (n)) | ((x) >> (32-(n)));
- }
- void md5_while(U32 *x){ //MD5 一轮计算
- U32 A=md5_l[0],B=md5_l[1],C=md5_l[2],D=md5_l[3];
- U32 aa,bb,cc,dd;
- U32 f;U8 i;
- for(i=0;i<64;i++){
- switch(i>>4){
- case 0:f=(B&C)|((~B)&D);break;
- case 1:f=(D&B)|((~D)&C);break;
- case 2:f=B^C^D;break;
- case 3:f=C^(B|(~D));break;
- }
- A=B+rol(A+f+x[xx[i]]+ti[i],ss[i]);
- aa=A;bb=B;cc=C;dd=D;
- A=dd;B=aa;C=bb;D=cc;
- }
- md5_l[0]+=A;md5_l[1]+=B;
- md5_l[2]+=C;md5_l[3]+=D;
- }
- void md5_init(){ //初始化MD5需要的4个变量
- md5_l[0]=0x67452301; //MD5初始化的4个变量
- md5_l[1]=0xefcdab89;
- md5_l[2]=0x98badcfe;
- md5_l[3]=0x10325476;
- }
- void md5(){ //计算MD5
- md5_init();
- md5_while(&md5_x);
- }
- void delay_uart(){ //延时时间1除以波特率秒
- U8 a,b;
- for(b=3;b>0;b--)
- for(a=94;a>0;a--);
- }
- void txd_data(U8 i){ //发送数据
- U8 j=1;//控制移位
- U8 k=8;//控制循环次数
- delay_uart();//延时时间
- txd=0; //发送起始位,低电平
- while(k--){ //下面循环8次
- delay_uart();//延时时间
- txd=(i&j)/j; //发送数据
- j<<=1; //左移1位,发送下1位数据
- }
- delay_uart();//延时时间
- txd=1; //发送停止位
- }
- void send_hex(U8 C){ //串口发字节(16进制大写)
- U8 D=C>>4;
- if(D >= 0 && D <=9){
- txd_data(D+48);
- } else {
- txd_data(D+55);
- }
- D=C&15;
- if(D >= 0 && D <=9){
- txd_data(D+48);
- } else {
- txd_data(D+55);
- }
-
- }
- void send_md5(){ //将MD5通过串口发出
- U8 i;
- for(i=0;i<16;++i) send_hex(md5_l[i>>2]>>((i&3)<<3));
- }
- void main(){
- txd_data(0x4D); //发送字符串 "MD5:" (不含引号)
- txd_data(0x44);
- txd_data(0x35);
- txd_data(0x3A);
- md5(); //计算MD5
- send_md5(); //发送MD5
- while(1);
- }
复制代码
|