我在上面找不到任何东西。我收到错误:
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#等(,宏在包含Python.h之前,必须定义PY_SSIZE_T_CLEAN。在Python上3.9及更早版本中,如果定义了Py_ssize_t_CLEAN宏,则长度参数的类型为Py_ssize_t,否则为int。
请参阅https://docs.python.org/3/c-api/arg.html#strings-和缓冲
您可以使用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
问题。