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零基础入门加密与解密(Python玩转加密的技巧推荐)
- 淘宝算法推荐逻辑公式(详解淘宝H5 sign加密算法)
- python加密和解密(python实现对输入的密文加密)
- druid数据库连接池原理详解(阿里巴巴Druid,轻松实现MySQL数据库加密!)
- linux设置监控命令(linux系统虚拟主机开启支持SourceGuardiansg11加密组件的详细步骤)
- php内置加密函数(php过滤htmlspecialchars 函数实现把预定义的字符转换为 HTML 实体用法分析)
- php代码打包环境加密(php实现对文件压缩简单的方法)
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- php常用加密技术(php用户名的密码加密更安全的方法)
- 关于docker安全之Docker-TLS加密通讯问题(关于docker安全之Docker-TLS加密通讯问题)
- python使用门算法加密文件(python实现可逆简单的加密算法)
- ASP.NET常用加密解密方法
- python给一个数字md5加密(Python写一个基于MD5的文件监听程序)
- 如何在sql server中解密视图(关于SQL Server加密与解密的问题)
- dede MD5加密解密(DEDECMS的20位MD5加密密文解密示例介绍)
- php代码最可靠的加密方式(php DES加密算法实例分析)
- 庆余年剧组重聚王牌5,宋轶神秘消失,肖战出现一秒抢了李纯风头(庆余年剧组重聚王牌5)
- 巴厘岛旅游攻略(巴厘岛旅游攻略7天多少钱)
- 文莱旅游攻略(文莱旅游攻略介绍)
- 马来西亚旅游攻略(马来西亚旅游攻略自由行攻略)
- 缅甸旅游攻略(缅甸旅游攻略必去景点推荐)
- 《庆余年2》新消息,原班人马,肖战特别出演,这才是最好的安排(庆余年2新消息原班人马)
热门推荐
- php如何继承多个类(PHP面向对象程序设计子类扩展父类子类重新载入父类操作详解)
- SQL中FOR XML PATH
- linux 安装securecrt(Linux SecureCRT显示乱码解决方案)
- sql server 视图操作(Sql Server 视图数据的增删改查教程)
- html5基本结构图解(html5简介及新增功能介绍)
- nginx反向代码解决跨域访问(nginx 解决跨域问题嵌入第三方页面)
- VPS主机如何预防挂马?(VPS主机如何预防挂马?)
- html5 canvas touch(html5 canvas手势解锁源码分享)
- python默认缩进设置(不归路系列:Python入门之旅-一定要注意缩进!!!推荐)
- canvas绘图白屏或者元素有缺失(高清屏中使用Canvas绘图出现模糊的问题及解决方法)