博客
关于我
Python: AES加密与解密
阅读量:800 次
发布时间: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/

你可能感兴趣的文章
Python合并两张图片 | 先叠透明度再合并 (附Demo)
查看>>
python各进制的表述与转换
查看>>
python各种库安装
查看>>
python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
查看>>
python可维护性_使用这7大神器,让你的Python 代码更容易于维护
查看>>
python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
查看>>
Python变量命名方法-ChatGPT4o作答
查看>>
Python变量与运算符
查看>>
python单元测试之unittest
查看>>
Python单元测试unittest实战
查看>>
python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
查看>>
Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
查看>>
Python加速运行技巧
查看>>
python办公自动化基础遍历文件夹
查看>>
python办公自动化基础输出文件和文件夹
查看>>
python办公自动化基础搜索文件
查看>>
python前端之css
查看>>
Python制作进度条,原来有这么多方法
查看>>
Python制作简单的学生成绩管理系统
查看>>
python制作甘特图的基本知识(附Demo)
查看>>