PyNaCl 中的 64 字节密钥
64 bytes keys in PyNaCl
有没有办法在 PyNaCl 中使用 64 字节密钥?
我正在使用 PyNaCl 中的签名函数。我可以在哪里 sign messages and verify 他们使用非对称加密。据我所知,签名的基本实现使用 32 字节密钥。
现在:我还想使用我在 Python 中使用的相同密钥在 R 中签署消息。因此,我使用 sodium 包。这个包使用 64 字节的密钥(和相同的算法)。
有没有办法让任一包使用 32 或 64 字节的密钥,以便我可以在其他语言中重复使用这些密钥?
谢谢!
好的。原来,这里的问题是我对签名算法的理解。
PyNaCl 库更依赖于用于创建私钥的种子。这个种子是 32 字节,可以用来代替 64 字节的密钥。
sodium 包使用 64 字节密钥,只允许您直接指定此密钥。但不是种子。
因此,我真正想做的是在创建私钥时,保存密钥和种子。有了密钥,我可以在 R 中使用钠包,有了种子,我可以重建 PyNaCl 库的密钥。
更新 (2020-11-03)
我的特定用例在 Python 中创建密钥,然后在 Python 和 R 中读取它们。我将说明这种行为。
我发现,如果您使用 SigningKey
的实例并将其转换为字节,PyNaCl
库会公开种子,但它仍然具有实际签名密钥的表示形式属性 _signing_key
:
from nacl.signing import SigningKey
signing_key = SigningKey.generate()
# This gives you the 32 bytes seed
bytes(signing_key)
# This gives you the 64 bytes actual key
signing_key._signing_key
(真的,种子和密钥在这里可以互换。如果你有种子,你就可以从中计算出密钥。据我所知,这是一个实现细节,直到库向你公开了什么. 使用 32 字节的种子当然效率更高,因为你只需要存储 32 字节而不是 64。)
然后,我继续保存 64 字节密钥和 32 字节种子。我稍后可以使用 PyNaCl
库再次在 Python 中导入 32 字节种子。在 R 中,我可以通过以下方式导入密钥:
keyFile <- "path/to/the/key"
key.char <- readChar(keyFile, file.info(keyFile)$size)
key <- base64enc::base64decode(key.char)
# Sign messages using this key with the sodium library
sodium::sig_sign(charToRaw("your private message"), key)
有没有办法在 PyNaCl 中使用 64 字节密钥?
我正在使用 PyNaCl 中的签名函数。我可以在哪里 sign messages and verify 他们使用非对称加密。据我所知,签名的基本实现使用 32 字节密钥。
现在:我还想使用我在 Python 中使用的相同密钥在 R 中签署消息。因此,我使用 sodium 包。这个包使用 64 字节的密钥(和相同的算法)。
有没有办法让任一包使用 32 或 64 字节的密钥,以便我可以在其他语言中重复使用这些密钥?
谢谢!
好的。原来,这里的问题是我对签名算法的理解。
PyNaCl 库更依赖于用于创建私钥的种子。这个种子是 32 字节,可以用来代替 64 字节的密钥。
sodium 包使用 64 字节密钥,只允许您直接指定此密钥。但不是种子。
因此,我真正想做的是在创建私钥时,保存密钥和种子。有了密钥,我可以在 R 中使用钠包,有了种子,我可以重建 PyNaCl 库的密钥。
更新 (2020-11-03)
我的特定用例在 Python 中创建密钥,然后在 Python 和 R 中读取它们。我将说明这种行为。
我发现,如果您使用 SigningKey
的实例并将其转换为字节,PyNaCl
库会公开种子,但它仍然具有实际签名密钥的表示形式属性 _signing_key
:
from nacl.signing import SigningKey
signing_key = SigningKey.generate()
# This gives you the 32 bytes seed
bytes(signing_key)
# This gives you the 64 bytes actual key
signing_key._signing_key
(真的,种子和密钥在这里可以互换。如果你有种子,你就可以从中计算出密钥。据我所知,这是一个实现细节,直到库向你公开了什么. 使用 32 字节的种子当然效率更高,因为你只需要存储 32 字节而不是 64。)
然后,我继续保存 64 字节密钥和 32 字节种子。我稍后可以使用 PyNaCl
库再次在 Python 中导入 32 字节种子。在 R 中,我可以通过以下方式导入密钥:
keyFile <- "path/to/the/key"
key.char <- readChar(keyFile, file.info(keyFile)$size)
key <- base64enc::base64decode(key.char)
# Sign messages using this key with the sodium library
sodium::sig_sign(charToRaw("your private message"), key)