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里大整数相乘相关技巧指南
Sep 12 Python
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
python 类详解及简单实例
Mar 24 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
Django如何实现网站注册用户邮箱验证功能
Aug 14 Python
python 实现人和电脑猜拳的示例代码
Mar 02 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 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
smarty基础之拼接字符串的详解
2013/06/18 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
python中map()与zip()操作方法
2016/02/27 Python
python实现简单神经网络算法
2018/03/10 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Java面试题及答案
2012/09/08 面试题
教师绩效考核方案
2014/01/21 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
高一军训感想
2015/08/07 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
导游词之日月潭
2019/11/05 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
尝试使用Python爬取城市租房信息
2022/04/12 Python
MySQL添加索引特点及优化问题
2022/07/23 MySQL