重要提醒:pycrypto 已被废弃
你需要了解一个非常重要的背景信息:pycrypto 项目已经不再维护多年,并且存在已知的安全漏洞。
- 不再维护:自 2025 年以来就没有发布过新版本。
- 安全风险:其代码库中存在多个安全漏洞,使得它不再适合用于生产环境。
强烈建议不要在新项目中使用 pycrypto,你应该使用它的替代品,特别是 pycryptodome。
为什么还要讲 pycrypto 的安装?
尽管 pycrypto 已被废弃,但你可能会在非常老旧的项目或遗留代码中遇到它,了解如何安装它有助于你维护这些旧系统,但请务必在修复安全漏洞后,尽快将项目迁移到新的库上。
pycrypto 的安装方法
pycrypto 的安装在不同操作系统上可能会遇到一些问题,尤其是在 Windows 上。
使用 pip (推荐尝试)
这是最简单的方法,适用于大多数情况。
pip install pycrypto
可能遇到的问题:
- Windows 用户:在 Windows 上,
pip install pycrypto经常会失败,因为它需要编译 C 代码,而缺少必要的编译环境(如 Microsoft Visual C++ Build Tools)。 - Linux/macOS 用户:如果系统缺少编译工具(如
gcc,make),安装也会失败,在 Debian/Ubuntu 上,你需要先安装build-essential:sudo apt-get update sudo apt-get install build-essential
然后再尝试
pip install pycrypto。
使用预编译的 Whl 文件 (解决 Windows 安装问题)
pip install 失败,最可靠的解决方案是下载与你 Python 版本和系统架构匹配的预编译包(.whl 文件)。
-
确定你的 Python 版本和系统架构:
- 打开命令行,运行
python --version或python3 --version查看你的 Python 版本(8.10)。 - 运行
python -c "import platform; print(platform.architecture())"查看你的系统架构(64bit或32bit)。
- 打开命令行,运行
-
下载 Whl 文件: 访问非官方的、社区维护的 PyPI 镜像网站,如 Christoph Gohlke's Unofficial Windows Binaries for Python Extension Packages,找到
pycrypto并下载与你环境匹配的文件。 -
使用 pip 安载下载的文件: 假设你下载的文件是
pycrypto‑2.6.1‑cp38‑cp38‑win_amd64.whl(Python 3.8, 64位 Windows),并且文件保存在Downloads文件夹中,在命令行中运行:pip install C:\Users\YourUsername\Downloads\pycrypto‑2.6.1‑cp38‑cp38‑win_amd64.whl
(请将路径替换为你实际的文件路径)
现代且安全的替代方案:pycryptodome
pycryptodome 是 pycrypto 的一个分支,它是一个活跃维护的、功能完全兼容的替代品。所有新项目都应该使用 pycryptodome。
为什么选择 pycryptodome?
- 活跃维护:持续更新,修复了
pycrypto的安全漏洞。 - 功能兼容:
pycryptodome是pycrypto的一个“drop-in replacement”(直接替换),这意味着你几乎不需要修改任何代码,只需要将导入语句从from Crypto import ...改为from Cryptodome import ...即可。 - 易于安装:它是一个纯 Python 包,不需要编译,在任何平台上都可以通过
pip轻松安装。
安装 pycryptodome
pip install pycryptodome
从 pycrypto 迁移到 pycryptodome 的示例
假设你旧的 pycrypto 代码是这样的:
# 旧代码 (使用 pycrypto) from Crypto.Cipher import AES from Crypto import Random key = b'This is a key123' iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = b'This is a secret message' msg = iv + cipher.encrypt(plaintext) print(msg)
你需要做两处修改:
- 安装新库:
pip install pycryptodome
- 修改代码中的导入语句:将
Crypto改为Cryptodome。
# 新代码 (使用 pycryptodome) from Cryptodome.Cipher import AES from Cryptodome import Random # 这里也从 Crypto 改为 Cryptodome key = b'This is a key123' iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = b'This is a secret message' msg = iv + cipher.encrypt(plaintext) print(msg)
就是这么简单!其他所有 API 调用都保持不变。
总结与建议
| 特性 | pycrypto |
pycryptodome |
|---|---|---|
| 状态 | 已废弃,不安全 | 推荐使用,活跃维护 |
| 安装 | 复杂,常需编译 | 简单,pip install 即可 |
| 代码修改 | - | 仅需将 from Crypto 改为 from Cryptodome |
| 适用场景 | 维护极其老旧的遗留项目 | 所有新项目和需要更新的旧项目 |
最终建议:
- 对于新项目:直接使用
pycryptodome或其他现代加密库(如cryptography)。 - 对于需要维护的旧项目:
- 如果项目使用了
pycrypto,请立即将其迁移到pycryptodome。 - 在迁移过程中,检查代码是否存在
pycrypto的已知漏洞模式,并进行修复。 - 将
pip install pycrypto替换为pip install pycryptodome,并修改相应的import语句。
- 如果项目使用了
