python实现AES加密和解密


Posted in Python onMarch 27, 2019

一、前言

AES,高级加密标准(英语:Advanced Encryption Standard)。是用来替代DES,目前比较流行的加密算法。
它是一种对称加密算法,与上一篇博文提到过的RSA非对称算法不同,AES只有一个密钥,这个密钥既用来加密,也用于解密。

AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB和OFB这几种(其实还有个CTR):

1.ECB模式(电子密码本模式:Electronic codebook)

ECB是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。

2.CBC模式(密码分组链接:Cipher-block chaining)

CBC模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。

3.CFB模式(密文反馈:Cipher feedback)

与ECB和CBC模式只能够加密块数据不同,CFB能够将块密文(Block Cipher)转换为流密文(Stream Cipher)。

4.OFB模式(输出反馈:Output feedback)

OFB是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。

二、代码实现与解析

照旧先上代码:

from Crypto.Cipher import AES
import base64

class AEScoder():
  def __init__(self):
    self.__encryptKey = "iEpSxImA0vpMUAabsjJWug=="
    self.__key = base64.b64decode(self.__encryptKey)
  # AES加密
  def encrypt(self,data):
    BS = 16
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    cipher = AES.new(self.__key, AES.MODE_ECB)
    encrData = cipher.encrypt(pad(data))
    #encrData = base64.b64encode(encrData)
    return encrData
  # AES解密
  def decrypt(self,encrData):
    #encrData = base64.b64decode(encrData)
    #unpad = lambda s: s[0:-s[len(s)-1]]
    unpad = lambda s: s[0:-s[-1]]
    cipher = AES.new(self.__key, AES.MODE_ECB)
    decrData = unpad(cipher.decrypt(encrData))
    return decrData.decode('utf-8')

简析1:这里采用了面向对象的写法,创建了一个类,同时也偷懒直接把密钥写死成了类的属性。如果有灵活修改密钥的需求,将密钥作为参数传进去即可。

简析2:例子里用了ECB模式,这是AES加密最简单也是很常用的模式。另外一个常用模式是CBC,会比ECB模式多一个初始偏移向量iv:cipher = AES.new(self.__key, AES.MODE_CBC, iv)。

简析3:pad和unpad分别是填充函数和逆填充函数。因为AES加密对加密文本有长度要求,必须是密钥字节数的倍数。这里的encryptKey在经过base64解码后的长度是16个字节。

简析3拓展:实际上AES加密有AES-128、AES-192、AES-256三种,分别对应三种密钥长度128bits(16字节)、192bits(24字节)、256bits(32字节)。当然,密钥越长,安全性越高,加解密花费时间也越长。默认的是AES-128,其安全性完全够用。

填充算法拓展

这里采用的填充算法其实有个专有名词,叫pkcs7padding。

简单解释就是缺几位就补几:填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。

如果要填充8个字节,那么填充的字节的值就是0x08;要填充7个字节,那么填入的值就是0x07;以此类推。

如果文本长度正好是BlockSize长度的倍数,也会填充一个BlockSize长度的值。这样的好处是,根据最后一个Byte的填充值即可知道填充字节数。

实际上,java中实现AES加密算法的默认模式是Cipher.getInstance("AES/ECB/PKCS5Padding")
PKCS#5在填充方面,是PKCS#7的一个子集:PKCS#5只是对于8字节(BlockSize=8)进行填充,填充内容为0x01-0x08;但是PKCS#7不仅仅是对8字节填充,其BlockSize范围是1-255字节。
然而因为AES并没有64位(8字节)的块, 如果采用PKCS5, 那么实质上就是采用PKCS7。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3.3实现乘法表示例
Feb 07 Python
一个计算身份证号码校验位的Python小程序
Aug 15 Python
详解Python中time()方法的使用的教程
May 22 Python
python音频处理用到的操作的示例代码
Oct 27 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
python 命名规范知识点汇总
Feb 14 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
Selenium Webdriver元素定位的八种常用方式(小结)
Jan 13 Python
PyTorch的Debug指南
May 07 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 #Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 #Python
Pandas读写CSV文件的方法示例
Mar 27 #Python
使用Python的SymPy库解决数学运算问题的方法
Mar 27 #Python
超简单使用Python换脸实例
Mar 27 #Python
python爬虫爬取微博评论案例详解
Mar 27 #Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 #Python
You might like
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
js null,undefined,字符串小结
2010/08/21 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
js实现自定义路由
2017/02/04 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
js实现转动骰子模型
2019/10/24 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
Ubuntu下安装PyV8
2016/03/13 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
瑜伽国际:Yoga International
2018/04/18 全球购物
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
初二物理教学反思
2014/01/29 职场文书
1亿有多大教学反思
2014/05/01 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
环卫个人总结
2015/03/03 职场文书
修辞手法有哪些?
2019/08/29 职场文书
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers