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