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自定义解析简单xml格式文件的方法
May 11 Python
python处理html转义字符的方法详解
Jul 01 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
基于python requests库中的代理实例讲解
May 07 Python
python计算两个数的百分比方法
Jun 29 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
Python 中面向接口编程
May 20 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php抓取https的内容的代码
2010/04/06 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
理解javascript异步编程
2016/01/27 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
js实现星星打分效果
2020/07/05 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python heapq使用详解及实例代码
2017/01/25 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Django 用户认证组件使用详解
2019/07/23 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
python中spy++的使用超详细教程
2021/01/29 Python
供货协议书
2014/04/22 职场文书
单位工作证明书格式
2014/10/04 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
民事申诉状范本
2015/05/20 职场文书
会议营销主持词
2015/07/03 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers