密碼學 - SM4 加密演算法



SM4 方法是第一個商業化的分組密碼演算法,由中國於 2006 年以 SMS4 的名稱釋出。SM4 方法用於中國無線區域網 WAPI(有線認證和隱私基礎設施)的國家標準。WAPI 成為中國的強制性國家標準。

從安全性和通訊效能的角度來看,WAPI 是通訊基礎設施的絕佳解決方案。本工作在乙太網加密系統中使用 SM4 演算法。

SM4 的結構

SM4 演算法表示標準的 Feistel 結構。SM4 演算法的輸入、輸出和金鑰均為 128 位。它們被分成四個部分,每個部分有 32 位,稱為字。SM4 演算法包含 32 輪相同的輪函式。加密和解密的結構相同。唯一執行的操作是異或、迴圈移位和 S 盒應用。用於解密的金鑰與用於加密的金鑰相同,但順序相反。

SM4 方法易於在軟體和硬體中實現。它還具有廣泛的應用。

一個新的使用 SM4 作為基本演算法的 f8 金鑰流生成器可以安全地用於 3G 通訊系統。SM4 演算法在 MicroBlaze 軟核的嵌入式處理器中以硬體和軟體的方式共同設計,以便在設計加密通訊裝置時提供靈活性。SMS4 演算法還在 Java 卡上進行了設計和實現。

SM4 Encryption Algorithm

金鑰和金鑰引數

加密金鑰長度為 128 位,表示為 MK=(MK0, MK1, MK2, MK3),其中 MKi(i=0, 1, 2, 3)} 是一個 32 位字。輪金鑰表示為 (rk0, rk1,...., rk31),其中每個 rki (i=0,..., 31)} 表示一個字。它是使用加密金鑰和以下引數生成的:

  • FK=(FK0, FK1, FK2, FK3)
  • CK=(CK0, CK1,..., CK31)

FKi 和 CKi 是用於生成輪金鑰的字。

輪函式

每個輪函式都基於前四個輪輸出計算。Xi,Xi+1,Xi+2,Xi+3 使得:

Xi+4 = Xi⊕ F(Xi+1oplus Xi + 2⊕ Xi + 3⊕ rki),其中 F 是一個由非線性變換、S 盒和線性變換 L 組成的替換函式。

S 盒

S 盒對於 8 位輸入和輸出是固定的,表示為 Sbox()。與 AES 一樣,S 盒使用 GF(28) 上的乘法逆元。仿射變換和多項式基與 AES 不同,但是由於仿射同構,它們可以使用 AES Rijndael S 盒快速計算。

它是如何工作的?

SM4 演算法對資料進行混淆,使其在沒有特殊金鑰的情況下無法理解。它使用 128 位塊進行操作,用於混淆和解混淆資料的金鑰也是 128 位。這些塊和金鑰被分成四個部分,每個部分有 32 位。

該方法透過在 32 個迴圈中混合和修改位來混淆資訊。這個過程對於混淆和解混淆都是相同的,但是解混淆的階段順序不同。

該方法只執行三件事:使用 XOR(類似於數字“或”運算)組合位、迴圈移位位以及使用稱為 S 盒的特定函式。

以下是一些關鍵術語:

  • 字和位元組 - 它們只是用於描述位簇的術語。
  • S 盒 - 它類似於秘密程式碼,將一組位轉換為另一組位。
  • 基本操作 - 這些是演算法的核心函式,例如組合和移動位。

混淆金鑰或 MK 由四個部分組成。另一種型別的金鑰,稱為輪金鑰,由 MK 生成並在整個混淆過程中使用。這些金鑰有助於混合位。

輪函式是演算法的主要組成部分。它一次混淆 32 位,在每一輪中都使用金鑰。

混淆資訊後,我們可以反轉該過程以對其進行解混淆。

以下是其工作原理的簡要說明:

  • 我們從明文(我們要保護的資訊)開始。
  • 我們將其分成 128 位的塊。
  • 我們使用金鑰和幾種其他方法對每個塊進行 32 次混淆。
  • 我們得到混淆後的文字作為輸出。
  • 要讀取文字,我們使用相同的步驟,但順序相反。

示例

假設我們有一個簡單的訊息,我們想用 SM4 方法對其進行加密。訊息是“HELLO”,金鑰是“KEY1234567890123”。以下是使用 SM4 加密它的方法。

將訊息和金鑰轉換為二進位制:

HELLO 變為

字母 二進位制
H 01001000
E 01000101
L 01001100
L 01001100
L 01001111

O

字母 二進位制
KEY1234567890123 變為 01001011
E 01000101
K 01011001
1 00110001
2 00110010
3 00110011
4 00110100
5 00110101
6 00110110
7 00110111
8 00111000
9 00111001
0 00110000
1 00110001
2 00110010
3 00110011

Y

將訊息和金鑰分成塊:

訊息塊(128 位):

塊 1:01001000 01000101 01001100

塊 2:01001111(用零填充以生成 128 位)

  • 每個金鑰塊包含 128 位。
  • 塊 1:01001011 01000101 01011001 00110001。
  • 塊 2:00110010 00110011 00110100 00110101。
  • 塊 3:00110110 00110111 00111000 00111001。

塊 4:00110000 00110001, 00110010, 00110011。

加密每個塊 - 使用從金鑰塊接收的輪金鑰對每個訊息塊應用加密過程。

組合加密塊 - 組合加密塊以形成最終的加密訊息。

廣告