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操作MySQL数据库具体方法
Oct 28 Python
跟老齐学Python之复习if语句
Oct 02 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
深入理解Python3中的http.client模块
Mar 29 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
Django模板Templates使用方法详解
Jul 19 Python
Python上下文管理器全实例详解
Nov 12 Python
Python中base64与xml取值结合问题
Dec 22 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
python中lower函数实现方法及用法讲解
Dec 23 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&mysql(四)
2006/10/09 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Python中的asyncio代码详解
2019/06/10 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
python实现最短路径的实例方法
2020/07/19 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
程序员跳槽必看面试题总结
2013/06/28 面试题
毕业生幼师求职自荐信
2013/10/01 职场文书
高三自我鉴定
2013/10/23 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
导游词之江西赣州
2019/10/15 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server