我已经修改了我的thinkpad的BIOS以删除wifi白名单并计划将修改后的BIOS刷新回eeprom。为此,我必须使用一个名为的工具thinkpad-uefi-标志它对映像进行签名,以便它可以启动。 Thinkpad-uefi-sign 需要使用 pycryptodome。我安装了它使用
apt install python3-pycryptodome
但是它仍然不起作用并出现错误
ModuleNotFoundError: No module named 'Crypto'
当我运行 thinkpad-uefi-sign/verify.py 时。我正在使用 Debian Testing Trixie 以及最新的软件包和 Python 3.11.5。
我尝试的另一件事是使用安装它
pip install pycryptodome
然而,这给出了一个警告,它可能会破坏软件包并使用 apt install python-xyz 来安装它。然后我安装了 python3-full 并使用 python3 -m venv /path/to/venv 设置了 venv(虚拟环境)。我使用以下命令在 venv 中安装了 pycryptodome
/path/to/venv/bin/pip3 install pycryptodome
然后我运行脚本 thinkpad-uefi-sign/verify.py
/path/to/venv/bin/python3 thinkpad-uefi-sign/verify.py Bios_Modded.bin
仍然遇到同样的错误。之后,我尝试使用 venv 中的 pip3 安装 pycryptodomex、Crypto 和 pycrypto,但在运行程序时仍然遇到错误。我还尝试尝试以下答案这另一篇文章,但并没有多大帮助。我还尝试使用 MacBook,由于某种原因它似乎可以在那里工作,因此这可能是与包装相关的问题。将其封装起来可能会有所帮助,这是命令和完整输出。
$ ./python3_venv_with_pycryptodome/bin/python3 thinkpad-uefi-sign/verify.py Bios_Modded.bin
Traceback (most recent call last):
File "/home/witherslayer/Sowa/ThkpX1CG2_UEFIs/workflow/thinkpad-uefi-sign/verify.py", line 19, in <module>
from Crypto.PublicKey import RSA
ModuleNotFoundError: No module named 'Crypto'
答案1
正如 Panki 的评论所述,激活 python venv 后,我能够运行签名软件。我使用以下命令为 bash 执行此操作
$ source <venv>/bin/activate
来自python 文档。
答案2
该库从 3.4.1 开始有一个功能:
3.4.1(2016 年 2 月 21 日)
新功能
- 添加了在包下安装库的选项
Cryptodome
(而不是Crypto
)。
事实上,如果同时安装或使用旧的 PyCrypto 库,则需要避免与旧的 PyCrypto 库发生冲突,如源中所述:
任何一个:
几乎是旧 PyCrypto 库的直接替代品。
You install it with:: pip install pycryptodome In this case, all modules are installed under the `Crypto` package. You can test everything is right with:: pip install pycryptodome-test-vectors python -m Crypto.SelfTest
必须避免同时拥有 PyCrypto 和 PyCryptodome同时安装,因为它们会互相干扰。因此,仅当您确定整个应用程序部署在
virtualenv
.
或者:
独立于旧 PyCrypto 的库。
您可以使用以下命令安装它:
pip install pycryptodomex You can test everything is right with:: pip install pycryptodome-test-vectors python -m Cryptodome.SelfTest
在这种情况下,所有模块都安装在该
Cryptodome
包下。旧的 PyCrypto 和 PyCryptodome 可以共存。
Debian 作为 aa 发行商选择此选项是为了避免任何潜在的冲突(即使它根本不提供旧的 PyCrypto):
touch .separate_namespace
use_separate_namespace = os.path.isfile(".separate_namespace")
other_project = "pycryptodomex" other_root = "Cryptodome"
if use_separate_namespace: project_name, other_project = other_project, project_name package_root, other_root = other_root, package_root
最后也可以使用 Debian 的打包库(不带 venv):替换Crypto
为Cryptodome
insign.py
和verify.py
。