【问题标题】:64 bytes keys in PyNaClPyNaCl 中的 64 字节密钥
【发布时间】:2019-09-17 12:04:48
【问题描述】:

有没有办法在PyNaCl 中使用 64 字节的密钥?

我正在使用 PyNaCl 中的签名函数。我可以在哪里使用非对称密码学sign messages and verify他们。据我所知,签名的基本实现使用 32 字节密钥。

现在:我还想使用我在 Python 中使用的相同密钥在 R 中签署消息。因此,我使用 sodium 包。这个包使用 64 字节的密钥(和相同的算法)。

有没有办法让任一包使用 32 或 64 字节的密钥,以便我可以在其他语言中重用密钥?

谢谢!

【问题讨论】:

    标签: python r libsodium pynacl


    【解决方案1】:

    好的。原来,这里的问题是我对签名算法的理解。

    PyNaCl 库更多地依赖于用于创建私钥的种子。这个种子是 32 字节,可以用来代替 64 字节的密钥。

    钠包使用 64 字节的密钥,只允许您直接指定此密钥。但不是种子。

    因此,我真正想做的是在创建私钥时,保存密钥和种子。有了密钥,我可以使用 R 中的钠包,有了种子,我可以重建 PyNaCl 库的密钥。

    更新(2020-11-03)

    我的特定用例在 Python 中创建键,然后在 Python 和 R 中读取它们。我将说明这种行为。

    我发现PyNaCl 库会公开种子,如果您采用SigningKey 的实例并将其转换为字节,但它仍然具有作为属性_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)
    

    【讨论】:

    • 嗨!您最终为此使用了哪些调用/方法?我遇到了同样的问题,我被困住了
    • @TurtleNetwork 我添加了一个示例。希望这会有所帮助。
    • 这实际上是我现阶段缺少的部分。你帮了我很多。很有用
    • 你知道种子和密钥的区别吗?我确实注意到密钥的前 32 个字节是种子。有什么理由同时保留它们吗??
    • 用于签名的“64字节”密钥实际上是32字节种子+32字节公钥。您始终可以从种子中派生公钥 - 因此您始终可以仅从 32 字节种子中派生完整的 64 字节密钥,但它们通常以性能为由保持在一起 - 即生成公钥需要很多周期来自种子的密钥。
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多