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 19 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Python变量格式化输出实现原理解析
Aug 06 Python
用python对oracle进行简单性能测试
Dec 05 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
python使用glob检索文件的操作
May 20 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 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实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
jquery动态添加删除一行数据示例
2014/06/12 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
python中函数总结之装饰器闭包详解
2016/06/12 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python实现转圈打印矩阵
2019/03/02 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python