Python: AES加密与解密
起源:
视频下载,解析到一个网站时,发现其视频id是用AES加密过的,用的是https://code.google.com/archive/p/crypto-js/这个库。
解密很简单的一句js代码:
t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);
原本想着简单,找段python代码做解密是了,没想到反复尝试,写法五花八门多种多样,就是解不出来,竟费去许多工夫!
如何简单?我只需实现验证下面的字串加解密:
# data = '-85297962_172051801'
# key = '583a01a9ba901a3adda7252ebca42c09'
# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'
1、Python Cryptography Toolkit (pycrypto)
加解密需要用到它,其网址是:https://pypi.python.org/pypi/pycrypto目前最新版本为2.6.1。如何安装及其简单Demo,其页面上都 ,而其用法在网上一搜也到处都是,可就是不能解决我的问题,我想是我用错了,但哪种才是对的哪!
crypto-js这个,应该用的是AES默认模式,AES.MODE_CBC。js代码也是难懂,总是不停试不停试!
2、加密与解密
直接上代码吧,它满足了需求:
# coding=utf-8 import base64
from Crypto.Cipher import AES
from Crypto import Random
from hashlib import md5 BLOCK_SIZE = AES.block_size def pad(data):
length = BLOCK_SIZE - (len(data) % BLOCK_SIZE)
return data + (chr(length) * length).encode() def unpad(data):
return data[:-(data[-1] if type(data[-1]) == int else ord(data[-1]))] def bytes_to_key(my_data, salt, output=48):
# extended from https://gist.github.com/gsakkis/4546068
assert len(salt) == 8, len(salt)
my_data += salt
key = md5(my_data).digest()
final_key = key
while len(final_key) < output:
key = md5(key + my_data).digest()
final_key += key
return final_key[:output] def encrypt(message, passphrase):
salt = Random.new().read(8)
key_iv = bytes_to_key(passphrase, salt, 32 + 16)
key = key_iv[:32]
iv = key_iv[32:]
aes = AES.new(key, AES.MODE_CBC, iv)
return base64.b64encode(b"Salted__" + salt + aes.encrypt(pad(message))) def decrypt(data, password):
if len(data) <= BLOCK_SIZE:
return data data = base64.b64decode(data)
salt = data[8:16]
key_iv = bytes_to_key(password, salt, 32 + 16)
key = key_iv[:32]
iv = key_iv[32:] cipher = AES.new(key, AES.MODE_CBC, iv)
return unpad(cipher.decrypt(data[BLOCK_SIZE:])) if __name__ == '__main__':
# data = '-85297962_172051801'
# key = '583a01a9ba901a3adda7252ebca42c09'
# encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj' key = '583a01a9ba901a3adda7252ebca42c09'
data = '-85297962_172051801'
encrypt_data = encrypt(data, key)
print encrypt_data # encrypt_data = 'U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj'
decrypt_data = decrypt(encrypt_data, key)
print 'decrypt_data:', decrypt_data
同个字串,发现加密后的字串,每次不尽相同。对AES没多研究,挺觉奇怪!
3、打包与发布
若是只用到了Crypto一部分功能,比如我们用到的aes解密,则可以抽简出来所需代码,以避免打入整个Crypto库。
奇怪的是,引用_AES.pyd这个动态库,引用路径有问题。查阅资料,原来Crypto写死了它的引用路径,其页面代码有如此写:
https://github.com/dlitz/pycrypto/blob/master/src/block_template.c#L801
#ifdef IS_PY3K
m = PyModule_Create(&moduledef);
#else
m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods);
#endif
而用py2exe打包抽取,其把Crypto\Cipher\_AES.pyd改名为Crypto.Cipher._AES.pyd文件,放与发布目录下,令人颇长见识
Python: AES加密与解密的更多相关文章
- python AES 加密与解密
#用aes加密,再用base64 encode def aes_encrypt(data): from Crypto.Cipher import AES import base64 key=setti ...
- 通过Go实现AES加密和解密工具
本文包含如下两个内容: AES加密介绍及实现原理 Go实现AES加密和解密工具 AES加密介绍及实现原理 AES( advanced encryption standard)使用相同密钥进行加密和解密 ...
- Php AES加密、解密与Java互操作的问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- Oracle的AES加密与解密用法
Oracle的AES加密与解密用法2013年12月11日 11:50:35 iteye_751 阅读数:428--加密字符串create or replace function des3_enc( i ...
- java独立小程序实现AES加密和解密
一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...
- php的AES加密、解密类
<?php /** * php.ios.Android 通用的AES加密.解密方法 */ namespace Common\Business; class AESCrypt { /** * 初始 ...
- java与C#、.NET AES加密、解密 解决方案
1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...
随机推荐
- JEECG 3.7.3 新春版本发布,企业级JAVA快速开发平台
JEECG 3.7.3新春版本发布 - 微云快速开发平台 导读 ⊙精美Echart报表 ⊙二维码生成功能 ⊙Online接口改造采用JWT机制 ⊙智能菜单搜索 ⊙代码生成器模板优 ...
- elasticsearch-ik
因lucene默认采用英文且英文通过空格就可以断句.而中文则是词组,如果不加载中文词库或插件则会变为一个一个字而非词组,因此需要加载中文词库. 不加分词库所看到的中文分词效果. post _analy ...
- WDA-1-环境配置
1.Internet Communication Manager 确认ICM中提供的HTTP/HTTPS运行正常. Tcode: SMICM -> Display service. ICM在SA ...
- html 基础之canvas 和 localStorage
1,建立一个canvas 画布: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- eclipse 使用Maven deploy命令部署构建到Nexus
转载于:http://blog.csdn.net/jun55xiu/article/details/43051627 1 应用场景:SYS-UTIL(系统工具)项目部署.构建成JAR包(SYS-UT ...
- java后端实习生面试题目
1.编程题:java从10000到99999找到AABB类型 public class Test1 { public static void main(String[] args) { String ...
- c++复习:STL之理论基础
1 STL(标准模板库)理论基础 1.1基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之 ...
- C语言复习:文件操作
文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁 ...
- 解决linux中ssh登录Warning:Permanently added (RSA) to the list of known hosts
原因: 在执行scp id_rsa.pub root@hostname:/root/.ssh这一步时,没在本机的/root/.ssh下生成known_hosts文件. 解决方案: vi /etc/ss ...
- 转:用JS获取地址栏参数的方法(超级简单)
转载链接: http://www.cnblogs.com/fishtreeyu/archive/2011/02/27/1966178.html 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实 ...