AES金鑰編排Python實現

2021-09-21 01:35:35 字數 3375 閱讀 9692

附上我的部落格鏈結 四元君

對想出aes的前輩大寫的佩服,光是寫了金鑰編排我就寫了一下午…這裡把aes講述一下,再把**過程總結一下

aes加密演算法涉及4種操作:位元組替代(subbytes)、行移位(shiftrows)、列混淆(mixcolumns)和輪金鑰加(addroundkey)。

我們這裡提及的是構造金鑰的方法,金鑰擴充套件,原理如下:

首先我們構造rotword的函式,他的目的在於增加擴散性。這裡實際上我們要幹的事情就是完成乙個置換,做的方式是乙個字串的拼接。注意python內部不能使用word[2:4]之類的方法,只能是word[2:]表示從第2個往後。

def rotword(word):

return word[2:]+word[:2]

接下來構造subbytes方法。這個方法實現的就是s盒。我們這裡的方法是輸入字串,轉換為相應的十六進製制的字元。python裡不能使用switch方法,只能用字典進行搜尋。

對於字典來說,我們可以用key來搜尋value。如果沒搜尋到就預設為none。

numbers = 

def hex2bin(key):

return numbers.get(key[0], none)+numbers.get(key[1], none)

當然我們這裡還需要的方法,要從value來搜尋key,要自定義乙個get_key方法:

def get_key (dict, value):

for k, v in dict.items():

if v == value:

return k

接下來實現subbytes方法,注意原方法中,要先求key在域中的乘法逆,在進行計算。但是計算機內的0指的是第乙個元素,所以不必求逆。

def subbytes(key):

#print(key)

key=hex2bin(key)

c='11000110'

b=''

for i in range(8):

temp=(int(key[i])+int(key[(i+4)%8])+int(key[(i+5)%8])+int(key[(i+6)%8])+int(key[(i+7)%8])+int(c[i]))%2

# print(temp)

temp=str(temp)

b+=temp

b=b[::-1]

#print(b)

return get_key(numbers,b[:4])+get_key(numbers,b[4:])

再者進行構造subword方法,這個方法的目的在於混淆。使用s盒對原序列進行s置換。

def subword(word):

temp=''

i=0while i最後我們來實現keyexpansion方法。這裡注意在迴圈中,temp是乙個字串,binnum是乙個二進位制數。注意不能將二者混用,因為不是每一次temp的值是更新的,在實踐中就會出現問題。

def keyexpansion(m):

rcon=['01000000','02000000','04000000','08000000','10000000','20000000','40000000','80000000','1b000000','36000000']

i=0key=

while i<16:

i+=1

w=for i in range(0,4):

#print(w[i])

#temp=subword(rotword(w[0]))

#temp=hex2bin(temp)

#temp=w[0]

#temp=int(hex2bin8(subword(rotword(temp))),2)|int(hex2bin8(rcon[i//4-1]),2)

for i in range(4,44):

temp=w[i-1]

binnum=int(hex2bin8(temp),2)

if(i%4==0):

binnum=int(hex2bin8(subword(rotword(temp))),2)^int(hex2bin8(rcon[i//4-1]),2)

while zernum:

zernum-=1

return w

最後我們將全部的**放在下面:

def rotword(word):

return word[2:]+word[:2]

numbers =

def get_key (dict, value):

for k, v in dict.items():

if v == value:

return k

def hex2bin(key):

return numbers.get(key[0], none)+numbers.get(key[1], none)

def hex2bin8(key):

str=''

zernum=8-len(key)

while zernum:

key='0'+key

zernum-=1

for i in range(8):

str+=numbers.get(key[i], none)

#print(str)

return str

def subbytes(key):

#print(key)

key=hex2bin(key)

c='11000110'

b=''

for i in range(8):

temp=(int(key[i])+int(key[(i+4)%8])+int(key[(i+5)%8])+int(key[(i+6)%8])+int(key[(i+7)%8])+int(c[i]))%2

# print(temp)

temp=str(temp)

b+=temp

b=b[::-1]

#print(b)

return get_key(numbers,b[:4])+get_key(numbers,b[4:])

def subword(word):

temp=''

i=0while i最後的結果如下:

AES的C 實現 128位金鑰

寫了乙個aes的c 實現,僅支援128位金鑰,寫得匆忙,不夠規範,僅供參考。aes.h ifndef aes h define aes h include include using namespace std class aes void aes encryptionprocess finalro...

python實現AES演算法

usr bin python coding utf 8 from crypto.cipher import aes from binascii import b2a hex,a2b hex class aes 自己實現了乙個aes類,用於aes的加密和解密 def init self,key,mod...

Python 實現 AES 加密 解密

一 前言 金鑰 k 用來加密明文的密碼,在對稱加密演算法中,加密與解密的金鑰是相同的。金鑰為接收方與傳送方協商產生,但不可以直接在網路上傳輸,否則會導致金鑰洩漏,通常是通過非對稱加密演算法加密金鑰,然後再通過網路傳輸給對方,或者直接面對面商量金鑰。金鑰是絕對不可以洩漏的,否則會被攻擊者還原密文,竊取...