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
- 如何在sql server中解密视图(关于SQL Server加密与解密的问题)
- JavaScript中实现AES加密解密
- 淘宝算法推荐逻辑公式(详解淘宝H5 sign加密算法)
- python编程加密解密(python实现AES加密解密)
- php生成md5(php进行md5加密简单实例方法)
- python如何解压加密zip文件(python读取有密码的zip压缩文件实例)
- php常用加密技术(php用户名的密码加密更安全的方法)
- druid数据库连接池原理详解(阿里巴巴Druid,轻松实现MySQL数据库加密!)
- sqlserver数据库中锁的4种类型(SQLSERVER对加密的存储过程、视图、触发器进行解密推荐)
- python如何把字符串转换成数字(python实现字符串加密成纯数字)
- python中生成字符串序列(python实现字符串加密 生成唯一固定长度字符串)
- python图片aes加密(python实现AES加密和解密)
- dede MD5加密解密(DEDECMS的20位MD5加密密文解密示例介绍)
- python使用aes加密解密(python实现AES和RSA加解密的方法)
- python零基础入门加密与解密(Python玩转加密的技巧推荐)
- php代码最可靠的加密方式(php DES加密算法实例分析)
- 深度 倒牛奶 这一幕为何又在美国上演(深度倒牛奶)
- 美国数十万加仑牛奶倒下水道怎么回事 原因曝光令人心痛(美国数十万加仑牛奶倒下水道怎么回事)
- 探索中国神秘文字(探索中国神秘文字)
- 重温《蜗居》 宋思明选中海藻为红颜知己,纯属巧合,与爱无关(宋思明选中海藻为红颜知己)
- 越南旅游攻略(越南旅游攻略自由行)
- 成都旅游攻略(成都旅游攻略自由行最佳线路)
热门推荐
- css3项目列表属性(像素密度与CSS3的viewport在移动端Web响应式布局中的运用)
- mybatis如何插入空格字符串(MyBatis SQL xml处理小于号与大于号正确的格式)
- pythonindex函数用法(python sort、sort_index方法代码实例)
- sqlserver两表查询语句格式(sql server实现在多个数据库间快速查询某个表信息的方法)
- python如何将运行结果存入txt中(详解python读取和输出到txt)
- python动态数组原理(Python实现的旋转数组功能算法示例)
- myisam和innodb的区别
- 哪里有云主机租用(云主机租用要注意的事项?)
- windows 2003服务器系统安装(win2003云服务器安装西部数码网站助手教程)
- jquery实现聚光灯效果
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9