我正在创建一个与使用 PGP 加密的服务器通信的脚本来加密其响应。
我可以请求服务器的公钥,并使用该密钥通过 PGPy 库加密我的请求,服务器能够解密并响应。
脚本加密请求中包含公钥,服务器期望将其作为其 API 的一部分,因此它采用该密钥并加密响应并将其发送回我的脚本。我的脚本可以正常接收此加密响应,但 PGPy 似乎缺乏解密它的工具。
据我所知,PGPy 只能解密它加密的消息,因为
PGPKey.decrypt()
采用 PGPMessage
对象,而不是铠装字符串,并且我找不到任何采用铠装字符串并解密它或将其变成 PGPMessage
以便我可以解密它。
据我所知:
def get_token_from_payload(encrypted_payload):
print("Payload: ", encrypted_payload)
privkey, _ = pgpy.PGPKey.from_file('private.key')
message_blob = pgpy.PGPMessage.new(encrypted_payload)
token_string = privkey.decrypt(message_blob).message
print("Token: ", token_string)
return json.load(token_string)
我认为会做正确的事情的
message_blob = pgpy.PGPMessage.new(encrypted_payload)
却没有这样做,而是创建了自己的加密文本 blob,而 token_string = privkey.decrypt(message_blob).message
行只是简单地返回到我开始使用的装甲 ascii 字符串。当然,最后一行失败了,因为没有 json
可以做任何事情,所以我们现在会忽略它,因为一旦 PGPy 解密东西就应该可以正常工作。
我一定是错过了什么。如果这个库不能做到这一点,它基本上就没用了。如何解密铠装字符串或将铠装字符串转换为可以解密的
PGPMessage
?
更新:
def get_token_from_payload(encrypted_payload):
ep_file = open("ep.pgp", "w")
ep_file.write(encrypted_payload)
ep_file.close()
privkey, _ = pgpy.PGPKey.from_file('private.key')
message = pgpy.PGPMessage.from_file("ep.pgp")
token_string = privkey.decrypt(message).message
return json.loads(token_string)
这个解决方案确实有效,但我觉得它不可接受,因为它需要一组无关的 IO 步骤,创建一个文件,然后将其读回。我已经在内存中保存了装甲 ascii 消息,我只想解密直接就可以了。
您应该能够使用 pgpy.PGPMessage.from_blob() 从内存中的 ascii 铠装字符串创建 PGPMessage 对象
def get_token_from_payload(encrypted_payload):
print("Payload: ", encrypted_payload)
privkey, _ = pgpy.PGPKey.from_file('private.key')
message_blob = pgpy.PGPMessage.from_blob(encrypted_payload)
token = privkey.decrypt(message_blob).message
print("Token: ", token)
return json.load(token)
您可能还需要将令牌值从字节数组转换为字符串。像这样的东西应该有效:
token_string = str(token, 'UTF-8')
print("Token: ", token_string)
return json.load(token_string)
对于使用非对称密钥的 pgp 加密数据文件,我在 0.6.0 中收到此错误。 pgp 文件使用 gpg --encrypt 命令加密,看起来不错,我可以使用 gpg --decrypt 命令解密它。
这是我的命令错误:
pgpy.PGPMessage.from_file( '/path/data_file.csv.pgp' )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/types.py", line 184, in from_file
po = obj.parse(data)
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/pgp.py", line 1293, in parse
self |= Packet(data)
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/pgp.py", line 1080, in __or__
raise NotImplementedError(str(type(other)))
NotImplementedError: <class 'pgpy.packet.types.Opaque'>
使用斑点:
pgpy.PGPMessage.from_blob( open(encrypted_files_path_prefix+enc_file_name).read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/types.py", line 195, in from_blob
po = obj.parse(bytearray(blob, 'latin-1'))
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/pgp.py", line 1293, in parse
self |= Packet(data)
File "/xxx/python/venv2/lib/python3.9/site-packages/pgpy/pgp.py", line 1080, in __or__
raise NotImplementedError(str(type(other)))
NotImplementedError: >class 'pgpy.packet.types.Opaque'>