附上我的部落格鏈結 四元君
對想出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 用來加密明文的密碼,在對稱加密演算法中,加密與解密的金鑰是相同的。金鑰為接收方與傳送方協商產生,但不可以直接在網路上傳輸,否則會導致金鑰洩漏,通常是通過非對稱加密演算法加密金鑰,然後再通過網路傳輸給對方,或者直接面對面商量金鑰。金鑰是絕對不可以洩漏的,否則會被攻擊者還原密文,竊取...