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多线程编程(一):threading模块综述
Apr 05 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
Python对列表的操作知识点详解
Aug 20 Python
python关于调用函数外的变量实例
Dec 26 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
python爬虫实例之获取动漫截图
May 31 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创建自定义菜单的方法
2016/08/01 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
Sort()函数的多种用法
2016/03/20 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
js css自定义分页效果
2017/02/24 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
详解anaconda安装步骤
2020/11/23 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
医院门卫岗位职责
2013/12/30 职场文书
世界地球日活动总结
2015/02/09 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
SQL基础的查询语句
2021/11/11 MySQL
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis