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 中的 else详解
Apr 23 Python
Python引用传值概念与用法实例小结
Oct 07 Python
Python 2.x如何设置命令执行的超时时间实例
Oct 19 Python
python 删除非空文件夹的实例
Apr 26 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
Python实现图片转字符画的代码实例
Feb 22 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python标识符命名规范原理解析
Jan 10 Python
想学画画?python满足你!
Dec 24 Python
python用字节处理文件实例讲解
Apr 13 Python
详解python的内存分配机制
May 10 Python
Python基础之数据类型知识汇总
May 18 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 discuz 主题表和回帖表的设计
2009/03/13 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Python高效编程技巧
2013/01/07 Python
Python函数嵌套实例
2014/09/23 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
详解Python爬虫的基本写法
2016/01/08 Python
python字典快速保存于读取的方法
2018/03/23 Python
简单了解python的内存管理机制
2019/07/08 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Python sep参数使用方法详解
2020/02/12 Python
Python 如何展开嵌套的序列
2020/08/01 Python
python把一个字符串切开的实例方法
2020/09/27 Python
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
高三体育教学反思
2014/01/29 职场文书
给小学生的新年寄语
2014/04/04 职场文书
早读课迟到检讨书
2014/09/25 职场文书
学籍证明模板
2015/06/18 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
python异常中else的实例用法
2021/06/15 Python