引子:
在windows中python3使用 pycryptodemo 模块实现Aes加密解密。Aes加密有多种方式,自己可以上网了解下。 AES是每16位一加密,并且保证key和vi都是16位的。废话不多说直接上代码。
import base64
from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex
class PrpCrypt(object):
def __init__(self,key,iv):
self.key=key.encode('utf-8')
self.mode=AES.MODE_CBC
self.iv=iv.encode('utf-8')
def pad_byte(self, b):
'''
1 先计算所传入bytes类型文本与16的余数
2 在将此余数转成bytes 当然用0补位也可以
3 已知了 余数 那么就用余数*被转成的余数,就得到了需要补全的bytes
4 拼接原有文本和补位
:param b: bytes类型的文本
:return: 返回补全后的bytes文本
'''
bytes_num_to_pad = AES.block_size - (len(b) % AES.block_size)
# python3 中默认unicode转码
# 实际上byte_to_pad 就已经 将 数字转成了unicode 对应的字符 即使你的入参正好是16的倍数,那么bytes也是把列表整体的转码也是有值的
# 后边解密的匿名函数 拿到最后一个数字后,就知道应该截取的长度,在反着切片就行了
# 这样保证了数据的完整性
byte_to_pad = bytes([bytes_num_to_pad])
padding = byte_to_pad * bytes_num_to_pad
padded = b + padding
return padded
def encrypt(self,text):
'''
1 先生成aes实例
2 对传入的text转成bytes
3 对传入的text补全
4 调用encrypt 加密 得到密文
5 先将密文转16进制,在将16进制用base64转码,然后在将得到的base64解码
其实在步骤4 就已经完成了aes加密,我所在的公司加密比较复杂 ,需要的可以直接返回步骤4的值
:param text:
:return:
'''
cryptor = AES.new(self.key,self.mode,self.iv)
text = text.encode('utf-8')
text = self.pad_byte(text)
self.ciphertext = cryptor.encrypt(text)
cryptbase64 = base64.b64encode(b2a_hex(self.ciphertext)).decode('utf8')
return cryptbase64
def decrypt(self,text):
'''
解密和加密的顺序是相反的
1 定义匿名函数,去掉补位
2 base64解码
3 生成aes实例
4 16进制转2进制
5 使用decrypt解码 得到补全的bytes类型明文
:param text:
:return: 解密且去掉补位的明文
'''
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
base64Str = base64.b64decode(text.encode('utf8'))
cryptor = AES.new(self.key, self.mode, self.iv)
aesStr = cryptor.decrypt(a2b_hex(base64Str))
aesStr = str(unpad(aesStr), encoding='utf8')
return aesStr
if __name__ == '__main__':
data='sadfsasdgsdfgdsf123'
pc=PrpCrypt('daajanbaqa654321','1234567890123456')
redata = pc.encrypt(data)
print(redata)
result=pc.decrypt(redata)
print(result)
思路:
这里引用一句前辈的话,思路很重要。具体的怎么实现反而在其次。
1 因为Aes是按照16位加密的,key和iv都好说,可以直接设置成定长的16位。
2 因为传入的数据和传回的数据不是定长的,所以加密的时候要先判断是否是16位的倍数,如果不够那么就补全。
3 问题是对端拿到数据后怎么知道从哪里截取。
1 在对传入数据做是否16位判断的时候,你就知道了要补多少位,将这个数字转成bytes类型,python3中默认unicode码。
2 对端拿到数据后,先截取最后一位,在根据unicode转成对应数字,那么对端就知道了从哪开始截取。
3 看下unicode和utf8的关系,utf8是unicode实现的一种方式
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
标签:
Python,aes,加密解密
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“Python实现aes加密解密多种方法解析”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2025年11月18日
2025年11月18日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]