我可以将 pyNaCl 密封盒与现有的 openssh 密钥对一起使用吗?
Can I use pyNaCl sealed boxes with an existing openssh key pair?
我正在尝试使用 PyNacl 进行非对称加密(public 和私人 ssh 密钥对)以安全地传输数据。
我使用的是通过 ssh-keygen -t ed25519 以 openssh 格式生成的现有密钥对。 (下面我的代码的更多细节)
问题基本上是,以前有人成功地做到过吗?如何做到的?
提取后,我相当有信心使用名为 openssh 密钥解析器的库获取密钥。 (64 字节,32 私有然后 32 public)
"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'"
我使用 public 密钥创建一个密封盒来进行加密
#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 生成一个 public 密钥(server_privk.public_key 属性),它与我知道的 public 密钥不匹配是正确的并在第一个 SealedBox 中使用。
我尝试将 server_privk.public_key 重新分配给我用来制作第一个盒子的同一个键,但这给了我同样的问题。
我目前的想法是:
- 我不知何故遗漏了一些关于 openssh 格式如何工作的东西(可能没有得到正确的私钥字节,也许我必须对它们进行转换,也许 openssh 密钥解析器库搞砸了)。
- 我不应该使用 openssh,而是转换我的密钥格式并可能使用另一个库来处理加密。
任何答案或想法将不胜感激:)
参考资料:
openssh 解析器:https://github.com/scottcwang/openssh_key_parser
氯化钠:https://pynacl.readthedocs.io/en/latest/public/
好的,问题解决了,pyNaCl可以和ed25519一起使用,你只需要正确转换密钥即可。
在这里找到了如何做到这一点:gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36
有点烦人,文档不完整...
我正在尝试使用 PyNacl 进行非对称加密(public 和私人 ssh 密钥对)以安全地传输数据。
我使用的是通过 ssh-keygen -t ed25519 以 openssh 格式生成的现有密钥对。 (下面我的代码的更多细节)
问题基本上是,以前有人成功地做到过吗?如何做到的?
提取后,我相当有信心使用名为 openssh 密钥解析器的库获取密钥。 (64 字节,32 私有然后 32 public)
"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'"
我使用 public 密钥创建一个密封盒来进行加密
#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 生成一个 public 密钥(server_privk.public_key 属性),它与我知道的 public 密钥不匹配是正确的并在第一个 SealedBox 中使用。
我尝试将 server_privk.public_key 重新分配给我用来制作第一个盒子的同一个键,但这给了我同样的问题。
我目前的想法是:
- 我不知何故遗漏了一些关于 openssh 格式如何工作的东西(可能没有得到正确的私钥字节,也许我必须对它们进行转换,也许 openssh 密钥解析器库搞砸了)。
- 我不应该使用 openssh,而是转换我的密钥格式并可能使用另一个库来处理加密。
任何答案或想法将不胜感激:)
参考资料: openssh 解析器:https://github.com/scottcwang/openssh_key_parser 氯化钠:https://pynacl.readthedocs.io/en/latest/public/
好的,问题解决了,pyNaCl可以和ed25519一起使用,你只需要正确转换密钥即可。 在这里找到了如何做到这一点:gist.github.com/R-VdP/b7ac0106a4fd395ee1c37bfe6f552a36
有点烦人,文档不完整...