Python 的AES加密与解密实现


Posted in Python onJuly 09, 2019

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。---百度百科

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB

 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),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。

从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现

python 在 Windows下使用AES时要安装的是pycryptodome 模块   pip install pycryptodome

python 在 Linux下使用AES时要安装的是pycrypto模块   pip install pycrypto

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

ECB加密不需要iv

AES CBC 加密的python实现

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
 if len(text.encode('utf-8')) % 16:
  add = 16 - (len(text.encode('utf-8')) % 16)
 else:
  add = 0
 text = text + ('\0' * add)
 return text.encode('utf-8')


# 加密函数
def encrypt(text):
 key = '9999999999999999'.encode('utf-8')
 mode = AES.MODE_CBC
 iv = b'qqqqqqqqqqqqqqqq'
 text = add_to_16(text)
 cryptos = AES.new(key, mode, iv)
 cipher_text = cryptos.encrypt(text)
 # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
 return b2a_hex(cipher_text)


# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
 key = '9999999999999999'.encode('utf-8')
 iv = b'qqqqqqqqqqqqqqqq'
 mode = AES.MODE_CBC
 cryptos = AES.new(key, mode, iv)
 plain_text = cryptos.decrypt(a2b_hex(text))
 return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
 e = encrypt("hello world") # 加密
 d = decrypt(e) # 解密
 print("加密:", e)
 print("解密:", d)

AES ECB加密的python实现

"""
ECB没有偏移量
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


def add_to_16(text):
 if len(text.encode('utf-8')) % 16:
  add = 16 - (len(text.encode('utf-8')) % 16)
 else:
  add = 0
 text = text + ('\0' * add)
 return text.encode('utf-8')


# 加密函数
def encrypt(text):
 key = '9999999999999999'.encode('utf-8')
 mode = AES.MODE_ECB
 text = add_to_16(text)
 cryptos = AES.new(key, mode)

 cipher_text = cryptos.encrypt(text)
 return b2a_hex(cipher_text)


# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
 key = '9999999999999999'.encode('utf-8')
 mode = AES.MODE_ECB
 cryptor = AES.new(key, mode)
 plain_text = cryptor.decrypt(a2b_hex(text))
 return bytes.decode(plain_text).rstrip('\0')


if __name__ == '__main__':
 e = encrypt("hello world") # 加密
 d = decrypt(e) # 解密
 print("加密:", e)
 print("解密:", d)

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

Python 相关文章推荐
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
Numpy的简单用法小结
Aug 28 Python
基于python3 的百度图片下载器的实现代码
Nov 05 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
Python生成词云的实现代码
Jan 14 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
python实现飞船游戏的纵向移动
Apr 24 Python
python实现邮件循环自动发件功能
Sep 11 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 #Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 #Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 #Python
python求最大值,不使用内置函数的实现方法
Jul 09 #Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 #Python
python爬虫的一个常见简单js反爬详解
Jul 09 #Python
详解PANDAS 数据合并与重塑(join/merge篇)
Jul 09 #Python
You might like
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php解决约瑟夫环示例
2014/04/09 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
javascript 快速排序函数代码
2012/05/30 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python中import机制详解
2017/11/14 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
2019/10/06 Python
基于python实现对文件进行切分行
2020/04/26 Python
python map比for循环快在哪
2020/09/21 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
《小草和大树》教学反思
2014/02/16 职场文书
银行求职信范文
2014/05/26 职场文书
毕业实习证明范本
2015/06/16 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
python读取pdf格式文档的实现代码
2021/04/01 Python
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers