我要简短地说一下。我想要实现自己的AES加密/解密程序已经有一段时间了。加密程序运行良好,加密没有任何错误或奇怪的输出(因为我已经将我的程序的输出与工作的商业输出进行了比较,结果是相同的)。
维基百科是我在这个实现中的指南,其中我读到了“使用相同的加密密钥将一组反向轮转换回原始明文。”
我实施了几个模块:
我还实现了上述模块的几个反向实现:
注意:我没有实现反向轮密钥,因为它是用加密密钥对明文进行异或,而异或的反转是异或(如果我错了,请纠正我)
所以我按照我加密的相反顺序推出了这些模块,但从来没有让我的纯文本回复:
expandkey128(key);
rev_subbytes(data);
rev_shiftrows(data);
addroundkey(data,key,10);
for(int i = 9; i>= 1; i--) {
rev_subbytes(data);
rev_shiftrows(data);
rev_mixColum(data);
addroundkey(data,key,i);
}
addroundkey(data,key,0);
// Please note that I also did from 0 to 10 ,
// instead of 10 to 0 and didn't workout
而且我想,也许我不应该实现模块的反向模型,也许我必须使用那些我加密的模块,只是按相反的顺序;好吧猜怎么着?没用! :
expandkey128(key);
addroundkey(data,key,0);
for(int i = 1; i<= 9; i++) {
subbytes(data);
shiftrows(data);
mixColum(data);
addroundkey(data,key,i);
}
subbytes(data);
shiftrows(data);
addroundkey(data,key,10);
所以这就是问题:出了什么问题? ||如果你愿意,应用这些所谓的模块或函数的正确顺序是什么?
答案 0 :(得分:12)
您的操作顺序似乎有误。我想你想要这个:
expandkey128(key);
addroundkey(data,key,10);
rev_shiftrows(data);
rev_subbytes(data);
for(int i = 9; i>= 1; i--) {
addroundkey(data,key,i);
rev_mixColumn(data);
rev_shiftrows(data);
rev_subbytes(data);
}
addroundkey(data,key,0);
有关详细信息,请参阅my stick figure explanation of AES及其随附的参考实现。
警告:正如Act 3, Scene 2 there be dragons中所述,您正在编写自己的AES实施以供生产使用。