python图片aes加密(python实现AES加密和解密)
python图片aes加密
python实现AES加密和解密一、前言
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。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/zhchs2012/article/details/79032656
- python如何解压加密zip文件(python读取有密码的zip压缩文件实例)
- python使用aes加密解密(python实现AES和RSA加解密的方法)
- python实现简单加密(Python 隐藏输入密码时屏幕回显的实例)
- python自动解密(python实现移位加密和解密)
- sqlserver数据库中锁的4种类型(SQLSERVER对加密的存储过程、视图、触发器进行解密推荐)
- python如何把字符串转换成数字(python实现字符串加密成纯数字)
- linux设置监控命令(linux系统虚拟主机开启支持SourceGuardiansg11加密组件的详细步骤)
- php代码打包环境加密(php实现对文件压缩简单的方法)
- python 绕过密码(一小段Python代码,破解加密zip文件的密码)
- php常用加密技术(php用户名的密码加密更安全的方法)
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- 基于python的加密算法(python实现维吉尼亚加密法)
- dede MD5加密解密(DEDECMS的20位MD5加密密文解密示例介绍)
- python加密和解密(python实现对输入的密文加密)
- JavaScript中实现AES加密解密
- python使用门算法加密文件(python实现可逆简单的加密算法)
- 北京旅游攻略(北京旅游攻略5日游及其花费)
- 四川旅游攻略(四川旅游攻略自由行攻略)
- 上海迪士尼攻略(上海迪士尼攻略旅游)
- 哪里可以看熊猫(成都哪里可以看熊猫)
- oppo手机的三种录屏方法,你知道有哪些吗(oppo手机的三种录屏方法)
- 吉林神秘传染链跨省 传染源尚未找到,舒兰 封城(吉林神秘传染链跨省)
热门推荐
- python语句for循环(Python基础之循环语句用法示例for、while循环)
- 微信小程序通知验证签名方法(微信小程序实现电子签名)
- SQL Server中对列的权限设置
- 微信小程序图片加特效(微信小程序实现可实时改变转速的css3旋转动画实例代码)
- docker redis配置文件放哪里(最详细的docker中安装并配置redis图文详解)
- php构成方法的关键字是(PHP中的self关键字详解)
- html5入门布局(吃透移动端 Html5 响应式布局)
- 为什么网页不显示css效果(网页布局中CSS样式无效的十个重要原因详解)
- MySQL中TIMESTAMP和DATETIME
- 如何用python编写抽奖(详解用python写一个抽奖程序)