我正在尝试使用 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/