AES,填充算法结合操作模式CBC,ECB⽤python实现(Nopadding,PKCS。。。⼀、CBC,PKCS5Padding.
1.代码实现,
import base64
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto import Random
w().read(AES.block_size)  #随机⽣成密钥,AES.block_size=16
iv=get_random_bytes(16)  #随机获取16位变量
print('密钥长度:',len(secret))
print('密钥:', secret)
cipher = w(secret,AES.MODE_CBC,iv)
data="Hello,Python12!"
#16分组数据长度,填充补齐最后⼀块数据,
#例如需要补5个字节,在后⾯填充5个\x05
#补12个字节则填充12个\x0c
pad=lambda s:s+(16-len(s)%16)*chr(16-len(s)%16)
data=pad(data)
encrypt_data= de('utf-8'))    #输⼊需要加密的字符串,注意字符串长度要是16的倍数。16,32,48..
print ('密⽂:',encrypt_data)                                              #输出加密后的字符串
encrypt_data = base64.b64encode(encrypt_data)
print ('密⽂的base64编码:',encrypt_data)            #输出加密后的字符串的base64编码。
encrypt_data = base64.b64decode(encrypt_data)
print('密⽂的base64编码的解码:',encrypt_data)
cipher = w(secret,AES.MODE_CBC,iv) #要加上,否则报错decrypt() cannot be called after encrypt()
decrypt_data = cipher.decrypt(encrypt_data)
print('未删除补充数据的明⽂:',decrypt_data) #未删除补充的数据
#删除补充的数据
#最后⼀位是\xo6,则删除末尾6个字节
upad=lambda s:s[0:-(s[-1])]
#upad=lambda s:s[0:-ord(s[-1])]  #会报错
decrypt_data=upad(decrypt_data)
print('字节型明⽂:',decrypt_data)  #字节
decrypt_data=decrypt_data.decode('utf-8')
#print(type(decrypt_data))
print('字符串型明⽂:',decrypt_data) #字符串
2.运⾏结果:
密钥长度: 16
密钥: b'\xa7j*\x1b\xc9\x10\xbcs\x8d\xddB\x9a\x94\xde\xc2\x87'
密⽂: b'\xc0T\x0f\x93#\xdf\xee~\xc4y^\x05\xabZbL'
密⽂的base64编码: b'wFQPkyPf7n7EeV4Fq1piTA=='
密⽂的base64编码的解码: b'\xc0T\x0f\x93#\xdf\xee~\xc4y^\x05\xabZbL'
未删除补充数据的明⽂: b'Hello,Python12!\x01'
字节型明⽂: b'Hello,Python12!'
字符串型明⽂: Hello,Python12!
⼆、ECB,ISO10126Padding.
1.代码实现
import string
import random
w().read(AES.block_size)  #随机⽣成密钥,AES.block_size=16
iv=get_random_bytes(16)  #随机获取16位变量
print('密钥长度:',len(secret))
print('密钥:', secret)
data="Hello,Python123!"
#获取随机字符串
def get_Random_String(n):
random python
x = string.printable
salt = ''
for i in range(n):
salt+=random.choice(x)
return salt
#ISO10126Padding 填充
#在明⽂块末尾补⾜相应数量的字节,最后⼀个字符值等于缺少的字符数,其他字符填充随机数
def pad(text):
byte=16-len(text)%16
#print(byte)
return(text+get_Random_String(byte-1)+chr(byte))
data=pad(data)
#print('明⽂:',data)
cipher = w(secret,AES.MODE_ECB)      #通过AES.MODE_ECB处理初始密码字符串,并返回cipher对象
encrypt_data= de('utf-8'))    #输⼊需要加密的字符串,注意字符串长度要是16的倍数。16,32,48..
print ('密⽂',encrypt_data)                                              #输出加密后的字符串
encrypt_data = base64.b64encode(encrypt_data)
print ('密⽂的base64编码:',base64.b64encode(encrypt_data))            #输出加密后的字符串的base64编码。
encrypt_data = base64.b64decode(encrypt_data)
print('密⽂的base64编码的解码:',encrypt_data)
decrypt_data = cipher.decrypt(encrypt_data)
#decrypt_data=decrypt_data.decode('utf-8') #字节转为字符串
print("未删除补充数据的明⽂:",decrypt_data)
upad=lambda s:s[0:-(s[-1])]
decrypt_data=upad(decrypt_data)
print('明⽂:',decrypt_data)
2.运⾏结果:
密钥长度: 16
密钥: b'\xba.\x01L\x89\xa4\xa8\xd1\xa2\xde\x11\x9c\x7f\x87&>'
密⽂ b"\xdc\x9e\x1c\x95\x03\xed\xec\xa7\n\xa8\x85\x92\xb4\xd3E\xc1\xef??\xd5\xb2\x90\xc5\xec\xdf\xb1\xe0\xdb\x9fD\xe8'"
密⽂的base64编码: b'M0o0Y2xRUHQ3S2NLcUlXU3ROTkZ3ZTgvUDlXeWtNWHMzN0hnMjU5RTZDYz0='
密⽂的base64编码的解码: b"\xdc\x9e\x1c\x95\x03\xed\xec\xa7\n\xa8\x85\x92\xb4\xd3E\xc1\xef??\xd5\xb2\x90\xc5\xec\xdf\xb1\xe0\xdb\x9fD\xe8'"未删除补充数据的明⽂: b'Hello,Python123!K^it`Be8[@ CNwt\x10'
明⽂: b'Hello,Python123!'
三、ECB,NoPadding.
1.代码实现:
w().read(AES.block_size)  #随机⽣成密钥,AES.block_size=16
iv=get_random_bytes(16)  #随机获取16位变量
print('密钥长度:',len(secret))
print('密钥:', secret)
data="Hello,Python123!"
#明⽂处理
#不做任何填充,但是要求密钥必须是16字节的整数倍:
def add_to_16(text):
while len(text)%16 !=0:
text+='\0'
return (text)
data=add_to_16(data)
print('明⽂:',data)
cipher = w(secret,AES.MODE_ECB)      #通过AES.MODE_ECB处理初始密码字符串,并返回cipher对象
encrypt_data= de('utf-8'))    #输⼊需要加密的字符串,注意字符串长度要是16的倍数。16,32,48.. print ('密⽂',encrypt_data)                                              #输出加密后的字符串
encrypt_data = base64.b64encode(encrypt_data)
print ('密⽂的base64编码:',base64.b64encode(encrypt_data))            #输出加密后的字符串的base64编码。
encrypt_data = base64.b64decode(encrypt_data)
print('密⽂的base64编码的解码:',encrypt_data)
decrypt_data = cipher.decrypt(encrypt_data)
print('明⽂:',decrypt_data)
decrypt_data=decrypt_data.decode('utf-8') #字节转为字符串
print('明⽂:',decrypt_data)
2.运⾏结果:
密钥长度: 16
密钥: b'd\x0b\xe44\t\xcc<\xc8hW1\xc7]\xd2^\x07'
明⽂: Hello,Python123!
密⽂ b'\x13\x8f/\n\x9cx/YH\x88\x81\xea\xa8\xa5\xd3\xd5'
密⽂的base64编码: b'RTQ4dkNweDRMMWxJaUlIcXFLWFQxUT09'
密⽂的base64编码的解码: b'\x13\x8f/\n\x9cx/YH\x88\x81\xea\xa8\xa5\xd3\xd5'
明⽂: b'Hello,Python123!'
明⽂: Hello,Python123!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。