本文共 2072 字,大约阅读时间需要 6 分钟。
在视频下载过程中,我发现某些视频的 ID 被采用 AES 加密处理。通过研究发现,这些加密操作使用了 CryptoJS 库,并提供了一段简短的 JavaScript 解密代码:
t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);
尽管看起来简单,但尝试用 Python 实现却遇到了诸多困难,反复尝试各种方法,终究难以奏效。
为了验证加密解密的过程,我采用以下数据进行测试:
-85297962_172051801583a01a9ba901a3adda7252ebca42c09加密后的结果为:
U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj
为了实现 AES 加密与解密功能,我选择了 Python Cryptography Toolkit(简称 pycrypto),其最新版本为 2.6.1。通过查阅资料和实践,我逐步掌握了其使用方法。
最终,我成功编写了一个 Python 脚本,用于 AES 加密与解密。以下是代码的核心部分:
import base64from Crypto.Cipher import AESfrom Crypto import Randomimport hashlibBLOCK_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): assert len(salt) == 8, "Salt must be 8 bytes long" my_data += salt key = hashlib.md5(my_data).digest() final_key = key while len(final_key) < output: key = hashlib.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:]))
在实际应用中,为了方便分发和使用,我将相关代码进行了打包处理。通过 py2exe 工具,我将 Crypto.Cipher._AES.pyd 动态库打包,并将其放置在发布目录中。
通过这次实践,我深刻体会到技术探索的乐趣和挑战。从最初的困惑,到逐步掌握 AES 加密原理,再到最终实现解密功能,每一个环节都让我受益匪浅。这次经历不仅加深了我对 AES 加密的理解,也提升了我在 Python 开发中的实际能力。
如果你在阅读本文的过程中,也遇到过类似的加密解密问题,不妨随时交流,共同探讨解决方案。
转载地址:http://cblfk.baihongyu.com/