Blowfish演算法中子金鑰是如何生成的?
Blowfish是一種對稱分組密碼演算法,由布魯斯·施奈爾於1993年12月發明。Blowfish是DES或IDEA的替代方案。Blowfish是最流行的Feistel網路密碼之一。Blowfish演算法具有64位塊大小和可變金鑰長度(從42位到448位)。該演算法包括金鑰擴充套件部分和資料加密部分。
Blowfish將最多448位的金鑰建立為多個子金鑰陣列,總共1042個32位值或4168位元組。它是一個16輪Feistel系統,支援非常高的金鑰相關S盒並啟用16次迭代。
每一輪都使用金鑰和資料相關的替換以及金鑰相關的置換進行調整。32位字和XOR運算透過加法實現。有一個P陣列和四個32位的S盒。
P陣列包含18個32位的子金鑰,而每個S盒包含256個條目。輸入是一個64位資料元素。子金鑰生成的流程如下:
Blowfish使用了大量的子金鑰。這些金鑰必須在加密和解密出現之前準備好。金鑰大小欄位從32位到448位。換句話說,金鑰大小範圍從1到14個字,每個字包含一個32位的字。這些金鑰按如下方式儲存在陣列中:
K1、K2、…、Kn,其中1 ≤ n ≤ 14
包含18個32位子金鑰的P陣列的概念:
P1、P2、……、P18。
P陣列的建立將在後面描述。
有四個32位S盒,每個包含256個條目:
S1, 0、S1, 1… S1, 255
S2, 0、S2, 1… S2, 255
S3, 0、S3, 1… S3, 255
S4, 0、S4, 1… S4, 255
P陣列的建立將在後面定義。
可以先初始化P陣列,然後初始化四個S盒,使用一個固定的字串。
P陣列和四個S盒表示為Pi的十六進位制數字。
可以實現P陣列和K陣列的按位XOR運算,重複使用金鑰位所需的K陣列中的字(即,P1 XOR(金鑰的32位),P2 XOR(金鑰的32位)。
可以加密64位塊,並使用以下加密過程來使用通用的P和S陣列加密全零資料。
可以使用加密的輸出替換p1和p2,新的輸出稱為p1和p2。
可以使用當前的P盒和S盒加密步驟3的輸出,並使用加密後的文字替換p3和p4,新的輸出稱為p3和p4。
可以重複以下步驟,直到獲取P陣列的所有元素,即P1、P2。