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的chardet库获得文件编码并修改编码
Jan 22 Python
python构建自定义回调函数详解
Jun 20 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
python实现文件的备份流程详解
Jun 18 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
Python web如何在IIS发布应用过程解析
May 27 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
python和go语言的区别是什么
Jul 20 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
Python根据字典的值查询出对应的键的方法
Sep 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
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php实现倒计时效果
2015/12/19 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
微信小程序实现日历签到
2020/09/21 Javascript
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
python实现烟花小程序
2019/01/30 Python
python3.6 tkinter实现屏保小程序
2019/07/30 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
教师实习自我鉴定
2013/12/13 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
考博专家推荐信
2014/05/10 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
机关作风建设整改方案
2014/10/27 职场文书
离职感谢信
2015/01/21 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
学习党章心得体会2016
2016/01/15 职场文书
装修安全责任协议书
2016/03/22 职场文书