2

我正在尝试使用 PyNacl 进行非对称加密(公共和私有 ssh 密钥对)以安全地传输数据。

我正在使用 ssh-keygen -t ed25519 以 openssh 格式生成的现有密钥对。(下面我的代码的更多细节)

问题基本上是,以前有没有人成功地做到过这一点,以及如何做到的?

在提取出我相当有信心的是带有一个名为 openssh 密钥解析器的库的密钥。(64 个字节,32 个私有然后 32 个公共)

"private_public": "b'2\\xfbO\\xab\\xd1\\\\Ie\\xa3\\x8b\\xc9\\x16\\xe8\\xd5\\xfcc\\xdc\\xa5k+H\\tQ\\xae\"\\x1c5+\\x89Q\\xe1p\\xf5\\x01\\xe4\\xfa\\xa1<[5\\xc4\\x07\\xc8\\xf5\\xd5\\xa7\\xbb\\xa3\\xefZm\\x99\\xd7<y\\x96\\xda\\x89x\\x04\\xcc\\x0e8p'"

我使用公钥创建一个密封的盒子来进行加密

#load the public key
server_pubk = (OpenPublicKey.from_string(server_pubk_file_content))
#get exactly the key bytes
server_pubk = server_pubk.params.data['public']
#pass the key bytes to nacl
server_pubk = nacl.public.PublicKey(server_pubk)
#now we create the nacl SealedBox 
sealed_box = SealedBox(server_pubk)
#and encrypt a message
encrypted = sealed_box.encrypt(message)

据我所知,这按预期工作。我的问题是当我尝试使用私钥创建一个将解密消息的密封盒时。

unseal_box = SealedBox(server_privk)
plaintext = unseal_box.decrypt(encrypted) #does not work with the unhelpful error traceback below :

File "script.py", line 140, in <module>
unseal_box.decrypt(encrypted)
File "/usr/lib/python3.7/site-packages/nacl/public.py", line 361, in decrypt self._private_key,
File "/usr/lib/python3.7/site-packages/nacl/bindings/crypto_box.py", line 318, in crypto_box_seal_open
raising=exc.CryptoError)
File "/usr/lib/python3.7/site-packages/nacl/exceptions.py", line 81, in ensure
raise raising(*args)
nacl.exceptions.CryptoError: An error occurred trying to decrypt the message

我戳了一下,发现当我这样做的时候

server_privk = nacl.public.PrivateKey(server_privk)

为了创建将由 SealedBox 使用的 PrivateKey 对象,nacl 生成一个公钥(server_privk.public_key 属性),它与我知道正确并在第一个 SealedBox 中使用的公钥不匹配。

我尝试将 server_privk.public_key 重新分配给我用来制作第一个盒子的同一密钥,但这给了我同样的问题。

我目前的想法是:

  • 我不知何故遗漏了有关 openssh 格式如何工作的一些东西(可能没有得到正确的私钥字节,也许我必须对它们进行转换,也许 openssh 密钥解析器库把事情搞砸了)。
  • 我不应该使用 openssh,而是转换我的密钥格式,也许使用另一个库来处理加密。

任何答案或想法将不胜感激:)

参考:openssh 解析器:https ://github.com/scottcwang/openssh_key_parser pyNaCl:https ://pynacl.readthedocs.io/en/latest/public/

4

1 回答 1

0

好的,问题解决了,可以将 pyNaCl 与 ed25519 一起使用,您只需正确转换密钥。在这里找到如何做到这一点:gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36

有点烦人的文档是不完整的......

于 2020-12-16T11:12:32.957 回答