首页 > 编程知识 正文

md5算法原理及其实现(md5解密算法)

时间:2023-05-04 19:14:53 阅读:75908 作者:2765

目录:

一、MD5算法介绍

1、MD5算法的具体过程

2、相关说明

二、程序实现(c程序) )。

------------- -请参阅

一、MD5算法介绍

1、个人资料

md5加密是一种不可逆的加密算法。 MD5加密工具

MD5不可逆的原因是,由于是散列函数并且使用了散列算法,因此在计算中丢失了部分原文信息。 一个MD5理论上可以对应多个原文。 因为MD5是有限的,但原文是无限的。

MD5代码128位二进制数,最多可能有2^128种,但字符串的数量明显可能无数。

散列函数也称为散列函数,散列函数也称为散列函数、散列函数,是明文到密文的不可逆的映射。 只有加密过程没有解密过程,而且散列函数可以通过改变任意长度的输入来获得固定长度的输出。 将该固定长度的输出称为原始消息的散列或消息映射。

理想散列函数可以对于不同的输入获得不同的输出,如果存在两个不同的消息获得相同的散列值,则其被称为冲突。

------------- -请参阅

2、MD5算法的具体过程

1 )追加充填钻头

教科书原文:将“1”和几个“0”填充为长度512和448相等,然后将消息的真实长度添加到用64位填充的结果中,使消息的长度正好是512位的整数倍。

举个例子:

例如,用明文表示iscbupt

其16ascII码为105、115、99、98、117、112、116,转换为二进制后为01101001

01110011 01100011 01100010 01110101 01110000

01110100,这是长度为56,为了使其长度的模具512和448相同,需要补充‘1’和391个‘0’。 由于消息长度为56,因此64位二进制文件表示为00110000

00到00 (56个‘0’)。 到现在为止512位全部填充完毕~

2 )初始化链接变量

教科书原文: MD5有a、b、c、d

四个32是寄存器,首先存储四个固定的32位整数参数,即初始链路变量,这些参数用于第一次运算。

A=0x12345678,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210

3 )分组处理(迭代压缩) )。

文本原语: MD5算法的分组处理(压缩函数)类似于分组密码的分组处理。 它由四个回合构成,512比特的消息分组Mi被分成16个子组,每个子组为32比特。 每个回合参加16个步骤的函数运算,即每个回合包括16个步骤。 每一步的输入是4个32位链接变量(插件~即a、b、c、d )和1个32位消息组(Mi哦~~),输出是32位值。 在四个总共64个步骤之后,将得到的四个寄存器值分别加到输入链路变量(即初始a、b、c和d )上,作为当前消息的中间哈希值。

明文为iscbupt的Mi如下。

M0:01101001

01110011 01100011 01100010

M1:01110101

01110000 01110100

10000000

m 2:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000

...

m 14:001100000000000000000000000000000000000

00000000

m 1533600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000

4 )阶跃函数

所有大轮(上述4轮)中的所有小轮) 16轮)是相同的阶跃函数a=b () af ) b,c,d ) M[j] T[i] ) ) )。

完成小倒圆角后,如果将a分配给b、b分配给c、c分配给d,并将原始d分配给a,则已分配的a、b、c、d可以进行下一个倒圆角。

接下来,对上述j、左移步数step、T[i]取法进行说明.

第一回合:

j在这个大圈里从0到15依次取

1、5、9、13号小圈step=7; 第2、6、10、14小轮step=12; 第3、7、11、15小轮step=17; 4、8、12、16号小圈step=22

第二大圈:

j的取法是----1、6、11、0、5、10、15、4、9、14、3、8、13、2,

7,12

1、5、9、13号小圈step=5; 第2、6、10、14小轮step=9; 第3、7、11、15小轮step=14; 4、8、12、16号小圈step=20

第三回合:

j的顺序是-----5,

8, 11,

14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15,

2

第1、5、9、13小轮step=4;第2、6、10、14小轮step=11;第3、7、11、15小轮step=16;第4、8、12、16小轮step=23

第四大轮:

j的取值顺序为-----0, 7, 14, 5, 12, 3, 10, 1, 8,

15, 6, 13, 4, 11, 2, 9

第1、5、9、13小轮step=6;第2、6、10、14小轮step=10;第3、7、11、15小轮step=15;第4、8、12、16小轮step=21

T[i]=

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

--------------------------------------------------------

3、相关说明

①.MD5加密算法里面的所有模加都是模2的32次加,而不是模2加。

举例说明下模2的32次加:如11101000......(省略了24个‘0’)+01110000.........(省略了24个‘0’)=101011000.......(省略了24个‘0’),共33位,取后32位最终得到01011000........(省略了24个‘0’)。

②.初始的A、B、C、D 4个链接变量与M[j]在进入步函数前要先经过大小端处理,T[i]不需要。

③.位数填充时(64bit),若长度的二进制位数不足,需要在二进制前补齐至8的整数倍而不是4的整数倍。

如400=110010000补齐后是00000001 10010000而不是00011001 00000000

④.大小端处理不是单纯指12345678->78563412,之所以有前面这种变换,是因为12、34、56、78分别表示4个十进制数,也就是说表示第1个十进制数的十六进制数经过转换放在最后,第2个放在第1个前。。当1234表示第1个十进制数、5678表示第2个十进制数时,12345678->56781234而不是78563412。

如:明文长度为400,M[14]为0x01900000,转换后为0x00000190而不是0x00009001

------------------------------------------------------------------------------------------------------------

二、程序实现(C程序)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。