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模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
Python显示进度条的方法
Sep 20 Python
python微信公众号开发简单流程
Mar 23 Python
python绘制散点图并标记序号的方法
Dec 11 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
python爬虫容易学吗
Jun 02 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
Python常用数据分析模块原理解析
Jul 20 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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 判断数组是几维数组
2013/03/20 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
php实现字符串翻转的方法
2015/03/27 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python封装原理与实现方法详解
2018/08/28 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
python TCP包注入方式
2020/05/05 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
python中round函数保留两位小数的方法
2020/12/04 Python
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
1亿有多大教学反思
2014/05/01 职场文书
施工安全生产承诺书
2014/05/23 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
学生犯错保证书
2015/05/09 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
JavaScript实现优先级队列
2021/12/06 Javascript
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android