一、环境说明
操作系统:window10
编程语言:Java (JDK版本 11.0.1)
使用IDE:Intellij IDEA
二、算法原理概述
整个MD5(信息摘要算法5)的基本过程可以概括为以下几个步骤:
-
填充:消息为 K K K bits的原始消息数据尾部填充长度为 P P P bits的标识 1000...0   1 ≤ P ≤ 512 1000...0 \, 1\le P \le 512 1000...01≤P≤512 (至少要填充一个bit) 。使得填充后的消息位数满足 K + P ≡ 448 ( m o d   512 ) K + P \equiv 448 (mod \, 512) K+P≡448(mod512) (注:当 K ≡ 448 ( m o d   512 ) K \equiv 448(mod \, 512) K≡448(mod512))时, P = 512 P = 512 P=512。
填充好的消息尾部需要在附加 K K K值的低64位即 K   m o d   2 64 K \, mod \,2^{64} Kmod264。 最终结果得到 K + P + 64 ≡ 0 ( m o d   512 ) K + P + 64 \equiv 0 (mod \, 512) K+P+64≡0(mod512)的填充消息。
-
分块:把填充之后的消息结果分割为 L L L个 512 − b i t 512-bit 512−bit 分组: Y 0 . . Y L − 1 Y_0..Y_{L-1} Y0..YL−1 。也是 L L L个64字节的分组。
-
缓冲区初始化:初始化一个 128 − b i t 128-bit 128−bit的MD缓冲区,记为 C V q CV_q CVq,表示成4个 32 − b i t ( 4 个 b y t e ) 32-bit (4个byte) 32−bit(4个byte) 的寄存器 ( A , B , C , D ) (A,B,C,D) (A,B,C,D); C V 0 = I V ( I V 为 16 进 制 初 值 ) CV_0 = IV (IV为16进制初值) CV0=IV(IV为16进制初值)。
-
循环压缩 :对L个消息分组 Y q ( q = 0 , 1 , . . . L − 1 ) Y_q(q = 0, 1,...L-1) Yq(q=0,1,...L−1) ,逐个经过4重循环的压缩算法。表示为:
C V 0 = I V CV_0 = IV CV0=IV
C V i = H M D 5 ( C V i − 1 , Y i ) CV_i = H_{MD5}(CV_{i-1}, Y_i) CVi=HMD5(CV