起源:
视频下载,解析到一个网站时,发现其视频id是用aes加密过的,用的是这个库。
解密很简单的一句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)
加解密需要用到它,其网址是:
目前最新版本为2.6.1。如何安装及其简单demo,其页面上都 ,而其用法在网上一搜也到处都是,可就是不能解决我的问题,我想是我用错了,但哪种才是对的哪!
crypto-js这个,应该用的是aes默认模式,aes.mode_cbc。js代码也是难懂,总是不停试不停试!
2、加密与解密
直接上代码吧,它满足了需求:
# coding=utf-8import base64from crypto.cipher import aesfrom crypto import randomfrom hashlib import md5
block_size = aes.block_sizedef 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 assert len(salt) == 8, len(salt)
my_data += salt
key = md5(my_data).digest()
final_key = keywhile len(final_key) < output:
key = md5(key + my_data).digest()
final_key += keyreturn 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(bsalted__ + 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写死了它的引用路径,其页面代码有如此写:
#ifdef is_py3km = pymodule_create(&moduledef);#elsem = py_initmodule(crypto.cipher. _module_string, modulemethods);#endif
而用py2exe打包抽取,其把crypto\cipher\_aes.pyd改名为crypto.cipher._aes.pyd文件,放与发布目录下,令人颇长见识
以上就是python--aes加密与解密方法指导的详细内容。