[单片机] md5签名算法

发布者:丹青妙手最新更新时间:2022-09-20 来源: csdn关键字:单片机  md5  签名算法 手机看文章 扫描二维码
随时随地手机看文章

#include


#include "md5.h"


#define F(x, y, z) ((x & y) | (~x & z))

#define G(x, y, z) ((x & z) | (y & ~z))

#define H(x, y, z) (x ^ y ^ z)

#define I(x, y, z) (y ^ (x | ~z))


#define ROTATE_LEFT(x, n) ((x << n) | (x >> (32 - n)))


#define FF(a, b, c, d, x, s, ac) 

    {                             

        a += F(b, c, d) + x + ac;

        a = ROTATE_LEFT(a, s);   

        a += b;                   

    }


#define GG(a, b, c, d, x, s, ac) 

    {                             

        a += G(b, c, d) + x + ac;

        a = ROTATE_LEFT(a, s);   

        a += b;                   

    }


#define HH(a, b, c, d, x, s, ac) 

    {                             

        a += H(b, c, d) + x + ac;

        a = ROTATE_LEFT(a, s);   

        a += b;                   

    }


#define II(a, b, c, d, x, s, ac) 

    {                             

        a += I(b, c, d) + x + ac;

        a = ROTATE_LEFT(a, s);   

        a += b;                   

    }


typedef struct

{

    unsigned int count[2];

    unsigned int state[4];

    unsigned char buffer[64];

} md5_ctx_t;


static md5_ctx_t md5;


static unsigned char g_md5_padding[] = {

    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

    0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};


static unsigned int x[64] = {0};



static void md5_encode(unsigned char *output, unsigned int *input, unsigned int len)

{

    unsigned int i = 0, j = 0;


    while (j < len)

    {

        output[j] = input[i] & 0xFF;

        output[j + 1] = (input[i] >> 8) & 0xFF;

        output[j + 2] = (input[i] >> 16) & 0xFF;

        output[j + 3] = (input[i] >> 24) & 0xFF;

        i ++;

        j += 4;

    }

}


static void md5_decode(unsigned int *output, unsigned char *input, unsigned int len)

{

    unsigned int i = 0, j = 0;


    while (j < len)

    {

        output[i] = (input[j]) |

                    (input[j + 1] << 8) |

                    (input[j + 2] << 16) |

                    (input[j + 3] << 24);

        i++;

        j += 4;

    }

}


static void md5_transform(unsigned int state[4], unsigned char block[64])

