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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
Python中的 enum 模块源码详析
Jan 09 Python
django认证系统 Authentication使用详解
Jul 22 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
python3判断IP地址的方法
Mar 04 Python
Python使用Web框架Flask开发项目
Jun 01 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中使用Oracle数据库(1)
2006/10/09 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
php中照片旋转 (orientation) 问题的正确处理
2017/02/16 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 爬虫模拟登陆知乎
2016/09/23 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
Python for循环与range函数的使用详解
2019/03/23 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
工厂保洁员岗位职责
2013/12/04 职场文书
旅游项目开发策划书
2014/01/18 职场文书
运动员口号
2014/06/09 职场文书
伏羲庙导游词
2015/02/09 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang