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编写脚本使IE实现代理上网的教程
Apr 23 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
Python面向对象特殊成员
Apr 24 Python
TensorFlow变量管理详解
Mar 10 Python
Python类的继承用法示例
Jan 31 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
Django web框架使用url path name详解
Apr 29 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Python用input输入列表的实例代码
Feb 07 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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/06/06 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
在Python的Django框架中创建和使用模版
2015/07/15 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
入党自我评价优缺点
2014/01/25 职场文书
材料化学专业求职信
2014/07/15 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
欢迎新生标语2015
2015/07/16 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL