我找不到任何关于此的信息。我收到错误:
Traceback (most recent call last):
File "/path/to/pwdb.py", line 265, in <module>
password_db()
File "/path/to/pwdb.py", line 73, in __init__
self.cipher = AES.new(key,AES.MODE_ECB)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/AES.py", line 95, in new
return AESCipher(key, *args, **kwargs)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/AES.py", line 59, in __init__
blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
self._cipher = factory.new(key, *args, **kwargs)
SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats
我很确定它收到错误的行是:
self.cipher = AES.new(key,AES.MODE_ECB)
该脚本不久前就可以运行了。 PyCrypto 是否更新了其格式或其他内容?有谁知道如何解决这个问题?如果需要,我可以提供更多代码。
卸载 pycryto 并安装 pycryptodome
pip uninstall pycrypto
pip install pycryptodome
听起来好像 python 3.10 的扩展没有更新。
在 3.10 中,任何在解析参数时使用
#
变体的模块都需要在包含 Python.h 之前有 #define PY_SSIZE_T_CLEAN
。
来自文档:
对于所有 # 种格式变体(s#、y# 等),宏 PY_SSIZE_T_CLEAN 必须在包含 Python.h 之前定义。关于Python 3.9 及更早版本,如果定义了 PY_SSIZE_T_CLEAN 宏,则长度参数的类型为 Py_ssize_t,否则为 int。
参见 https://docs.python.org/3/c-api/arg.html#strings-and-buffers
您可以使用 pycryptodome python 包代替 pycrypto。 Pycryptodome 似乎已经取代了当前未维护的 pycrypto 包,并且也可以与 python 3.10 相关的更改一起工作。
我可能已经针对 AES 修复了它,很确定我针对 RIPEMD160 修复了它,因为我的
slotmachine
代码现在在 termux 上运行,而以前不是。代码更改位于 https://github.com/jcomeauictx/pycrypto/commit/38e5ebbf98fea96cf67b354e13fef7d1959ec34a,您可以使用 pip install git+https://github.com/jcomeauictx/pycrypto
安装它。请注意,我没有尝试修复 pycrypto 代码中的任何安全问题,我只是解决了这个 PY_SSIZE_T_CLEAN
问题。
尝试使用使用
bsdiff4
安装的 python 3.10 运行 conda
时遇到相同的错误。
原来
conda
有旧版本的 bsdiff4
(1.1.5)。
卸载
conda
版本的 bsdiff4
并使用 pip
重新安装最新版本 (1.2.4) 修复了该问题。