手动推导计算AES中的s盒的输出
手動推導計算AES中的s盒的輸出
初衷
為了解決一道密碼學課后作業:
在AES中,對于字節 “00” 和 “01” 計算S盒的輸出。
百度查了很久,很多都是淺嘗則之,沒有具體說明S盒計算的具體過程和方法,要么就是說直接使用S盒求出,搞的我很崩潰,本身也是半吊子。后來在這篇文章的幫助下,順利找到了解決方法。
很明顯,如果通過查表的方式,很容易就可以得出“63”“63”和 “7C”“7C”這兩個輸出。但是這道題不能這么做,需要手動計算S盒的輸出。
算法過程簡介
AES加密算法涉及4種操作:
- 字節替代(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 輪密鑰加(AddRoundKey).
其中第一步字節替換,即SubBytes,它是作用在狀態中每個字節上的一種非線性字節變換,這個變換(或稱S_box
)按以下兩步進行:
- 把字節的值用它的乘法逆來代替,其中 “00” 的逆就是它自己;
- 把經上一步處理后的字節值再進行如下定義的仿射變換:
因此第一步需要求多項式的乘法逆
又二進制多項式 b(x)b(x) 的乘法逆為滿足
的二進制多項式 a(x)a(x) ,其中 a(x)=b?1(x)a(x)=b?1(x)
計算過程
1. 求乘法逆(Multiplicative Inverse)
在RJNDAEL中的不可約多項式為:
假設我們要求 a(x)a(x)的逆,對 a(x)a(x)和 m(x)m(x)使用擴展歐幾里得算法可以得到形如
b(x)?a(x)+s(x)?m(x)=1(18)(18)b(x)?a(x)+s(x)?m(x)=1
的等式,即等價于
b(x)?a(x)=1(modm(x))(19)(19)b(x)?a(x)=1(modm(x))
其中 a(x)a(x)的逆為 b(x)b(x)
假設現在我們的輸入是“02”“02”,根據已有S盒中得到的結果為“77”“77”,所以接下來我們要驗證使用下面講述的方法,最后計算的結果是否也是“77”“77”。
| x8+x4+x3+x+1x8+x4+x3+x+1 | 00 | |
| xx | 11 | |
| 11 | x7+x3+x2+1x7+x3+x2+1 | x7+x3+x2+1x7+x3+x2+1 |
表格的生成規則是:AuxiliaryAuxiliary 列的前兩行以 0 和 1 開始,RemainderRemainder列的前兩行通常以 m(x)m(x) 和 a(x)a(x)開始,如上表所示。接下來的行的計算方法是:取以當前行的前兩行中的RemainderRemainder相除,得到的商放在QuotientQuotient列中,得到的余數放在RemainderRemainder列中。接著將當前號的quotientquotient值乘上一行的AuxiliaryAuxiliary(GF(28)GF(28)上的乘法)并且再加上(GF(28)GF(28)上的加法)上上【即前兩行】一行的AuxiliaryAuxiliary列中的值,最后把計算的結果放到當前行的AuxiliaryAuxiliary 列上。當RemainderRemainder列減小到一時,AuxiliaryAuxiliary 列中的值就是a(x)a(x)對應的乘法逆。下面就上面的例子做一下說明:
4.計算 AuxiliaryAuxiliary 列,將當前行的QuotientQuotient列的值,即x7+x3+x2+1x7+x3+x2+1,去乘上一行 AuxiliaryAuxiliary 列的值,即11,再去加上上一行的 AuxiliaryAuxiliary 列的值,即00,最后得到結果為(x7+x3+x2+1)?1+0(x7+x3+x2+1)?1+0,注意此處的運算都是GF(28)GF(28)上的乘法和加法。
求乘法逆的過程到此結束,將x7+x3+x2+1x7+x3+x2+1轉換為二進制即為1000110110001101,接下來進行第二步操作:仿射變換(Affine Transformation).
2. 仿射變換(Affine Transformation)
關于仿射變換可以參考這個論壇里的討論,里面講的已經很詳細了,大致的過程就是矩陣運算,其中矩陣每一行和上一步求出乘法逆相與之后,再對得到的8位二進制進行異或,最后得到00或者11.比如:
Input = 1 0 1 1 0 0 0 1 (LSB First)Row 0 = 1 0 0 0 1 1 1 1Bit 0 = 1 0 0 0 0 0 0 1 = 0Row 1 = 1 1 0 0 0 1 1 1Bit 1 = 1 0 0 0 0 0 0 1 = 0Row 2 = 1 1 1 0 0 0 1 1Bit 2 = 1 0 1 0 0 0 0 1 = 1Row 3 = 1 1 1 1 0 0 0 1Bit 3 = 1 0 1 1 0 0 0 1 = 0Row 4 = 1 1 1 1 1 0 0 0Bit 4 = 1 0 1 1 0 0 0 0 = 1Row 5 = 0 1 1 1 1 1 0 0Bit 5 = 0 0 1 1 0 0 0 0 = 0Row 6 = 0 0 1 1 1 1 1 0Bit 6 = 0 0 1 1 0 0 0 0 = 0Row 7 = 0 0 0 1 1 1 1 1Bit 7 = 0 0 0 1 0 0 0 1 = 0注:LSB first表示低位在前
上一步求出1000110110001101,其低位在前即1011000110110001。接下來將inputinput 和 rowrow相與再將得到的所有bitbit進行異或運算,得到矩陣運算的結果0010100000101000,之后再和最后的矩陣向量1100011011000110進行GF(28)GF(28)上的加法運算,得到了1110111011101110。由于我們一直都是以低位在前進行運算,最后的結果需要換為 MSBfirstMSBfirst 高位在前,所以將1110111011101110倒著寫得到最終結果011101111011101111。查看S_box的表格可知,輸入0202最終得到7777,計算結果正確。至此AESAES的S盒計算過程已經摸索清除,至于其中更深層次的數學原理,如果有哪位大神知道的可以留言一下。
總結
起初是為了解決一道題,后來發現百度很久(不知道是不是我的打開方式有問題),居然沒有很整齊劃一的方法可以解答這個問題,國內的論壇都是抄來抄去,沒有人解決實質性的問題,幸虧后來在一些國外的論壇找到了答案。雖然這篇文章的講到的一些原理還沒有弄懂,我也不是很清楚為什么這么算就可以了。。。不過我相信后來的人再看到就有機會更深層次地挖掘,更好地弄懂這類問題。
碼字不易,轉載請注明出處
參考資料
1.http://mathforum.org/library/drmath/view/51675.html
2.https://crypto.stackexchange.com/questions/10996/how-are-the-aes-s-boxes-calculated
3.https://wenku.baidu.com/view/a1832d43b307e87101f696ac.html
4.https://www.cnblogs.com/luop/p/4334160.html
5.https://max.book118.com/html/2016/0222/35595572.shtm
總結
以上是生活随笔為你收集整理的手动推导计算AES中的s盒的输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Python做个打飞机小游戏超详细教程
- 下一篇: C语言实验——整除