python - 序列化公钥时“无法反序列化密钥数据”
问题描述
我正在尝试使用“密码学”模块加载公钥,看起来我正在复制他们所拥有的代码(在此处发布),只进行了一些小的更改:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
def encrypt(message, publicKeyPath):
with open(publicKeyPath, 'rb') as keyFile:
privateKey = serialization.load_pem_private_key(
keyFile.read(),
password=None,
backend=default_backend()
)
print(privateKey)
message = 'This message will be encrypted'
publicKeyPath = '/(path to key)/My First Key_public.pem'
encryptedMessage = encrypt(message, publicKeyPath)
但是,我不断收到错误“无法反序列化关键数据”。这是完整的回溯:
Traceback (most recent call last):
File "/Users/max.s.haberman/Documents/Code/Experiments/Encryption/encryption2.py", line 23, in <module>
encryptedMessage = encrypt(message, publicKeyPath)
File "/Users/max.s.haberman/Documents/Code/Experiments/Encryption/encryption2.py", line 9, in encrypt
backend=default_backend()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
return backend.load_pem_private_key(data, password)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1186, in load_pem_private_key
password,
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1411, in _load_key
self._handle_key_loading_error()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1465, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
这是我正在使用的公钥,它在其他地方运行良好:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkaqpgfRRZa0H8A7v3ebJ
z+lM+j0Jdw2xftUoIDmGWkrQ0vJXnkCwP/zcALI/mgAlMtr4KDSrE0n7/+1u1uB+
DuhdjuGhu5EAAdA+N1yMOCRNfYRJFpAtQLO2qu6h6wU1HmVLIK87kyTAoVcn+HIX
4uMiQbNG7PH2Cv+VaQvA91I/tTcSkY/ZrGTYcFHa0k+sSGxqQDW7C7mu5RKssxAa
QCSnAUOjV+j1lUMvWYr8qs5yI4wRsFH6sP6m2/Ksrj1i3+DSOWJOy/WQs1e1CBcA
cVfyM+dflllneNkF6rnB0n2wIE4TeRatzy6AlSjQ7FohSkAfOMW6GwszVhEFSAu2
4QIDAQAB
-----END PUBLIC KEY-----
我错过了什么吗?还有什么我需要做的吗?看起来其他 StackOverflow 用户也遇到过这个问题,但我认为他们的情况不适用于我,因为我的密钥不包括空格、工作公钥已经创建等等。任何帮助表示赞赏。提前致谢!
解决方案
链接代码是指私钥。但是对于加密,您需要公钥(解密需要私钥):
publicKey = serialization.load_pem_public_key(
keyFile.read(),
backend=default_backend()
)
发布的密钥似乎没问题。它是 PKCS8 格式的 PEM 编码公钥。
可以在此处找到(仍然缺少)加密的示例。
推荐阅读
- android - 什么时候会在 MediaPlayer 中启动 onCompletion?
- javascript - 带有 React 的 Typescript - 通过 LI 元素循环的 TS 错误
- julia - 是否可以为矩阵分解预先分配数组?
- java - 启用 EditText 下划线
- javascript - React.js Material-Table 将选定的行传递到另一个页面
- php - 如何在 laravel 中使用 javascript 通过输入(文本字段)将数据添加到 HTML 表中?
- pandas - TypeError:必须是 str,而不是 float - 线性回归
- swift - 使用“自我”有什么区别。在闭包的捕获列表中添加前缀并写入“self”?
- c++11 - 是否可以在函数中定义全局变量并使用 C++ 中的预处理器指令在其他函数中使用该变量?
- r - 是否有一个 R 函数来查看它们的中值如何随 2 个分类变量而变化?