1. 程式人生 > >Java實現MD5演算法過程,並利用自帶MD5函式進行對比校驗

Java實現MD5演算法過程,並利用自帶MD5函式進行對比校驗

文章目錄

一、環境說明

作業系統:window10

程式語言:Java (JDK版本 11.0.1)

使用IDE:Intellij IDEA

二、演算法原理概述

在這裡插入圖片描述

整個MD5(資訊摘要演算法5)的基本過程可以概括為以下幾個步驟:

  1. 填充:訊息為 K

    K bits的原始訊息資料尾部填充長度為 P P bits的標識 1000...0   1
    P 512 1000...0 \, 1\le P \le 512
    (至少要填充一個bit) 。使得填充後的訊息位數滿足 K
    + P 448 ( m o d   512 ) K + P \equiv 448 (mod \, 512)
    (注:當 K 448 ( m o d   512 ) K \equiv 448(mod \, 512) )時, P = 512 P = 512

    填充好的訊息尾部需要在附加 K K 值的低64位即 K   m o d   2 64 K \, mod \,2^{64} 。 最終結果得到 K + P + 64 0 ( m o d   512 ) K + P + 64 \equiv 0 (mod \, 512) 填充訊息

  2. 分塊:把填充之後的訊息結果分割為 L L 512 b i t 512-bit 分組: Y 0 . . Y L 1 Y_0..Y_{L-1} 。也是 L L 個64位元組的分組。

  3. 緩衝區初始化:初始化一個 128 b i t 128-bit 的MD緩衝區,記為 C V q CV_q ,表示成4個 32 b i t ( 4 b y t e ) 32-bit (4個byte) 的暫存器 ( A , B , C , D ) (A,B,C,D) C V 0 = I V ( I V 16 ) CV_0 = IV (IV為16進位制初值)

    在這裡插入圖片描述

  4. 迴圈壓縮 :對L個訊息分組 Y q ( q = 0 , 1 , . . . L 1 ) Y_q(q = 0, 1,...L-1) ,逐個經過4重迴圈的壓縮演算法。表示為:

    C V 0 = I V CV_0 = IV

    C V i = H M D 5 ( C V i 1 , Y i ) CV_i = H_{MD5}(CV_{i-1}, Y_i)

  5. 得出結果:最後一個訊息分組經過 H M D 5 H_{MD5} 壓縮得到MD5結果為MD值,即 M D = C V L MD = CV_L

整個加密演算法的基本流程如上。而整個加密演算法的核心步驟在於 H M D 5 H_{MD5} 壓縮函式流程如下。

在這裡插入圖片描述

  1. 總控流程 H M D 5 H_{MD5} C V CV 輸入128位,分配到緩衝區 ( A , B , C , D ) (A,B,C,D) ,從訊息分組輸入512位 Y q Y_q ,經過4輪迴圈,每次迴圈16次迭代(共64次迭代)之後,得到用於下一輪的輸入的 C V CV 值。如果 Y q = Y L 1 Yq = Y_{L-1} ,即輸出MD5值。

  2. 每輪迴圈:結合T表元素 T [ ] T[] 和訊息分組的不同部分 X [ ] X[] ,每輪固定不同的生成函式 F G H I F,G,H,I 做16次迭代運算,生成下一輪迴圈的輸入。

  3. 四個生成函式 F , G , H , I F,G,H,I

在這裡插入圖片描述

  1. 訊息分組的內容:需要靠下標k來進行運算得到參與 迭代的訊息部分,代表當前處理訊息分組的第 k k ( k = 0...15 ) 32 (k = 0...15)32 位字,即 M q × 16 + k M_{q × 16 + k}

    在各輪迴圈中第 i i 次迭代 ( i = 1..16 ) (i = 1..16) 使用的 X [ k ] X[k] 的確定:

    ​ 設 j = i 1 j = i -1
    ◌ 第1輪迭代: k = j k = j .
    順序使用 $ X[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15]$
    ◌ 第2輪迭代: k = ( 1 + 5 j ) m o d 16 k = (1 + 5j) mod 16 .
    順序使用 X [ 1 , 6 , 11 , 0 , 5 , 10 ,