博客
关于我
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、IMAP 和 GMail.将消息标记为已查看
查看>>
python一个一个获取迭代器的元素
查看>>
python一维数组 提取_python – 如何从numpy中的1维数组中提取零维切片
查看>>
python三大库之--numpy(一)
查看>>
python三大库之--numpy(二)
查看>>
python上的字无效字符_标识中的无效字符
查看>>
python下用decode和encode 中文转码
查看>>
Python下调用Linux的Shell命令
查看>>
Python接口自动化测试实战系列
查看>>
python下载_安装_配置_以及第一行python程序---python工作笔记009
查看>>
Python不协调机器人消息.内容
查看>>
Python与C#之间内存共享互传信息
查看>>
python与c语言混合编程_你试过C语言和Python一起混合编程吗?两者相加不是已经无敌了!...
查看>>
python与excel
查看>>
Python与Excel的完美邂逅:深入浅出,手把手教你轻松玩转Excel数据操作
查看>>
python与flask_Python编程中flask的简介与简单使用
查看>>
python与图灵机器人交互(WXPY版本)
查看>>
python与运算符_python运算符
查看>>
python两个列表获取交集,并集,差集
查看>>
python两个字典合并,两个list合并
查看>>