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的Django框架中用流响应生成CSV文件的教程
May 02 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
python性能测试工具locust的使用
Dec 28 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 include,include_once,require,require_once
2008/09/05 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php实现数字补零的方法总结
2018/09/12 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
Vue-Router进阶之滚动行为详解
2017/09/13 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
简单实现python收发邮件功能
2018/01/05 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python多进程原理与用法分析
2018/08/21 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python argparse模块应用实例解析
2019/11/15 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
试用期转正鉴定评语
2014/01/27 职场文书
职业女性的职业规划
2014/03/04 职场文书
《凡卡》教学反思
2014/04/09 职场文书
产品生产计划书
2014/05/07 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
青涩记忆观后感
2015/06/18 职场文书
初中班长竞选稿
2015/11/20 职场文书
Python 循环读取数据内存不足的解决方案
2021/05/25 Python
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS