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实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 Python
python实现的Iou与Giou代码
Jan 18 Python
python有序查找算法 二分法实例解析
Feb 18 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
python 实现超级玛丽游戏
Nov 25 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python的collections模块真的很好用
Mar 01 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
python获取带有返回值的多线程
May 02 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
对Session和Cookie的区分与解释
2007/03/16 PHP
PHP实现多条件查询实例代码
2010/07/17 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
深入理解vue Render函数
2017/07/19 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
js中this对象用法分析
2018/01/05 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
Python中的并发编程实例
2014/07/07 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
如何利用python生成MD5并去重
2020/12/07 Python
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
中文师范生自荐信
2014/01/30 职场文书
房地产广告策划方案
2014/05/15 职场文书
小学教师读书活动总结
2014/07/08 职场文书
亮剑观后感
2015/06/05 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js