我正在尝试使用PyNacl进行非对称加密(公钥和私钥ssh密钥对(,以安全地传输数据。
我使用的是一个现有的密钥对,它是用openssh格式的ssh-keygen-t ed25519生成的。(下面是我的代码的更多详细信息(
问题基本上是,以前有人成功地做到过这一点吗?是如何做到的?
在提取出我相当确信的密钥后,使用一个名为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_parserpyNaCl:https://pynacl.readthedocs.io/en/latest/public/
好的,问题解决了,可以将pyNaCl与ed25519一起使用,只需正确转换密钥即可。在这里找到了如何做到这一点:gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36
有点烦人的是,这方面的文档不完整。。。