密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)
生活随笔
收集整理的這篇文章主要介紹了
密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
密碼學實驗題_03.3_AES實驗_利用Sage構建AES的S盒和逆S盒(基于閱讀Sage數學庫的Python代碼)
3.?? ?AES實驗
3)?? ?(思考題)利用Sage構建AES的S盒和逆S盒。
通過PyCharm進行調試,并做適當修改,可以發現Sage數學庫的《rijndael_gf.py》的類的實例的綁定方法 [ _sub_bytes_pc ] 中返回了 AES盒的 代數表達式:
(x^2 + 1)*a00^254 + (x^3 + 1)*a00^253 + (x^7 + x^6 + x^5 + x^4 + x^3 + 1)*a00^251 + (x^5 + x^2 + 1)*a00^247 + (x^7 + x^6 + x^5 + x^4 + x^2)*a00^239 + a00^223 + (x^7 + x^5 + x^4 + x^2 + 1)*a00^191 + (x^7 + x^3 + x^2 + x + 1)*a00^127 + (x^6 + x^5 + x + 1)
寫成好看的形式:
(x^2 + 1)*a00^254 +
(x^3 + 1)*a00^253 +
(x^7 + x^6 + x^5 + x^4 + x^3 + 1)*a00^251 +
(x^5 + x^2 + 1)*a00^247 +
(x^7 + x^6 + x^5 + x^4 + x^2)*a00^239 +
a00^223 +
(x^7 + x^5 + x^4 + x^2 + 1)*a00^191 +
(x^7 + x^3 + x^2 + x + 1)*a00^127 +
(x^6 + x^5 + x + 1)
通過不斷的跟蹤調試,?發現針對狀態矩陣中的每個元素 aij ,其對應的 AES S盒代數式都是一樣:
上面的S盒對應的代數表達式的使用,是在
? ? ? ?_srd(self, el, algorithm='encrypt')
中實現的。不對調試中的畫面截圖了,直接在靜態代碼截圖中進行注釋如下:
?
那么問題來了,為什么是這樣呢?
熬了個無用的深夜,嘗試自己手算推導,結果一無所獲(踏破鐵鞋無覓處),
第二天,查找文獻,得來全不費工夫? ?======>
有大佬已經給出了證明:
?
上面是我查找的文獻編號順序,現在列舉出來作為備忘(序號微調一下):
①《AES的S盒和逆S盒的代數表達式_馬虹博.pdf》;
②《AES算法的S盒分析及改進探討_張學旺.pdf》;
③《AES_S盒的代數表達式_韋寶典.pdf》
由于版權原因,CSDN上傳不了文獻,請自行下載閱讀。
這里僅貼一些圖出來:
《AES算法的S盒分析及改進探討_張學旺.pdf》文獻里寫到:
?
《AES的S盒和逆S盒的代數表達式_馬虹博.pdf》文獻里寫到:
《AES的S盒和逆S盒的代數表達式_馬虹博.pdf》文獻中,后續內容里面,給出了詳細的證明過程!
?
好了,現在再回到?Sage數學庫的《rijndael_gf.py》代碼實現,關鍵點有:
一、 [ _sub_bytes_pc ]里面的:用于加密的S盒,和用于解密的‘‘逆S盒’’的 【代數表達式】:
已加密用的S盒為例,關鍵點是:?
sum( [coeffs[i] * (var**(255 - 2**i))? for i in range(8)] ) + self._F("x^6 + x^5 + x + 1")?
def _sub_bytes_pc(self, row, col, algorithm='encrypt', no_inversion=False):r"""Return a polynomial representing `SubBytes(A)_{\textit{row, col}}`."""if algorithm == 'encrypt':var = self.state_vrs[row, col]coeffs = self._sb_E_coeffsif no_inversion:return sum([coeffs[i] * (var**(2**i))for i in range(8)]) + self._F("x^6 + x^5 + x + 1")else:# 靜水流深 調試注釋# return sum([coeffs[i] * (var**(255 - 2**i))# for i in range(8)]) + self._F("x^6 + x^5 + x + 1")tempReturn = sum([coeffs[i] * (var**(255 - 2**i)) for i in range(8)]) + self._F("x^6 + x^5 + x + 1")return tempReturnelif algorithm == 'decrypt':var = self.state_vrs[row, col]coeffs = self._sb_D_coeffsresult = (sum([coeffs[i] * var**(2**i) for i in range(8)]) + \self._F("x^2 + 1"))if no_inversion:return resultelse:return result ** 254else:raise ValueError(("keyword 'algorithm' must be either 'encrypt' ""or 'decrypt'"))二、用于加密的S盒,和用于解密的‘‘逆S盒’’的 【代數表達式】的系數?coeffs[i]?已經在類的初始化里面定義好了:
self._sb_E_coeffs = [self._F("x^2 + 1"),self._F("x^3 + 1"),self._F("x^7 + x^6 + x^5 + x^4 + x^3 + 1"),self._F("x^5 + x^2 + 1"),self._F("x^7 + x^6 + x^5 + x^4 + x^2"),self._F("1"),self._F("x^7 + x^5 + x^4 + x^2 + 1"),self._F("x^7 + x^3 + x^2 + x + 1")]self._sb_D_coeffs = [self._F("x^2 + 1"),self._F("x^7 + x^6 + x^5 + x^4 + x^3 + x^2 + x"),self._F("x^6 + x^5 + x^4 + x^3 + x^2 + x + 1"),self._F("x^6 + x^4 + x^3 + x"),self._F("x^6 + x^5 + x^4 + x^3"),self._F("x^6 + x^4 + x^3 + 1"),self._F("x^7 + x^6 + x^4 + x^3 + x + 1"),self._F("x^6 + x^5 + x^3 + x^2 + x")]所以,針對問題【利用Sage構建AES的S盒和逆S盒?】,知道如何改代碼了吧O(∩_∩)O哈哈~
備注:有關AES中使用的 GF(2^8)上面的作為【模數】的本源多項式,請參考俺的博文:
《密碼學實驗題_03.3_AES實驗_【Rijndael-GF】和【GF(2^8)上的本源多項式】等(基于Sage)》
https://blog.csdn.net/hardwork617s/article/details/110849314
?
在此All!?
總結
以上是生活随笔為你收集整理的密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP主动模式和被动模式详解
- 下一篇: python ABCD 选项蒙题游戏