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
0
投稿
猜你喜欢
- 是在客户端确认还是在服务器端确认? <SCRIPT LANGUAGE="VBSc
- 腾讯“月捐计划”倡导爱心人士,通过每月小额捐款的形式,长期关注和支持公益项目。并和亿万爱心网友一起,每人每月1份爱,点滴付出,汇成爱海,形成
- 由于比赛需要,我这边制作了一份数字华容道,内含有3,4,5阶的数字华容道,开头在壳窗口内选择,运用了随机数模块(random)和图形化用户界
- 本文详细讲述了Python2.7环境Flask框架安装方法。分享给大家供大家参考,具体如下:第1步:确保本机已经安装有python,下载ea
- 1.安装好JDK下载并安装好jdk-12.0.1_windows-x64_bin.exe,配置环境变量:新建系统变量JAVA_HOME,值为
- 我们利用linux系统中yum安装Apache+MySQL+PHP是非常的简单哦,只需要几步就可以完成,具体如下:一、脚本YUM源安装:1.
- 1_cookie[掌握]解释: 用来保持服务器和浏览器交互的状态的, 由服务器设置,存储在浏览器作用: 用来做广告推送cookie的设置和获
- 本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下checkerboard.pyfrom collectio
- 图片的间隙Q:我有一张大图片,把它切割后在Dreamweaver中进行拼接,可是总是有间隙,不知为什么?A:不知你是否把表格的边距、间距和边
- <%@ page language="java" import="java.util.*" p
- 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验、净化和转换时,将会面临很大
- 前言由与上不了学,教我们Mastercam的老师提前给我们布置了4道习题。对我们太好了,谢谢老师�没办法,干就完了。只是要求附上制作过程视频
- if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 )。 e
- 目录0. 前言1. 测试环境及关键代码解释1.1 简单测试环境1.2 关键代码2. 完整代码3. 运行效果4. 报错效果4.1 远程连接不上
- 模仿IE自动完成功能,支持Firefox.支持方向键操作运行代码框<!DOCTYPE HTML PUBLIC "-//W3C
- PDOStatement::debugDumpParamsPDOStatement::debugDumpParams — 打印一条 SQL
- SQL Server通常都运行在多处理器的服务器上,这一点在现在尤为普遍。原因是多内核的处理器越来越普及。那么,在多处理器环境下,Windo
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 使用指令:pyinstaller -F -w main.py生成的.exe文件执行报错看报错信息,初步怀疑是生成的.exe不能执行.ini配
- JavaScript是一门OOP,而有些人说,JavaScript是基于对象的。1) 如何创建对象:1. 使用constructor,例如: