md5生成一个加盐程序c语言,MD5算法的实现(C程序)

目录:

一、MD5算法介绍

1、MD5算法具体过程

2、相关说明

二、程序实现(C程序)

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

一、MD5算法介绍

1、简介

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

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

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

散列函数也叫哈希函数,哈希函数又称散列函数,杂凑函数,它是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程,哈希函数可以将任意长度的输入经过变化后得到固定长度的输出,这个固定长度的输出称为原消息的散列或消息映射。

理想的哈希函数可以针对不同的输入得到不同的输出,如果存在两个不同的消息得到了相同的哈希值,那我们称这是一个碰撞。

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

2、MD5算法具体过程

1)附加填充位

课本原话:填充一个‘1’和若干个‘0’使其长度模512与448同余,然后再将消息的真实长度以64bit表示附加在填充结果后面,从而使得消息长度恰好为512bit的整数倍。

举例说明吧:

如明文为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

4个32为寄存器,最开始存放4个固定的32位的整数参数,即初始链接变量,这些参数用于第1轮运算。

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

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

课本原话:MD5算法的分组处理(压缩函数)与分组密码的分组处理相似。它由4轮组成,512bit的消息分组Mi被分成16个子分组(每个子分组为32bit)参与每轮16步函数运算,即每轮包括16个步骤。每步的输入是4个32bit的链接变量(插句话~也就是A、B、C、D)和一个32bit的消息分组(是Mi哦~~),输出为32位值。经过4轮共64步后,得到的4个寄存器值分别与输入链接变量(也就是初始的A、B、C、D)进行模加,即是当前消息的中间散列值。

明文是iscbupt的Mi如下:

M0:01101001

01110011 01100011 01100010

M1:01110101

01110000 01110100

10000000

M2:00000000 00000000 00000000

00000000

................

M14:00111000 00000000 00000000

00000000

M15:00000000 00000000 00000000

00000000

4)步函数

所有大轮(上文所说的4轮)里的所有小轮(16轮)都是同一个步函数A=B+((A+f(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程序)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值