博客
关于我
Python: AES加密与解密
阅读量:797 次
发布时间:2023-03-08

本文共 2072 字,大约阅读时间需要 6 分钟。

AES加密解密:用 Python 实现视频 ID 的加密与解密

起源

在视频下载过程中,我发现某些视频的 ID 被采用 AES 加密处理。通过研究发现,这些加密操作使用了 CryptoJS 库,并提供了一段简短的 JavaScript 解密代码:

t.video = CryptoJS.AES.decrypt(t.video, secret).toString(CryptoJS.enc.Utf8);

尽管看起来简单,但尝试用 Python 实现却遇到了诸多困难,反复尝试各种方法,终究难以奏效。

解密挑战

为了验证加密解密的过程,我采用以下数据进行测试:

  • 加密数据:-85297962_172051801
  • 加密密钥:583a01a9ba901a3adda7252ebca42c09

加密后的结果为:

U2FsdGVkX192df0Gxgia8s93zZp85f9m2nU1VIGU+RZQDtViB1LPBnE0CBWgVDBj

Python 实现:从尝试到成功

1. 寻找合适的库

为了实现 AES 加密与解密功能,我选择了 Python Cryptography Toolkit(简称 pycrypto),其最新版本为 2.6.1。通过查阅资料和实践,我逐步掌握了其使用方法。

2. 实现加密与解密

最终,我成功编写了一个 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:]))

3. 打包与发布

在实际应用中,为了方便分发和使用,我将相关代码进行了打包处理。通过 py2exe 工具,我将 Crypto.Cipher._AES.pyd 动态库打包,并将其放置在发布目录中。

总结

通过这次实践,我深刻体会到技术探索的乐趣和挑战。从最初的困惑,到逐步掌握 AES 加密原理,再到最终实现解密功能,每一个环节都让我受益匪浅。这次经历不仅加深了我对 AES 加密的理解,也提升了我在 Python 开发中的实际能力。

如果你在阅读本文的过程中,也遇到过类似的加密解密问题,不妨随时交流,共同探讨解决方案。

转载地址:http://cblfk.baihongyu.com/

你可能感兴趣的文章