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实现全局变量的两个解决方法
Jul 03 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
详解Python中for循环的使用
Apr 14 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
DataFrame中的object转换成float的方法
Apr 10 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
Django vue前后端分离整合过程解析
Nov 20 Python
利用Python实时获取steam特惠游戏数据
Jun 25 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中怎样防止SQL注入分析
2014/10/23 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
破解Session cookie的方法
2006/07/28 Javascript
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
jQuery插件jsonview展示json数据
2018/05/26 jQuery
微信小程序上线发布流程图文详解
2019/05/06 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
Django与遗留的数据库整合的方法指南
2015/07/24 Python
python实现Windows电脑定时关机
2018/06/20 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
python3 配置logging日志类的操作
2020/04/08 Python
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
网络安全方面的面试题
2015/11/04 面试题
授权委托书样本
2014/04/03 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
施工安全汇报材料
2014/08/17 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
经理聘任证明
2015/03/02 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
孝女彩金观后感
2015/06/10 职场文书
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