2010-08-09 83 views
6

我将简要讲述一个长话短说。我想实现我自己的AES加密/解密程序已经有一段时间了。加密程序进行得很顺利,加密没有任何错误或奇怪的输出(因为我已经比较了我的程序输出和工作广告,结果相同)。AES解密算法

维基百科是我在这个实现中的指导,在这个实现中,我读了“使用相同的加密密钥应用一组反向轮将密文转换回原始明文。”

有几个是我实现的模块:

  1. 添加轮密钥
  2. 移行
  3. 子字节
  4. 混合列

我还实施了几个反向执行以上模块:

  1. 反方向移位行
  2. 反向子字节
  3. 反向混合列

注:我并没有实现反向轮密钥,因为,这是XOR荷兰国际集团与加密密钥的明文和XOR的逆转是XOR本身(纠正我,如果我错了)

所以,我的推杆以相反的顺序,我没有这个加密模块,但从来没有我得到了我的纯文本回:

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); 

所以这里是问题:什么是错的? ||如果你愿意,应用这些所谓的模块或函数的正确顺序是什么?

+1

您是否正确计算了您的S盒,导致您无法使用您用于加密的同一盒子。 http://en.wikipedia.org/wiki/S-box 维基百科英文版本中缺少此评论。直接看看这个规范:http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf你已经计算了要解密的反向S盒。 – evildead 2010-08-09 01:43:05

+0

实际上在rev_subbytes上我有Rijndael的反向S盒 – 2010-08-09 01:46:15

+1

有一个很棒的工具:http://www.cryptool.de/在这里你可以手动进行任何转换。也许你必须调试每一步,也许该工具将帮助你验证每一步。 – evildead 2010-08-09 01:49:06

回答

7

您的操作顺序看起来不对。我想你想要的是:

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 2there be dragons编写自己的AES实现生产使用提及。

+0

我不会为aes使用自己的实现。尼斯协议;) – evildead 2010-08-09 01:56:40

+0

好吧,我不打算在任何地方使用它,只是为了好玩! 我试过了你的订单没有工作,我也检查了链接(http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf),说不同的订单 – 2010-08-09 02:04:41

+1

它适用于我的机器并在我的执行:)。如果您有一些时间,请下载我的C#实现并逐步完成,并将每一步与您的实现进行比较。请注意,我给出的顺序与图12中的顺序完全相同。我只是按照我给出的顺序来更改它,以便清楚地表明它正在颠倒一切。我花了一些试验来比较我的输出结果和Rijndael书籍的全部输出结果,以确保我拥有正确的东西。你可能只是在你的一个反函数中有一个小错误。我建议在每一轮慢慢进行下一步。 – 2010-08-09 02:17:49