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入门之语句(if语句、while语句、for语句)
Jan 19 Python
python使用socket远程连接错误处理方法
Apr 29 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
基于numpy中的expand_dims函数用法
Dec 18 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
django queryset 去重 .distinct()说明
May 19 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
Python基于百度AI实现抓取表情包
Jun 27 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生成EXCEL的东东
2006/10/09 PHP
php框架Phpbean说明
2008/01/10 PHP
PHP goto语句用法实例
2019/08/06 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
护士求职推荐信范文
2013/11/23 职场文书
人事专员的岗位职责
2014/03/01 职场文书
2014年端午节活动方案
2014/03/11 职场文书
基层党员对照检查材料
2014/09/24 职场文书
工作年限证明范本
2015/06/15 职场文书
校运会通讯稿
2015/07/18 职场文书
学习雷锋主题班会
2015/08/14 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python