如何解决为什么我需要从 Crypto 导入 Hash 和从 Crypto.Cipher 导入 PKCS1_OAEP 才能使 Hash.MD5 工作?
同时使用 PKCS1_OAEP 和哈希
from Crypto.Cipher import PKCS1_OAEP
from Crypto import Hash
Hash.MD5
该代码可以正常工作。
只用哈希
from Crypto import Hash
Hash.MD5
该代码给了我以下错误:
Traceback (most recent call last):
File "test.py",line 3,in <module>
Hash.MD5
AttributeError: module 'Crypto.Hash' has no attribute 'MD5'
仅使用 PKCS1_OAEP
这也不起作用:
from Crypto.Cipher import PKCS1_OAEP
Hash.MD5
出现这个错误:
Traceback (most recent call last):
File "test.py",in <module>
Hash.MD5
NameError: name 'Hash' is not defined
我觉得它应该只与 from Crypto import Hash
一起工作,但显然不是这样。有什么想法吗?
(我运行的是 Python 3.8.3)
解决方法
我在 https://discuss.python.org/t/why-do-i-need-to-import-both-hash-from-crypto-and-pkcs1-oaep-from-crypto-cipher-for-hash-md5-to-work/6840/3 上发布了这个,这是我得到的回复:
我认为问题在于 Crypto.Hash 本身是一个包,而不是一个 模块。这意味着有一个 MD5 模块 inside Crypto.Hash。
当您导入 Crypto.Hash 时,它会运行该文件 …/site-packages/Crypto/Hash/init.py。这将定义各种 名称(可能没有 - 通常是一个空的占位符),但不会 固有地导入它旁边的所有模块。
因此,当您“导入 Crypto.Hash”时,您将获得名称“Hash”,其中包含 由 Hash 包中的 init.py 文件定义的东西。那 并不意味着有一个 Hash.MD5 名称。
相反,“from Crypto.Hash import MD5”从 Crypto.Hash package(模块集合),即 Crypto.Hash.MD5 模块本身,并在您自己的命名空间中为其命名为“MD5”。
此处的“API 原则”下有该表单的示例:
https://www.pycryptodome.org/en/latest/src/hash/hash.html
这是:
from Crypto.Hash import SHA256
我同意这是一种不幸的用户体验(您是用户)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。