Python实现aes加密解密多种方法解析
作者:Yuan_x 发布时间:2021-05-13 01:36:53
标签:Python,aes,加密,解密
引子:
在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实现的一种方式
来源:https://www.cnblogs.com/yuan-x/p/12361500.html


猜你喜欢
- 大家在打开带有图片的网页时,有时会看到这样的情况:当鼠标指向图片的不同部位时,可以打开不同的超链接,这
- 字符串查找基本操作主要分为三个关键词:find()、index()、count()。这三个用法相同,格式都是为:自定义字符串名.关键词(‘子
- 本文首先介绍了Python中的模块的概念,谈到了一个模块往往由多个模块组成,然后通过具体实例,分析了模块重载的相关内容,具体介绍如下。模块是
- 前言:上一篇博客我用AOP+AbstractRoutingDataSource实现了MySQL读写分离,自己写代码实现判断该使用哪个数据源挺
- PHP策略模式(Strategy Pattern)策略模式是一种行为设计模式,它允许在运行时选择算法行为的方法。该模式定义了一组算法,将每个
- python画图时linestyle,color和loc参数的设置本人没有看过专门介绍matplotlib的书籍,所以一直以来对一些画图的风
- 本文实例讲述了python中as用法。分享给大家供大家参考。具体分析如下:import some # some 为一个模组如果想要改变被导入
- VSCode 必须安装以下插件:首先你必须安装 Golang 插件,然后再给 Go 安装工具包。在 VS Code 中,使用快捷键: com
- 目录生成迷宫走出迷宫可视化总结相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至
- 最近仿写一个项目,如下目录,base内部都是一些基础的组件,但是并没有在main.js 中使用常规的方式去全局注册的,刚开始还不明白没有注册
- 在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解
- 本意是为了和手写jdbc对照,不过不要和原来的手写连接重名。打开cmd,直接输入notepad就打开了记事本。jdk1.5之后不必配置cla
- 本文实例为大家分享了JavaScript实现网页计算器的具体代码,供大家参考,具体内容如下要求:在网页上实现简单的计算器功能和界面CSS样式
- 我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REG
- div+css实现圆角边框,在网络上查看了一下,很多都是实现圆角的矩形的方法,我在这里介绍的是实现圆角矩形边框的方法。用代码说明问题:<
- 在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗的解决方法分享。<div id='tes
- 如果要在某个数组中删除一个元素,可以直接用的unset,但今天看到的东西却让我大吃一惊<?php$arr = array('a
- Python try重新执行:def numberinput(): #创建方法 try: s=int(input('n
- 在 github 的 vue-router 中找到同样的一个问题:3.0.1版本通过router实例无法跳转昨天发现有些路由不能正常跳转,找
- MySQL窗口函数简介MySQL从8.0开始支持窗口函数,这个功能在大多商业数据库和部分开源数据库中早已支持,有的也叫分析函数。什么叫窗口?