在 AES 规范 (FIPS 197) 中,为什么 InvCipher 与反向密码不同?

In the AES spec (FIPS 197) why is InvCipher not the same as Cipher backwards?

在 AES 规范 (FIPS 197) 中,AES 加密例程的伪代码(称为 Cipher,第 15 页图 5)如下:

Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
     byte  state[4,Nb]
     state = in
     AddRoundKey(state, w[0, Nb-1]) 
     for round = 1 step 1 to Nr–1
        SubBytes(state) 
        ShiftRows(state) 
        MixColumns(state) 
        AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
    end for
    SubBytes(state)
    ShiftRows(state)
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
    out = state
end

要解密,规范说您可以简单地撤消 Cipher 中的所有步骤,即以与加密中执行的方式相反的顺序应用逆运算。

如:

Decrypt(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
     byte  state[4,Nb]
     state = in

     AddRoundKey(state, roundkey[10])
     invShiftRows(state)
     invSubBytes(state)

     for round = 9 step 1 to 1
        AddRoundKey(state, roundkey[round])
        invMixColumns(state)
        invShiftRows(state)
        invSubBytes(state)  
    end for

    AddRoundKey(state, roundkey[0]) 

    out = state
end

其中 roundkey[x] 是该轮加密中使用的 roundkey。

但是,这与规范中为反密码给出的伪代码不匹配,而是:

InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
    byte  state[4,Nb]
    state = in
    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) // See Sec. 5.1.4
    for round = Nr-1 step -1 downto 1
        InvShiftRows(state) 
        InvSubBytes(state) 
        AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
        InvMixColumns(state) 
    end for
    InvShiftRows(state)
    InvSubBytes(state)
    AddRoundKey(state, w[0, Nb-1])
    out = state
end

所以我的问题是,呈现的逆(图 12。第 21 页)如何等同于 'straight undo' 以使其仍然有效,以及它比 'straight undo' 解密方法更好的地方?

在不深入讨论 Nr*Nb、(Nr+1)*Nb-1 等的细节的情况下,这两个序列在​​我看来是一样的。假设您只有两个循环。这是您的序列与规范的序列并排显示:

AddRoundKey      AddRoundKey
invShiftRows
invSubBytes      InvShiftRows
                 InvSubBytes
AddRoundKey      AddRoundKey
invMixColumns    InvMixColumns
invShiftRows
invSubBytes      InvShiftRows
                 InvSubBytes
AddRoundKey      AddRoundKey
invMixColumns    InvMixColumns
invShiftRows
invSubBytes      InvShiftRows
                 InvSubBytes
AddRoundKey      AddRoundKey

一切都按照相同的顺序 -- 它应该产生相同的结果。我不能说一种方式比另一种方式更好。 (嗯,比你的更容易阅读。)