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 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
python实现的一个p2p文件传输实例
Jun 04 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
Python如何实现FTP功能
May 28 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
python小型的音频操作库mp3Play
Apr 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 无限级缓存的类的扩展
2009/03/16 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python用Jira库来操作Jira
2020/12/28 Python
中国制造网:Made-in-China.com
2019/10/25 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
初三化学教学反思
2014/01/23 职场文书
员工安全承诺书
2014/05/22 职场文书
暑假学习心得体会
2014/09/02 职场文书
安全生产标语大全
2014/10/06 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
李强感恩观后感
2015/06/17 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
Python 绘制多因子柱状图
2022/05/11 Python