Python实现aes加密解密多种方法解析


Posted in Python onMay 15, 2020

引子:

 在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 相关文章推荐
分析用Python脚本关闭文件操作的机制
Jun 28 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
django框架forms组件用法实例详解
Dec 10 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
python3实现Dijkstra算法最短路径的实现
May 12 Python
Python - 10行代码集2000张美女图
May 23 Python
如何正确理解python装饰器
Jun 15 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 #Python
重写django的model下的objects模型管理器方式
May 15 #Python
Python基于pip实现离线打包过程详解
May 15 #Python
Django在Model保存前记录日志实例
May 14 #Python
django 连接数据库出现1045错误的解决方式
May 14 #Python
Django ORM filter() 的运用详解
May 14 #Python
Django设置Postgresql的操作
May 14 #Python
You might like
php adodb介绍
2009/03/19 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP目录操作实例总结
2016/09/27 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
Python爬虫实战之12306抢票开源
2019/01/24 Python
python多进程读图提取特征存npy
2019/05/21 Python
python 实现二维列表转置
2019/12/02 Python
tensorflow的计算图总结
2020/01/12 Python
python 爬取小说并下载的示例
2020/12/07 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
计算机专业毕业生求职信分享
2013/12/24 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
一岗双责责任书
2014/04/15 职场文书
新闻报道策划方案
2014/06/11 职场文书
查摆剖析材料范文
2014/09/30 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2014年民警工作总结
2014/11/25 职场文书
罚站检讨书
2015/01/29 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书