在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批量提取word内信息
Aug 09 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
May 31 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
使用Python的turtle模块画国旗
Sep 24 Python
python返回数组的索引实例
Nov 28 Python
使用python创建生成动态链接库dll的方法
May 09 Python
Python无损压缩图片的示例代码
Aug 06 Python
举例讲解Python装饰器
Dec 24 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 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之PHP语法学习笔记1
2006/12/17 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
php创建sprite
2014/02/11 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php数组随机排序实现方法
2015/06/13 PHP
微信自定义分享php代码分析
2016/11/24 PHP
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
javascript如何写热点图
2015/12/08 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
JS中的多态实例详解
2017/10/15 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
Python程序退出方式小结
2017/12/09 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
教师政风行风自查自纠报告
2014/10/21 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
Python字符串的转义字符
2022/04/07 Python