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构造函数及解构函数介绍
Feb 26 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
python实现对输入的密文加密
Mar 20 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
Python生成随机验证码代码实例解析
Jun 09 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 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学习资源和链接.
2006/12/05 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
js获取div高度的代码
2008/08/09 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
python re模块的高级用法详解
2018/06/06 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python实现飞机大战
2018/09/11 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
解决python 文本过滤和清理问题
2019/08/28 Python
django删除表重建的实现方法
2019/08/28 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
长辈证婚人证婚词
2014/01/09 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
写给女朋友的保证书
2015/05/09 职场文书
学生会干部任命书
2015/09/21 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
python 爬取豆瓣网页的示例
2021/04/13 Python
MySQL 如何分析查询性能
2021/05/12 MySQL
MySQL 如何设计统计数据表
2021/06/15 MySQL
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python