python aes加解密,python的aes加密解密
本文主要介绍python实现AES算法和AES-CFB8加解密的源代码实例。需要的话可以借鉴一下。希望能有所帮助。祝你进步很大。
目录
Python实现AES算法生成轮密钥加解密完整代码如下:测试程序Python实现AES-CFB8加解密。
Python实现AES算法
密码学课程老师留的作业,我觉得用python实现比较容易,所以用python写了一个加解密程序。
程序分为三部分,一是生成轮密钥,二是加密,三是解密。
生成轮密钥
这部分要看是不是4的倍数。非四的倍数简单,直接异或就够了。如果它是4的倍数,那么需要进行字节替换和异或运算。
对于范围(4):#中的I,将十六进制转换为十进制
对于范围(0,8,2 ):内的j
self.subkey[i]。追加(0x 键[i*8 j:i*8 j 2])
对于范围(4,44):#中的I,生成密钥
如果我%4!=0:
tmp=xor_32(自身子密钥[i-1],自身子密钥[i-4])
self.subkey.append(tmp)
Else:#4倍数。
tmp1=self.subkey[i-1][1:]
tmp 1 . append(self . subkey[I-1][0])
1=self.s _ box (tmp1) # byte而不是
1=xor _ 32 (tmp1,self。Rcon [I/4]) #和Rcon是异或。
self.subkey.append(xor_32(tmp1,self.subkey[i-4]))
加密
加密中最难实现的就是列混淆,因为要实现域内乘法,我没有想到用递归实现的好办法,但还是用if判断来一一操作。
解密
解密的时候,最难的依然是逆列混淆运算,这依然是最愚蠢的if判断。
完整代码如下
# -*-编码: utf-8 -*-
创建于2019年1 1月1日18:47:24
@author: pkill
AesCryption:类
S_box={# bytes而不是S-box
0:[0x63 ,0x7c ,0x77 ,0x7b ,0xf2 ,0x6b ,0x6f ,0xc5 ,0x30 ,0x01 ,0x67 ,0x2b ,
0xfe ,0xd7 ,0xab ,0x76],
1:[0xca ,0x82 ,0xc9 ,0x7d ,0xfa ,0x59 ,0x47 ,0xf0 ,0xad ,0xd4 ,0xa2 ,0xaf ,0x9c ,0xa4 ,0x72 ,0xc0],
2:[0xb7 ,0xfd ,0x93 ,0x26 ,0x36 ,0x3f ,0xf7 ,0xcc ,0x34 ,0xa5 ,0xe5 ,0xf1 ,0x71 ,0xd8 ,0x31 ,0x15],
3:[0x04 ,0xc7 ,0x23 ,0xc3 ,0x18 ,0x96 ,0x05 ,0x9a ,0x07 ,0x12 ,0x80 ,0xe2 ,0xeb ,0x27 ,0xb2 ,0x75],
4:[0x09 ,0x83 ,0x2c ,0x1a ,0x1b ,0x6e ,0x5a ,0xa0 ,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84],
5:[0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf],
6:[0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
0x50, 0, 0x9f, 0xa8],
7:[0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21,
0x10, 0xff, 0xf3, 0xd2],
8:[0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d,
0x64, 0x5d, 0x19, 0x73],
9:[0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
0xde, 0x5e, 0x0b, 0xdb],
10:[0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79],
11:[0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08],
12:[0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a],
13:[0x70, 0, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e],
14:[0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf],
15:[0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]
}
s_1_box = { #逆字节替换s盒
0:[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb],
1:[0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb],
2:[0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e],
3:[0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25],
4:[0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92],
5:[0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84],
6:[0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06],
7:[0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b],
8:[0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73],
9:[0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e],
10:[0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b],
11:[0xfc, 0x56, 0, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4],
12:[0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f],
13:[0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef],
14:[0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0, 0x83, 0x53, 0x99, 0x61],
15:[0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]
}
Rcon = { #Rcon生成密钥的表
1: [0x01,0x00, 0x00, 0x00],
2: [0x02, 0x00, 0x00, 0x00],
3: [0x04, 0x00, 0x00, 0x00],
4: [0x08, 0x00, 0x00, 0x00],
5: [0x10, 0x00, 0x00, 0x00],
6: [0x20, 0x00, 0x00, 0x00],
7: [0x40, 0x00, 0x00, 0x00],
8: [0x80, 0x00, 0x00, 0x00],
9: [0x1B, 0x00, 0x00, 0x00],
10: [0x36, 0x00, 0x00, 0x00]
}
Matrix = [ #列混淆
[0x02,0x03,0x01,0x01],
[0x01,0x02,0x03,0x01],
[0x01,0x01,0x02,0x03],
[0x03,0x01,0x01,0x02]
]
InvMatrix = [ #逆列混淆
[0x0e,0x0b,0x0d,0x09],
[0x09,0x0e,0x0b,0x0d],
[0x0d,0x09,0x0e,0x0b],
[0x0b,0x0d,0x09,0x0e]
]
plaintext = [[],[],[],[]] #存放明文
plaintext1 = [[],[],[],[]]
subkey = [[],[],[],[]] #存放密钥
def __init__(self,key):#构造函数,同时生成密钥
for i in range(4):#把16进制转成十进制
for j in range(0, 8, 2 ):
self.subkey[i].append(0x+key[i*8+j:i*8+j+2])
for i in range(4,44):#生成密钥
if i%4 !=0:
tmp = xor_32(self.subkey[i-1], self.subkey[i-4])
self.subkey.append(tmp)
else:#4的倍数的时候执行
tmp1 = self.subkey[i-1][1:]
tmp1.append(self.subkey[i-1][0])
tmp1 = self.S_box(tmp1) #字节代替
tmp1 = xor_32(tmp1,self.Rcon[i/4])#和Rcon异或
self.subkey.append(xor_32(tmp1,self.subkey[i-4]))
def AddRoundKey(self,round):#轮密钥加函数
for i in range(4):
self.plaintext[i] = xor_32(self.plaintext[i],self.subkey[round*4+i])
def PlainSubBytes(self):#明文字节代替函数
for i in range(4):
self.plaintext[i] = self.S_box(self.plaintext[i])
def ShiftRows(self):#移位函数
p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
self.plaintext[0][1] = p2;self.plaintext[1][1] = p3;self.plaintext[2][1] = p4;self.plaintext[3][1] = p1
p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
self.plaintext[0][3] = p4;self.plaintext[1][3] = p1;self.plaintext[2][3] = p2;self.plaintext[3][3] = p3
def S_box(self,row):#s盒函数
a = []
for i in range(4):
a.append(self.s_box[int(row[i][2],16)][int(row[i][3],16)])
return a
def S_1_box(self,row):#逆s盒函数
a = []
for i in range(4):
a.append(self.s_1_box[int(row[i][2],16)][int(row[i][3],16)])
return a
def MixColumns(self):#列混淆函数
for i in range(4):
for j in range(4):
self.plaintext1[i].append(mc(self.Matrix[j],self.plaintext[i]))
def InvShiftRows(self):#逆移位函数
p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
self.plaintext[3][1] = p3;self.plaintext[2][1] = p2;self.plaintext[0][1] = p4;self.plaintext[1][1] = p1
p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
self.plaintext[0][3] = p2;self.plaintext[1][3] = p3;self.plaintext[2][3] = p4;self.plaintext[3][3] = p1
def InvSubBytes(self):#逆字节代替
for i in range(4):
self.plaintext[i] = self.S_1_box(self.plaintext[i])
def InvMixColumns(self):#逆列混淆
for i in range(4):
for j in range(4):
self.plaintext1[i].append(mc(self.InvMatrix[j],self.plaintext[i]))
def AesEncrypt(self,plain):#加密函数
for i in range(4):
for j in range(0, 8, 2 ):
self.plaintext[i].append(0x+plain[i*8+j:i*8+j+2])#把16进制转化成二进制
self.AddRoundKey(0)#第一轮密钥加
for i in range(9):
self.PlainSubBytes()#字节代替
self.ShiftRows()#行移位
self.MixColumns()#列混淆
self.plaintext = self.plaintext1#把列混淆生成的密钥赋值给plaintext
self.plaintext1 = [[],[],[],[]]#重置
self.AddRoundKey(i+1)
self.PlainSubBytes()#最后一轮字节代替
self.ShiftRows()#最后一轮行移位
self.AddRoundKey(10)#最后一轮轮密钥加
return Matrixtostr(self.plaintext)#把二进制转换成诗十六进制
def AesDecrypt(self,cipher):
for i in range(4):
for j in range(0, 8, 2 ):
self.plaintext[i].append(0x+cipher[i*8+j:i*8+j+2])#16进制转成2进制
self.AddRoundKey(10)#轮密钥加
for i in range(9):
self.InvShiftRows()#逆行移位
self.InvSubBytes()#逆字节代替
self.AddRoundKey(9-i)#轮密钥加
self.InvMixColumns()#逆列混淆
self.plaintext = self.plaintext1
self.plaintext1 = [[],[],[],[]]
self.InvShiftRows()
self.InvSubBytes()
self.AddRoundKey(0)
return Matrixtostr(self.plaintext)#把二进制转换成十六进制
def hextobin(word):#把十六进制转换成二进制
word = bin(int(word,16))[2:]
for i in range(0,8-len(word)):#补全八位
word = 0+word
return word
def bintohex(word):#把二进制转换十六进制
word = hex(int(word, 2))
if len(word) == 4:
return word
elif len(word) <4:
return word.replace(x,x0)#0x5-->0x05
def xor_32(start, end):#32位进行异或
a = []
for i in range(0,4):
xor_tmp = ""
b = hextobin(start[i])
c = hextobin(end[i])
for j in range(8):
xor_tmp += str(int(b[j],10)^int(c[j],10))
a.append(bintohex(xor_tmp))
return a
def xor_8(begin, end):#8位异或
xor_8_tmp = ""
for i in range(8):
xor_8_tmp += str(int(begin[i])^int(end[i]))
return xor_8_tmp
def Fa(a,b):#列混淆中的乘法运算
if a == 1:
return b
elif a == 2:
if b[0] == 0:
b = b[1:] + 0
else:
b = b[1:] + 0
b = xor_8(b,00011011)
return b
elif a == 3:
tmp_b = b
if b[0] == 0:
b = b[1:] + 0
else:
b = b[1:] + 0
b = xor_8(b,00011011)
return xor_8(b,tmp_b)
elif a == 9:
tmp_b = b
return xor_8(tmp_b,Fa(2,Fa(2,Fa(2,b))))
elif a == 11:
tmp_b = b
return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,b)))
elif a == 13:
tmp_b = b
return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))
elif a == 14:
return xor_8(Fa(2,b), xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))
def mc(s1,s2):#列混淆中的矩阵乘法
result = []
s3 = []
for i in range(4):
s3.append(hextobin(s2[i]))
for i in range(4):
result.append(Fa(int(s1[i],16),s3[i]))
for i in range(3):
result[0] = xor_8(result[0],result[i+1])
return bintohex(result[0])
def Matrixtostr(matrix):#矩阵转成字符串
result = ""
for i in range(4):
for j in range(4):
result += matrix[i][j][2:]
return result
测试
输入和输出都是16进制格式的字符串:
测试例子:
key = 2b7e151628aed2a6abf7158809cf4f3c
plain = 3243f6a8885a308d313198a2e0370734
cipher = 3925841d02dc09fbdc118597196a0b32
测试程序
# -*- coding: utf-8 -*-
Python实现AES-CFB8加解密
import json
以上就是python实现AES算法及AES-CFB8加解密源码的详细内容,更多关于Python实现AES-CFB8加解密算法的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。