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设计模式编程中的访问者与观察者模式
Jan 26 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
Python实现翻转数组功能示例
Jan 12 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
python用户评论标签匹配的解决方法
May 31 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
pyhanlp安装介绍和简单应用
Feb 22 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python Django获取URL中的数据详解
Nov 01 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 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判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
jquery 学习笔记一
2010/04/07 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
使用python画社交网络图实例代码
2019/07/10 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
单位介绍信范文
2014/01/18 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
学校四群教育实施方案
2014/06/12 职场文书
三好生演讲稿
2014/09/12 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
毕业论文致谢词
2015/05/14 职场文书
Redis性能监控的实现
2021/07/09 Redis