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性能提升之延迟初始化
Dec 04 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
python库lxml在linux和WIN系统下的安装
Jun 24 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
python如何求圆的面积
Jul 01 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 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
Cannot modify header information错误解决方法
2008/10/08 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
STP的判定过程
2012/10/01 面试题
使用C#编写创建一个线程的代码
2013/01/22 面试题
工程专业应届生求职信
2014/02/19 职场文书
美术毕业生求职信
2014/02/25 职场文书
学习之星事迹材料
2014/05/17 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
黄山导游词
2015/01/31 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书