{

    unsigned int a = state[0];

    unsigned int b = state[1];

    unsigned int c = state[2];

    unsigned int d = state[3];


    md5_decode(x, block, 64);

    FF(a, b, c, d, x[0],   7, 0xd76aa478);  /* 1 */

    FF(d, a, b, c, x[1],  12, 0xe8c7b756);  /* 2 */

    FF(c, d, a, b, x[2],  17, 0x242070db);  /* 3 */

    FF(b, c, d, a, x[3],  22, 0xc1bdceee);  /* 4 */

    FF(a, b, c, d, x[4],   7, 0xf57c0faf);  /* 5 */

    FF(d, a, b, c, x[5],  12, 0x4787c62a);  /* 6 */

    FF(c, d, a, b, x[6],  17, 0xa8304613);  /* 7 */

    FF(b, c, d, a, x[7],  22, 0xfd469501);  /* 8 */

    FF(a, b, c, d, x[8],   7, 0x698098d8);  /* 9 */

    FF(d, a, b, c, x[9],  12, 0x8b44f7af);  /* 10 */

    FF(c, d, a, b, x[10], 17, 0xffff5bb1);  /* 11 */

    FF(b, c, d, a, x[11], 22, 0x895cd7be);  /* 12 */

    FF(a, b, c, d, x[12],  7, 0x6b901122);  /* 13 */

    FF(d, a, b, c, x[13], 12, 0xfd987193);  /* 14 */

    FF(c, d, a, b, x[14], 17, 0xa679438e);  /* 15 */

    FF(b, c, d, a, x[15], 22, 0x49b40821);  /* 16 */

 

    /* Round 2 */

    GG(a, b, c, d, x[1],   5, 0xf61e2562);  /* 17 */

    GG(d, a, b, c, x[6],   9, 0xc040b340);  /* 18 */

    GG(c, d, a, b, x[11], 14, 0x265e5a51);  /* 19 */

    GG(b, c, d, a, x[0],  20, 0xe9b6c7aa);  /* 20 */

    GG(a, b, c, d, x[5],   5, 0xd62f105d);  /* 21 */

    GG(d, a, b, c, x[10],  9, 0x2441453);   /* 22 */

    GG(c, d, a, b, x[15], 14, 0xd8a1e681);  /* 23 */

    GG(b, c, d, a, x[4],  20, 0xe7d3fbc8);  /* 24 */

    GG(a, b, c, d, x[9],   5, 0x21e1cde6);  /* 25 */

    GG(d, a, b, c, x[14],  9, 0xc33707d6);  /* 26 */

    GG(c, d, a, b, x[3],  14, 0xf4d50d87);  /* 27 */

    GG(b, c, d, a, x[8],  20, 0x455a14ed);  /* 28 */

    GG(a, b, c, d, x[13],  5, 0xa9e3e905);  /* 29 */

    GG(d, a, b, c, x[2],   9, 0xfcefa3f8);  /* 30 */

    GG(c, d, a, b, x[7],  14, 0x676f02d9);  /* 31 */

    GG(b, c, d, a, x[12], 20, 0x8d2a4c8a);  /* 32 */


    /* Round 3 */

    HH(a, b, c, d, x[5],   4, 0xfffa3942);  /* 33 */

    HH(d, a, b, c, x[8],  11, 0x8771f681);  /* 34 */

    HH(c, d, a, b, x[11], 16, 0x6d9d6122);  /* 35 */

    HH(b, c, d, a, x[14], 23, 0xfde5380c);  /* 36 */

    HH(a, b, c, d, x[1],   4, 0xa4beea44);  /* 37 */

    HH(d, a, b, c, x[4],  11, 0x4bdecfa9);  /* 38 */

    HH(c, d, a, b, x[7],  16, 0xf6bb4b60);  /* 39 */

    HH(b, c, d, a, x[10], 23, 0xbebfbc70);  /* 40 */

    HH(a, b, c, d, x[13],  4, 0x289b7ec6);  /* 41 */

    HH(d, a, b, c, x[0],  11, 0xeaa127fa);  /* 42 */

    HH(c, d, a, b, x[3],  16, 0xd4ef3085);  /* 43 */

    HH(b, c, d, a, x[6],  23, 0x4881d05);   /* 44 */

    HH(a, b, c, d, x[9],   4, 0xd9d4d039);  /* 45 */

    HH(d, a, b, c, x[12], 11, 0xe6db99e5);  /* 46 */

    HH(c, d, a, b, x[15], 16, 0x1fa27cf8);  /* 47 */

    HH(b, c, d, a, x[2],  23, 0xc4ac5665);  /* 48 */


    /* Round 4 */

    II(a, b, c, d, x[0],   6, 0xf4292244);   /* 49 */

    II(d, a, b, c, x[7],  10, 0x432aff97);   /* 50 */

    II(c, d, a, b, x[14], 15, 0xab9423a7);   /* 51 */

    II(b, c, d, a, x[5],  21, 0xfc93a039);   /* 52 */

    II(a, b, c, d, x[12],  6, 0x655b59c3);   /* 53 */

    II(d, a, b, c, x[3],  10, 0x8f0ccc92);   /* 54 */

    II(c, d, a, b, x[10], 15, 0xffeff47d);   /* 55 */

    II(b, c, d, a, x[1],  21, 0x85845dd1);   /* 56 */

    II(a, b, c, d, x[8],   6, 0x6fa87e4f);   /* 57 */

    II(d, a, b, c, x[15], 10, 0xfe2ce6e0);   /* 58 */

    II(c, d, a, b, x[6],  15, 0xa3014314);   /* 59 */

    II(b, c, d, a, x[13], 21, 0x4e0811a1);   /* 60 */

    II(a, b, c, d, x[4],   6, 0xf7537e82);   /* 61 */

    II(d, a, b, c, x[11], 10, 0xbd3af235);   /* 62 */

    II(c, d, a, b, x[2],  15, 0x2ad7d2bb);   /* 63 */

    II(b, c, d, a, x[9],  21, 0xeb86d391);   /* 64 */

    state[0] += a;

    state[1] += b;

    state[2] += c;

    state[3] += d;

}


