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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python中类型关系和继承关系实例详解
May 25 Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
python编写微信公众号首图思路详解
Dec 13 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
python 基于pygame实现俄罗斯方块
Mar 02 Python
Python Pygame实战之塔防游戏的实现
Mar 17 Python
Python采集壁纸并实现炫轮播
Apr 30 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
Protoss魔法科技
2020/03/14 星际争霸
ajax php 实现写入数据库
2009/09/02 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
详解vue组件基础
2018/05/04 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python @property使用方法解析
2019/09/17 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
使用python绘制二维图形示例
2019/11/22 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
美工的岗位职责
2013/11/14 职场文书
植物生产学专业求职信
2014/08/08 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript