当铠装弦不是来自 PGPy 时,如何使用 PGPy 解密 pgp 铠装弦?

问题描述 投票:0回答:2

我正在创建一个与使用 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 消息,我只想解密直接就可以了。

python encryption gnupg pgp
2个回答
0
投票

您应该能够使用 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)

0
投票

对于使用非对称密钥的 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'&gt

使用斑点:

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: &gtclass 'pgpy.packet.types.Opaque'&gt
© www.soinside.com 2019 - 2024. All rights reserved.