【问题标题】:SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formatsSystemError:必须为 \'#\' 格式定义 PY_SSIZE_T_CLEAN 宏
【发布时间】:2022-09-26 00:01:02
【问题描述】:

我在这方面找不到任何东西。我收到错误:

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 是否更新了其格式或其他内容?有没有人知道如何解决这个问题?如果需要,我可以提供更多代码。

    标签: python pycrypto


    【解决方案1】:

    听起来扩展没有为 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

    【讨论】:

      【解决方案2】:

      您可以使用pycryptodome python 包代替 pycrypto。 Pycryptodome 似乎已经取代了当前未维护的 pycrypto 包,并且与 python 3.10 相关的更改也一样。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      【解决方案3】:

      我可能已经为 AES 修复了它,我很确定我为 RIPEMD160 修复了它,因为我的 slotmachine 代码现在在 termux 上运行,而以前不是。代码更改位于https://github.com/jcomeauictx/pycrypto/commit/38e5ebbf98fea96cf67b354e13fef7d1959ec34a,您可以使用pip install git+https://github.com/jcomeauictx/pycrypto 安装它。请注意,我没有尝试修复 pycrypto 代码中的任何安全问题,我只解决了这个PY_SSIZE_T_CLEAN 问题。

      【讨论】:

        【解决方案4】:

        卸载 pycryto 并安装 pycryptodome

        pip uninstall pycrypto
        pip install pycryptodome
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        【解决方案5】:

        你的解决方案对我有用。 PY_SSIZE_T_CLEAN 工作正常。但是现在 TelegramDesktop 正在向我询问我必须拥有的密码。

        "┌──(lobogimp㉿kalifornia)-[~] └─$ pip卸载pycrypto 找到现有安装:pycrypto 2.7a1 卸载 pycrypto-2.7a1: 将删除: /home/lobogimp/.local/lib/python3.10/site-packages/Crypto/* /home/lobogimp/.local/lib/python3.10/site-packages/pycrypto-2.7a1.dist-info/* 继续(是/否)?是的 成功卸载 pycrypto-2.7a1

        ┌──(lobogimp㉿kalifornia)-[~] └─$ pip install pycryptodome 默认为用户安装,因为普通站点包不可写 收集 pycryptodome 下载 pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl (2.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 2.3 MB/s eta 0 :00:00 安装收集的包:pycryptodome 成功安装pycryptodome-3.15.0

        ┌──(lobogimp㉿kalifornia)-[~] └─$ /usr/bin/telegram2john ~/.local/share/TelegramDesktop 注意:没有为此文件/帐户设置密码:'/home/lobogimp/.local/share/TelegramDesktop/tdata/key_datas'(跳过)“

        谢谢你的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-09
          • 1970-01-01
          相关资源
          最近更新 更多