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 19 Python
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
python学习之第三方包安装方法(两种方法)
Jul 30 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
django用户登录验证的完整示例代码
Jul 21 Python
Python3 翻转二叉树的实现
Sep 30 Python
基于Python解密仿射密码
Oct 21 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 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/10/09 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
理解javascript中的回调函数(callback)
2014/09/02 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
一个简单不报错的summernote 图片上传案例
2016/07/11 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
js编写简易的计算器
2020/07/29 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
python中类的属性和方法介绍
2018/11/27 Python
Python Pandas 箱线图的实现
2019/07/23 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
使用索引有什么好处
2016/07/27 面试题
品管员岗位职责
2013/11/10 职场文书
优秀家长自荐材料
2014/08/26 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
同事离别感言
2015/08/04 职场文书