在Python中使用M2Crypto模块实现AES加密的教程


Posted in Python onApril 08, 2015

 AES(英文:Advanced Encryption Standard,中文:高级加密标准),是一种区块加密标准。AES将原始数据分成多个4×4字节矩阵来处理,通过预先定义的密钥对每个字节矩阵中的每个字节进行异或、替换、移位以及线性变换操作来达到加密的目的。密钥长度可以是128,192或256比特。
    下面是一个利用Python M2Crypto库,并使用aes_128_ecb算法进行加密和解密的例子。首先介绍一下几个关键的点:
1、iv(Initialization vector),即初始化向量,用于避免相同的数据多次加密都产生相同的密文。最大长度为16字节,超出16字节部分会被忽略,最好是随机产生以增加加密的强度。
2、ECB (Electronic codebook,ECB),它会对每个4×4字节矩阵都用同一个密钥进行加密,而且?]有使用 IV。优点是每个字节矩阵都可以独立进行加密,因此可以同时对每个字节矩阵进行加密;缺点是对于相关的数据,加密之后的密文都是一样的。
3、Padding,由于AES是以4×4字节矩阵作为单位进行处理,因为待加密数据必须是16的倍数,若不足16的倍数,将会进行填充操作。aes_128_ecb算法加密默认填充模式是pkcs5。
 

from M2Crypto.EVP import Cipher 
from M2Crypto import m2 
from M2Crypto import util 
  
ENCRYPT_OP = 1 # 加密操作 
DECRYPT_OP = 0 # 解密操作 
  
iv = '\0' * 16 # 初始化变量,对于aes_128_ecb算法无用 
PRIVATE_KEY = 'dd7fd4a156d28bade96f816db1d18609' # 密钥 
  
def Encrypt(data): 
 '使用aes_128_ecb算法对数据加密' 
 cipher = Cipher(alg = 'aes_128_ecb', key = PRIVATE_KEY, iv = iv, op = ENCRYPT_OP) 
 buf = cipher.update(data) 
 buf = buf + cipher.final() 
 del cipher 
 # 将明文从字节流转为16进制 
 output = '' 
 for i in buf: 
  output += '%02X' % (ord(i)) 
 return output 
  
def Decrypt(data): 
 '使用aes_128_ecb算法对数据解密' 
 # 将密文从16进制转为字节流 
 data = util.h2b(data) 
 cipher = Cipher(alg = 'aes_128_ecb', key = PRIVATE_KEY, iv = iv, op = DECRYPT_OP) 
 buf = cipher.update(data) 
 buf = buf + cipher.final() 
 del cipher 
 return buf
Python 相关文章推荐
python中enumerate的用法实例解析
Aug 18 Python
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
python实现批量按比例缩放图片效果
Mar 30 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
Python基本socket通信控制操作示例
Jan 30 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Python设计密码强度校验程序
Jul 30 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 #Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 #Python
使用IPython来操作Docker容器的入门指引
Apr 08 #Python
仅用50行Python代码实现一个简单的代理服务器
Apr 08 #Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 #Python
Python 创建子进程模块subprocess详解
Apr 08 #Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 #Python
You might like
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
学生请假条格式
2014/04/11 职场文书
优秀求职信
2014/05/29 职场文书
社保转移委托书范本
2014/10/08 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
mysql部分操作
2021/04/05 MySQL
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫
SQL Server中使用表变量和临时表
2022/05/20 SQL Server