static void md5_init(md5_ctx_t *context)

{

    context->count[0] = 0;

    context->count[1] = 0;

    context->state[0] = 0x67452301;

    context->state[1] = 0xEFCDAB89;

    context->state[2] = 0x98BADCFE;

    context->state[3] = 0x10325476;

}


static void md5_update(md5_ctx_t *context, unsigned char *input, unsigned int inputlen)

{

    unsigned int i = 0, index = 0, partlen = 0;


    index = (context->count[0] >> 3) & 0x3F;

    partlen = 64 - index;

    context->count[0] += inputlen << 3;

    if (context->count[0] < (inputlen << 3))

        context->count[1]++;

    context->count[1] += inputlen >> 29;


    if (inputlen >= partlen)

    {

        memcpy(&context->buffer[index], input, partlen);

        md5_transform(context->state, context->buffer);

        for (i = partlen; i + 64 <= inputlen; i += 64)

            md5_transform(context->state, &input[i]);

        index = 0;

    }

    else

    {

        i = 0;

    }

    memcpy(&context->buffer[index], &input[i], inputlen - i);

[1] [2]
关键字:单片机  md5  签名算法 引用地址:[单片机] md5签名算法

上一篇:[单片机] rsa2048签名算法
下一篇:[C语言] 16进制整数转字符串

推荐阅读最新更新时间:2024-11-02 10:32

51单片机-舵机入门
1.舵机准备 舵机是单片机机械控制入门必学的模块,在一些机器人关节中也是采用舵机作为控制,学习并熟练掌握使用舵机是我们对单片机的进一步认识。 所以我们不能一直局限地使用开发板进行学习,而是扩展一些电子模块来辅助我们更加深入了解单片机。所以大家需要自行购买舵机。 小型的舵机与大型的舵机控制原理几乎大同小异,考虑到经济的合理使用,我们选择小型舵机作为入门学习和简单使用即可。 常见的小型舵机型号为“9g舵机”,外观大体如下 不过笔者觉得这种型号的舵机虽然便宜且大家都普遍使用,但是这种舵机远没有金属舵机好用,所以笔者还是建议大家选择购买与上图体型差不多但价格稍贵一点的金属舵机为好,本教程使用的舵机型号如下图所示 2
[单片机]
51<font color='red'>单片机</font>-舵机入门
基于YL-236单片机实训装置的数字电压表的设计方案
一、引言 数字电压表采用数字化测量技术,可以将模拟量转换成数字量并加以显示。由于其具有测量精度高、抗干扰能力强等优点,被广泛应用于工业自动化仪表领域。下面本文就以亚龙YL-236单片机实训装置为平台,介绍数字电压表的实现方法。 二、方案总体设计 本设计选择AT89C51单片机作为核心控制器件,采用ADC0809实现A/D转换,用3位LED数码管数字来显示采集电压(范围0~5V)。设计框图如图1所示。     三、硬件部分设计 1.转换芯片ADC0809 ADC0809具有8路模拟输入端口,8路模拟开关分时选通8个模拟通道,转换后的8位数字量锁存到三态输出锁存器中,在输出允许的情况下,可以从8条数据线D7~D0上读出,并可直接与单
[电源管理]
基于YL-236<font color='red'>单片机</font>实训装置的数字电压表的设计方案
PIC单片机对机器人的控制程序设计
本文介绍项目是有关机器人控制的实现。控制部分采用PICl6F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在PIC程序编写和空间分配方面需要注意一些问题。 1、 动作标志位的使用 在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序: list P=16c73 call le
[单片机]
PIC<font color='red'>单片机</font>对机器人的控制程序设计
单片机上电后内部发生的事情
单片机上电后,如果晶振正常起震的话,cpu就会在晶振的驱动下开始工作,cpu的工作就是在每个机器周期到指定的地方提取指令,然后解析并执行,51单片机只有一个时钟源所以51单片机永远只能以一种时钟频率工作,单片机一上电单片机的频率就固定了不能更改了,上电后单片机就以固定的频率开始工作了,因此51单片机也没有配置系统时钟的寄存器,stm32等高级单片机就不一样了,这种单片机有多个时钟源,上电后单片机以某种固定的时钟频率开始工作,到指定的地址提取指令,然后解析并执行,在后面的程序中可以更改系统的工作时钟与工作频率, 除非是没有晶振提供时钟,或者是系统没有上电,否则cpu是不可能停止工作的,cpu的任务就是不停的提取指令,然后解析并执行,
[单片机]
C8051F020单片机在总磷在线自动分析仪中应用
1 概述 C8051FOXX系列单片机是Cygnal公司新推出的一种混合信号系统级单片机。该系列单片机片内含CIP-51的CPU内核,它的指令系统与MCs-51完全兼容。其中的C8051F020 单片机含有64kB片内Flash程序存储器,4352B的RAM、8个I/O端口共64根I/O口线、一个12位A/D转换器和一个8位A/D转换器以及一个双12位D/A转换器、2个比较器、5个16位通用定时器、5个捕捉/比较模块的可编程计数/定时器阵列、看门狗定时器、VDD监视器和温度传感器等部分。C8051F020单片机支持双时钟,其工作电压范围为2.7-3.6V(端口I/O,RsT和JTAC引脚的耐压为5V)。与以前的51系列单片机相比,
[单片机]
C8051F020<font color='red'>单片机</font>在总磷在线自动分析仪中应用
三杯式风速传感器液晶显示单片机程序与实验报告
一、实验目的 1.掌握三杯式风速传感器的工作原理; 2.将三杯式风速传感器测得的风速(风由风扇提供)实时显示在液晶和上位机上; 3.进一步掌握1602液晶的使用以及串口通讯; 4.规范C的书写格式。 二、实验原理 三杯式风速传感器有一个测速码盘,当码盘转动并不断地通过三杯式风速传感器内部的光电传感器后,就会产生脉冲信号,脉冲信号触发单片机产生外部中断0,外部中断0对脉冲次数进行计数,定时器0中断设定1s的时间,并获取1s内的脉冲次数,然后通过公式:(脉冲次数*7)/80.0+0.1(注意:此处的80.0不能写成80,否则将会丢失风速的小数位,因为除以80得到的是整数)就可以计算出风速,然后就可以通过单片机将风速显示在液晶和上
[单片机]
51单片机IO口组成与功能简介
1、 P1口 准双向口,各位可分开使用,某位作输入线时,该位锁存器必须为‘1’;作为输入时,可以被任何TTL电路和MOS电路所驱动,由于内部有提升电路,也可以被集电极开路或漏极开路的电路所驱动。 P1口输出时能驱动4个LSTTL负载(100uA定义为一个TTL负载的输入电流)。 P1口完全属用户使用 2、 P3口 多功能口:第一功能-I/O准双向口,与P1口相同。 第二功能:RXD、TXD、INT0、INT1、T0、T1、/WR、/RD。 某位作为第二功能输入/输出线时,该位锁存器必须保持‘1’,是输出场效应管的状态由第二功能输出决定。 3、 P2口 两个功能:1)在单片机系统无外部扩展时,作为通用I/O口;同P
[单片机]
32位微控制器 CS32G020K8U7QH丨芯海科技确认申报2024金辑奖
申请技术丨32位微控制器 CS32G020K8U7QH 申报领域丨车规级芯片 独特优势: 1.集成2个PD模块,可支持2路全功能PD 2.集成硬件CRC-32计算单元 3.FLASH存储器提供多级保护策略,确保数据安全 4.支持免拆机固件升级 应用场景: 车载PD充电、车载投屏 未来前景: 车载充电器在旅行、长途驾驶或其他需要保持设备电量的情况下非常有用,使驾驶者和乘客能够随时随地为他们的设备提供电源。近年来,车载充电器市场已经看到了快速充电技术的显著进步,如USB Power Delivery(USB PD)。据研究统计,全球车载充电器市场规模呈现稳步扩张的态势,2023年全
[汽车电子]
32位<font color='red'>微控制器</font> CS32G020K8U7QH丨芯海科技确认申报2024金辑奖
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved