起源:

视频下载,解析到一个网站时,发现其视频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加密与解密的更多相关文章

  1. python AES 加密与解密

    #用aes加密,再用base64 encode def aes_encrypt(data): from Crypto.Cipher import AES import base64 key=setti ...

  2. 通过Go实现AES加密和解密工具

    本文包含如下两个内容: AES加密介绍及实现原理 Go实现AES加密和解密工具 AES加密介绍及实现原理 AES( advanced encryption standard)使用相同密钥进行加密和解密 ...

  3. Php AES加密、解密与Java互操作的问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  4. 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  5. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  6. Oracle的AES加密与解密用法

    Oracle的AES加密与解密用法2013年12月11日 11:50:35 iteye_751 阅读数:428--加密字符串create or replace function des3_enc( i ...

  7. java独立小程序实现AES加密和解密

    一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...

  8. php的AES加密、解密类

    <?php /** * php.ios.Android 通用的AES加密.解密方法 */ namespace Common\Business; class AESCrypt { /** * 初始 ...

  9. java与C#、.NET AES加密、解密 解决方案

      1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...

随机推荐

  1. U3D 编辑器中sceneview下相机操作相关

    前几天在项目中想要实现一个编辑器模式下的3D空间画线功能,几经周折,还是作废. 原因有:相机空间到世界空间转换问题对于Z值不清楚,U3D自定义坐标轴控制问题,射线与平面求交点不对, 一个关键问题是:编 ...

  2. Oracle重建表空间操作实例

    由于环境维护或者性能测试需要,经常需要对表空间进行重建操作.重建表空间操作主要分3中情况介绍,分别是业务表空间.临时表空间和回滚段表空间的重建. 重建业务表空间 由于业务规划要求,重建后的业务表空间名 ...

  3. PHP搜索中的sql注入

    ----------------------------------------------------------------------------------------- 防止查询的sql攻击 ...

  4. Structs复习 ActionMethod

    action在执行的是时候 可以不执行excute方法 可以由自己制定 可以在action标签里指定  也可以在方法里动态指定 推荐使用后者 jar包 web.xml <?xml version ...

  5. HTML框架、列表、表格

    本章内容一.列表1.有序列表ol <ol> <li></li> </ol>type的值有3个 默认为1(阿拉伯数字), 还有A/a(大小写字母),I/i ...

  6. C#图像处理:截图程序(包含鼠标)

    截图后在picbox中显示,用定时器定时每毫秒截图一次,在picbox上显示就有动画效果.代码: [DllImport("user32.dll")] static extern b ...

  7. MySQL 服务无法启动

    拷贝的mysql数据库配置文件的路径网络更改

  8. 学JS的心路历程Day28 - PixiJS -基础(二)

    材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...

  9. java的Timer和TimerTask

    java中Timer类使用的方法是如下的: Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() ...

  10. Mac中安装tensorflow(转)

    当我们开始学习编程的时候,第一件事往往是学习打印"Hello World".就好比编程入门有Hello World,机器学习入门有MNIST.MNIST是一个识别手写数字的程序 M ...