数字签名MD4、MD5
在本文中:
- 模二加,记为 ⨁ \bigoplus ⨁:是二进制位的异或操作。如1模二加1和0模二加1都等于0;1模二加0等于1;
- 模 2 32 加 模2^{32}加 模232加,计为 + + +:意思是普通加法的结果再进行 模 2 32 加 模2^{32}加 模232加计算。
如 模 2 4 加 模2^4加 模24加. 若,a = 14,b=15,(+)表示 模 2 4 加 模2^4加 模24加
则, a ( + ) b = ( a + b ) m o d 2 4 = ( 14 + 15 ) m o d 16 = 29 m o d 16 = 13 a(+)b=(a+b)\;mod \;2^4 = (14+15)mod 16 = 29\;mod\;16=13 a(+)b=(a+b)mod24=(14+15)mod16=29mod16=13
Hash函数
密码学中的Hash函数是将任意长度的消息压缩到某一固定长度的消息摘要的单向函数。它主要用于数字签名和消息的完整性检测。
- 经过hash函数之后的值不可以再恢复成原来的消息;
- 且任意两个不同的消息不可能得到相同的hash值。
- 进入hash函数之前,变更一个字节会导致其hash值较之前截然不同。
MD4
MD5是在MD4的基础上进行更改的,所以二者思想和算法相似。
总 体 步 骤 : \color{blue}总体步骤: 总体步骤:
- 数字填充,将输入的数据填充为512位的倍数。
- 分组处理,每512位(64字节)位一组,按组进行处理。
- 处理结束后便得到128位的结果。
1 、 数 字 填 充 : \color{blue}1、数字填充: 1、数字填充:
该步骤仅作用在最后一组不满512位的那一组。
- 在左边填充1
- 之后一直补k个0,使得(n+1+k) ≡ \equiv ≡ 448 m o d mod mod 512
- 最后追加64位的整数,其内容是数据所占的比特数的大小。
2 、 分 组 处 理 : \color{blue}2、分组处理: 2、分组处理:
- 把每一个分组X(64个字节)分为16个子分块 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15](每个有4个字节)
- 将 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15] 依次同四个寄存器A.B.C.D进行三轮不同的运算。(A、B、C、D都有初始值。)
即, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]先和ABCD进行第一轮运算,(一轮刚好有16个运算,对应着16个子分块x,以下类似。)
之后, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]再与ABCD进行第二轮运算,
最后, x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]与ABCD进行第三轮运算。 - 每一轮有16个运算,使得 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]每个参加一次运算。
- 每一个运算又分为4步。(F函数、与子分块模 2 32 2^{32} 232加、与常数k模 2 32 2^{32} 232加、循环左移)
下图表示每一轮中每一次的运算过程。
上图中,
F函数每一轮会有所不同。
“数据子分块”会随着16次运算的不同,取到 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]。
常量k每一轮也会不同。
循环左移操作,每一轮都有他自己的规则。
简 单 讲 , 每 一 轮 中 的 每 一 次 运 算 都 不 相 同 。 简单讲,每一轮中的每一次运算都不相同。 简单讲,每一轮中的每一次运算都不相同。
在 图 中 也 可 以 注 意 到 , 将 运 算 后 的 值 给 了 下 一 次 的 B , 原 B 给 了 C , 原 D 给 了 A 。 \color{red}在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。 在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。
a) F函数:
第一轮: f ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ‾ ⋀ Z ) f(X,Y,Z)=(X\bigwedge Y) \bigvee(\overline{X}\bigwedge Z)\; f(X,Y,Z)=(X⋀Y)⋁(X⋀Z) (注: X ‾ \overline{X} X表示X的补。)
第二轮: g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ⋀ Z ) ⋁ ( Y ⋀ Z ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z)\; g(X,Y,Z)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z)
第三轮: h ( X , Y , Z ) = X ⨁ Y ⨁ Z h(X,Y,Z)=X\bigoplus Y\bigoplus Z\; h(X,Y,Z)=X⨁Y⨁Z (注:“ ⨁ \bigoplus ⨁”为模二加操作)
b) 与子分块相加:(模 2 32 2^{32} 232加)
每一轮的子分块参加运算的顺序都不相同。
c) 与常数k(16进制)相加:(模 2 32 2^{32} 232加)
第一轮:0
第二轮:5A827999
第三轮:6ED9EDA1
d) 循环左移:
第一轮:第一次运算左移3位,第二次运算左移7位,第三次运算左移11位,第四次运算左移19位,第五次运算同第一次运算一样左移3位,依次往复循环。
第二轮:以左移3、5、9、13进行循环
第三轮:以3、9、11、15循环左移
A、B、C、D的初始值
A:67452301 (4byte)
B:EFCDAB89 (4byte)
C:98BADCFE (4byte)
D:10325476 (4byte)
先 介 绍 生 成 流 程 , 3 轮 的 16 次 运 算 放 在 最 后 面 给 出 。 \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\color{gray}先介绍生成流程,3轮的16次运算放在最后面给出。 先介绍生成流程,3轮的16次运算放在最后面给出。
3 、 得 到 128 b i t 的 输 出 : \color{blue}3、得到128bit的输出: 3、得到128bit的输出:
经过3轮最终得到的A、B、C、D与初值A、B、C、D分别进行 模 2 32 加 模2^{32}加 模232加运算后,将得到的结果进行合并,就得到了最终的128位(16字节)。
MD5
MD5和MD4的核心思想和算法都是一样的,二者的主要区别在于:
- 增加第四轮F函数,为: I ( X 、 Y 、 Z ) = ( X ⋁ Z ‾ ) ⨁ Y I(X、Y、Z)=(X\bigvee {\overline{Z}})\bigoplus Y\; I(X、Y、Z)=(X⋁Z)⨁Y (注: X ‾ \overline{X} X表示X的补。)
- 第二轮F函数由 g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( X ⋀ Z ) ⋁ ( Y ⋀ Z ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z) g(X,Y,Z)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z) 变为 g ( X , Y , Z ) = ( X ⋀ Y ) ⋁ ( Y ⋀ Z ‾ ) g(X,Y,Z)=(X\bigwedge Y) \bigvee(Y\bigwedge \overline{Z}) g(X,Y,Z)=(X⋀Y)⋁(Y⋀Z)
- 第二、三轮的子分块 x [ 0 ] 到 x [ 15 ] x_{[0]}到x_{[15]} x[0]到x[15]的次序被改变
- 第一轮的移位数发生改变
- 每一步都有一个唯一的加法常量k(16步有16个)
- 每一步都要加上上一步的结果
总结
最后的最后,给出MD4的3轮16次运算过程
第一轮:
- A = ( A + f ( B , C , D ) + x [ 0 ] ) < < 3 A=(A+f(B,C,D)+x_{[0]})<<3 A=(A+f(B,C,D)+x[0])<<3
解释:
初始 A \;A\; A与经过经过第一轮 F 函 数 \;F函数\; F函数的 B , C , D \;B,C,D\; B,C,D进行 模 2 32 加 \;模2^{32}加 模232加,
得到的结果再与数据子分块 x [ 0 ] x_{[0]} x[0]进行 模 2 32 加 \;模2^{32}加 模232加,
得到的结果再向左移动 3 \;3\; 3位,
将最终得到的结果作为 A \;A\; A进行下一次运算。
- D = ( D + f ( A , B , C ) + x [ 1 ] ) < < 7 D=(D+f(A,B,C)+x_{[1]})<<7 D=(D+f(A,B,C)+x[1])<<7
- C = ( D + f ( D , A , B ) + x [ 2 ] ) < < 17 C=(D+f(D,A,B)+x_{[2]})<<17 C=(D+f(D,A,B)+x[2])<<17
- B = ( B + f ( C , D , A ) + x [ 3 ] ) < < 19 B=(B+f(C,D,A)+x_{[3]})<<19\\\; B=(B+f(C,D,A)+x[3])<<19
- A = ( A + f ( B , C , D ) + x [ 4 ] ) < < 3 A=(A+f(B,C,D)+x_{[4]})<<3 A=(A+f(B,C,D)+x[4])<<3
- D = ( D + f ( A , B , C ) + x [ 5 ] ) < < 7 D=(D+f(A,B,C)+x_{[5]})<<7 D=(D+f(A,B,C)+x[5])<<7
- C = ( D + f ( D , A , B ) + x [ 6 ] ) < < 17 C=(D+f(D,A,B)+x_{[6]})<<17 C=(D+f(D,A,B)+x[6])<<17
- B = ( B + f ( C , D , A ) + x [ 7 ] ) < < 19 B=(B+f(C,D,A)+x_{[7]})<<19\\\; B=(B+f(C,D,A)+x[7])<<19
- A = ( A + f ( B , C , D ) + x [ 8 ] ) < < 3 A=(A+f(B,C,D)+x_{[8]})<<3 A=(A+f(B,C,D)+x[8])<<3
- D = ( D + f ( A , B , C ) + x [ 9 ] ) < < 7 D=(D+f(A,B,C)+x_{[9]})<<7 D=(D+f(A,B,C)+x[9])<<7
- C = ( D + f ( D , A , B ) + x [ 10 ] ) < < 17 C=(D+f(D,A,B)+x_{[10]})<<17 C=(D+f(D,A,B)+x[10])<<17
- B = ( B + f ( C , D , A ) + x [ 11 ] ) < < 19 B=(B+f(C,D,A)+x_{[11]})<<19\\\; B=(B+f(C,D,A)+x[11])<<19
- A = ( A + f ( B , C , D ) + x [ 12 ] ) < < 3 A=(A+f(B,C,D)+x_{[12]})<<3 A=(A+f(B,C,D)+x[12])<<3
- D = ( D + f ( A , B , C ) + x [ 13 ] ) < < 7 D=(D+f(A,B,C)+x_{[13]})<<7 D=(D+f(A,B,C)+x[13])<<7
- C = ( D + f ( D , A , B ) + x [ 14 ] ) < < 17 C=(D+f(D,A,B)+x_{[14]})<<17 C=(D+f(D,A,B)+x[14])<<17
- B = ( B + f ( C , D , A ) + x [ 15 ] ) < < 19 B=(B+f(C,D,A)+x_{[15]})<<19\\\; B=(B+f(C,D,A)+x[15])<<19
第二轮:
A = ( A + g ( B , C , D ) + x [ 0 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[0]}+5A827999)<<3 A=(A+g(B,C,D)+x[0]+5A827999)<<3
D = ( D + g ( A , B , C ) + x [ 4 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[4]}+5A827999)<<5 D=(D+g(A,B,C)+x[4]+5A827999)<<5
C = ( C + g ( D , A , B ) + x [ 8 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[8]}+5A827999)<<9 C=(C+g(D,A,B)+x[8]+5A827999)<<9
B = ( B + g ( C , D , A ) + x [ 12 ] + 5 A 827999 ) < < 13 B=(B+g(C,D,A)+x_{[12]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[12]+5A827999)<<13
A = ( A + g ( B , C , D ) + x [ 1 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[1]}+5A827999)<<3 A=(A+g(B,C,D)+x[1]+5A827999)<<3
D = ( D + g ( A , B , C ) + x [ 5 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[5]}+5A827999)<<5 D=(D+g(A,B,C)+x[5]+5A827999)<<5
C = ( C + g ( D , A , B ) + x [ 9 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[9]}+5A827999)<<9 C=(C+g(D,A,B)+x[9]+5A827999)<<9
B = ( B + g ( C , D , A ) + x [ 13 ] + 5 A 827999 ) < < 13 B=(B+g(C,D,A)+x_{[13]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[13]+5A827999)<<13
A = ( A + g ( B , C , D ) + x [ 2 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[2]}+5A827999)<<3 A=(A+g(B,C,D)+x[2]+5A827999)<<3
D = ( D + g ( A , B , C ) + x [ 6 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[6]}+5A827999)<<5 D=(D+g(A,B,C)+x[6]+5A827999)<<5
C = ( C + g ( D , A , B ) + x [ 10 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[10]}+5A827999)<<9 C=(C+g(D,A,B)+x[10]+5A827999)<<9
B = ( B + g ( C , D , A ) + x [ 14 ] + 5 A 827999 ) < < 13 B=(B+g(C,D,A)+x_{[14]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[14]+5A827999)<<13
A = ( A + g ( B , C , D ) + x [ 3 ] + 5 A 827999 ) < < 3 A=(A+g(B,C,D)+x_{[3]}+5A827999)<<3 A=(A+g(B,C,D)+x[3]+5A827999)<<3
D = ( D + g ( A , B , C ) + x [ 7 ] + 5 A 827999 ) < < 5 D=(D+g(A,B,C)+x_{[7]}+5A827999)<<5 D=(D+g(A,B,C)+x[7]+5A827999)<<5
C = ( C + g ( D , A , B ) + x [ 11 ] + 5 A 827999 ) < < 9 C=(C+g(D,A,B)+x_{[11]}+5A827999)<<9 C=(C+g(D,A,B)+x[11]+5A827999)<<9
B = ( B + g ( C , D , A ) + x [ 15 ] + 5 A 827999 ) < < 13 B=(B+g(C,D,A)+x_{[15]}+5A827999)<<13\\\; B=(B+g(C,D,A)+x[15]+5A827999)<<13
第三轮:
A = ( A + h ( B , C , D ) + x [ 0 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[0]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[0]+6ED9EDA1)<<3
D = ( D + h ( A , B , C ) + x [ 8 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[8]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[8]+6ED9EDA1)<<9
C = ( C + h ( D , A , B ) + x [ 4 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[4]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[4]+6ED9EDA1)<<11
B = ( B + h ( C , D , A ) + x [ 12 ] + 6 E D 9 E D A 1 ) < < 15 B=(B+h(C,D,A)+x_{[12]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[12]+6ED9EDA1)<<15
A = ( A + h ( B , C , D ) + x [ 2 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[2]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[2]+6ED9EDA1)<<3
D = ( D + h ( A , B , C ) + x [ 10 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[10]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[10]+6ED9EDA1)<<9
C = ( C + h ( D , A , B ) + x [ 6 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[6]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[6]+6ED9EDA1)<<11
B = ( B + h ( C , D , A ) + x [ 14 ] + 6 E D 9 E D A 1 ) < < 15 B=(B+h(C,D,A)+x_{[14]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[14]+6ED9EDA1)<<15
A = ( A + h ( B , C , D ) + x [ 1 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[1]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[1]+6ED9EDA1)<<3
D = ( D + h ( A , B , C ) + x [ 9 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[9]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[9]+6ED9EDA1)<<9
C = ( C + h ( D , A , B ) + x [ 5 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[5]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[5]+6ED9EDA1)<<11
B = ( B + h ( C , D , A ) + x [ 13 ] + 6 E D 9 E D A 1 ) < < 15 B=(B+h(C,D,A)+x_{[13]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[13]+6ED9EDA1)<<15
A = ( A + h ( B , C , D ) + x [ 3 ] + 6 E D 9 E D A 1 ) < < 3 A=(A+h(B,C,D)+x_{[3]}+6ED9EDA1)<<3 A=(A+h(B,C,D)+x[3]+6ED9EDA1)<<3
D = ( D + h ( A , B , C ) + x [ 11 ] + 6 E D 9 E D A 1 ) < < 9 D=(D+h(A,B,C)+x_{[11]}+6ED9EDA1)<<9 D=(D+h(A,B,C)+x[11]+6ED9EDA1)<<9
C = ( C + h ( D , A , B ) + x [ 7 ] + 6 E D 9 E D A 1 ) < < 11 C=(C+h(D,A,B)+x_{[7]}+6ED9EDA1)<<11 C=(C+h(D,A,B)+x[7]+6ED9EDA1)<<11
B = ( B + h ( C , D , A ) + x [ 15 ] + 6 E D 9 E D A 1 ) < < 15 B=(B+h(C,D,A)+x_{[15]}+6ED9EDA1)<<15\\\; B=(B+h(C,D,A)+x[15]+6ED9EDA1)<<15
数字签名MD4、MD5相关推荐
- 如何利用openssl来计算md4, md5, sha1, sha256, sha384, sha512等常用哈希值?
转载:http://blog.csdn.net/stpeace/article/details/41922115 openssl的库的用法, 前面已经介绍了, 所以不再啰嗦, 直接给出代码: [cpp ...
- Hash MSDN MD4 MD5 SHA1 CRC 详细解释
让我们先来了解一些基本知识,了解hash. Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image), ...
- C#毕业设计——基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)——数字签名系统
基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于MD5+RSA的数字签名设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告PPT模板及论 ...
- [C++杂谈]:MD5以及XML数字签名
背景:工程发布到生产,在研发介入阶段可以修改相关配置文件,但当研发退出,由生产完全接手的时候,将禁止修改相关配置文件.因此需要工程能够校验相应的文件是否是和发布时保持一致.当前考虑将需要校验的文件的M ...
- 【实习项目记录】(一)加密算法MD5和RSA
什么是md5加密? MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA ...
- java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法
概述 信息安全基本概念: BASE64 编码格式 Base58 编码 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm, ...
- iOS MD5 (消息摘要算法5)
一.MD5定义 MD5即Message-Digest Algorithm 5(消息-摘要算法5),为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护(又译摘要算法.哈希算法),主 ...
- md5加密算法的C(C++)代码实现
算法的应用 md5的典型应用是对一段信息(message)产生信息摘要(message-digest),以防止被篡改.比如,在unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的 ...
- 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)
一.引言 最近看了媒体的一篇关于"网络上公开叫卖个人隐私信息"报导,不法分子通过非法手段获得的个人隐私信息,其详细.准确程度简直令人瞠口结舌.在互联网飞速发展的现在,我们不难想到, ...
最新文章
- 中南林科大c语言程序设计,2017年中南林业科技大学计算机与信息工程学院802C语言与数据结构之C程序设计考研题库...
- Scala 空返回值Unit
- Java提高篇 —— Java内部类详解
- sql server 分页
- 微服务架构设计总结实践
- 学习日报 day02 java的语法骨架 myeclipse编辑java代码
- 【dlib库】进行人脸检测+人脸关键点检测+人脸对齐
- 那些云中的负载均衡器——Azure、AWS和NetScaler
- div css将文字居中显示图片,css文字居中、图片居中、div居中解决方案
- macos删除快捷键的各种区别用法
- ZOJ3953 Intervals
- c#值类型,引用练习,ref,out
- R语言本地安装包教程
- Java解析HTML之NekoHTML
- python自动添加微信好友_Python实现微信自动通过好友申请并发送加群链接!
- 软件测试工程师太累了?
- 物理学经济学java周易_八竿子打不着?——物理学和经济学的相似相通之处
- 原生Android应用接入flutter(详细步骤)
- Just some wierd thoughts
- 组合Combination 分布数组计算
热门文章
- 定义圆类和圆柱类,打印圆的体积
- Android 滑动侧边栏(Sliding Menu)第一种实现 - 1 手动滚动+自动滚动
- 记录-《工厂青年》读后感
- C++类与对象(上)
- html+css+js+Hbuilder开发一款安卓APP,根本不用学Android开发!
- linux ftp进程,LinuxFTP ftp服务器设计成为一个守护进程 - 下载 - 搜珍网
- Pyhthon3《机器学习实战》学习笔记二:决策树
- 好消息! 可帮您创业东大门女装。
- 疾风计划:离散数学丨第一章_命题逻辑
- Shell - mv