AES解密算法

Poo*_*ani 10 cryptography aes

我要简短地说一下.我想要实现自己的AES加密/解密程序已经有一段时间了.加密程序运行良好,加密没有任何错误或奇怪的输出(因为我已经将我的程序的输出与工作的商业输出进行比较,结果是相同的).

维基百科是我在这个实现中的指南,我在其中读到"使用相同的加密密钥将一组反向回合应用于将密文转换回原始明文."

我实现了几个模块:

  1. 添加圆键
  2. 转移行
  3. 子字节
  4. 混合柱

我还实现了上面模块的几个反向实现:

  1. 反向移动行
  2. 反向子字节
  3. 反向混合柱

注意:我没有实现反向轮密钥,因为它是用加密密钥对明文进行异或,而异或的反转是异或(如果我错了,请纠正我)

所以我按照我加密的相反顺序推出这些模块,但从来没有得到我的纯文本:

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
Run Code Online (Sandbox Code Playgroud)

而且我想,也许我不应该实现模块的反向模型,也许我必须使用那些我加密的模块,只是按相反的顺序; 好吧猜怎么着?没用!:

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);
Run Code Online (Sandbox Code Playgroud)

所以这是一个问题:出了什么问题?|| 如果你愿意,应用这些所谓的模块或功能的正确顺序是什么?

Jef*_*ser 13

您的操作顺序似乎错了.我想你想要这个:

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);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅我的AES图解说明及其附带的参考实现.

警告:正如第3幕第2幕所述,有些龙在编写您自己的AES实现以供生产使用.