日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)

發布時間:2023/12/15 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 密码学实验题_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代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。