首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

用新的高級加密標準(AES)保護資料安全(六):建構函式、金鑰擴展、Cipher 加密流程與 GF(2^8) 乘法實作

     編輯:關於C語言

建構函式核心流程

public Aes(KeySize keySize, byte[] keyBytes)
{
    SetNbNkNr(keySize);           // 設定 Nb=4, Nk=4/6/8, Nr=10/12/14
    this.key = new byte[Nk * 4];
    keyBytes.CopyTo(this.key, 0); // 複製種子金鑰
    BuildSbox();                  // 建構 Sbox[16,16]
    BuildInvSbox();               // 建構 iSbox[16,16]
    BuildRcon();                  // 輪常數表 Rcon[Nr+1, 4]
    KeyExpansion();               // 生成金鑰調度表 w[Nb*(Nr+1), 4]
}

金鑰擴展 KeyExpansion 核心演算法

偽代碼:

for row = Nk to Nb*(Nr+1)-1
    temp = w[row-1]
    if row % Nk == 0
        temp = SubWord(RotWord(temp)) XOR Rcon[row/Nk]
    else if Nk == 8 and row % Nk == 4
        temp = SubWord(temp)
    w[row] = w[row-Nk] XOR temp
  • RotWord:4 位元組左循環移 1 位。
  • SubWord:每位元組經 S-box 替換。
  • Rcon:左欄為 GF(2^8) 中 2 的冪次,Rcon[i] = Rcon[i-1] * 0x02。

實例演算:192-bit 金鑰第 6 輪金鑰生成

種子金鑰前 6 輄:00 01 ... 17
row=6: temp = w[5] = 14 15 16 17
RotWord -> 15 16 17 14
SubWord -> 59 47 F0 FA
XOR Rcon[1] (01 00 00 00) -> 58 47 F0 FA
XOR w[0] (00 01 02 03) -> 58 46 F2 F9 = w[6]

Cipher 加密主流程

State = plainText 複製
AddRoundKey(State, w[0..3])           // 第 0 輪金鑰
for round = 1 to Nr-1
    SubBytes(State)      // S-box 替換
    ShiftRows(State)     // Row i 左移 i 位
    MixColumns(State)    // GF(2^8) 矩陣乘法
    AddRoundKey(State, w[round*4 .. round*4+3])
// 最後一輪略過 MixColumns
SubBytes, ShiftRows, AddRoundKey
cipherText = State

GF(2^8) 乘法輔助函數

  • gfmultby02(b):b < 0x80 ? b<<1 : (b<<1) ^ 0x1B
  • gfmultby03(b):gfmultby02(b) ^ b
  • 加密僅需 0x01/0x02/0x03,解密額外需 0x09/0x0B/0x0D/0x0E。

ShiftRows 實作技巧

temp = State 複製
State[r, (c + r) % Nb] = temp[r, c]  // 利用模運算單行實現左移
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved