【问题标题】:Key derivation for secp256k1secp256k1 的密钥派生
【发布时间】:2019-01-30 08:21:15
【问题描述】:

为了确定性地从现有密钥生成新的 secp256k1 密钥,仅从旧密钥中获取 sha256 结果并将其用作熵来生成新的 secp256k1 密钥是否安全?使用这种方法,只要我有 oldPrivKeyHex 就可以得到派生密钥。

  const ec = new EC('secp256k1');
  const keyHash = shajs('sha256')
    .update(oldPrivKeyHex)
    .digest();
  var newKey = ec.genKeyPair({ entropy: keyHash });

库源代码: https://github.com/indutny/elliptic

【问题讨论】:

    标签: security cryptography bitcoin elliptic-curve


    【解决方案1】:

    这是可能的,但我会采取不同的做法。我会在另一个密钥上使用散列(或者更好的是,密钥派生函数或 KDF 的结果),然后直接将其用于 fromPrivate 方法或使用带有私钥作为参数的 KeyPair 构造函数.

    原因是没有精确指定随机数生成器。如果在处理随机数生成时发生任何事情,那么您可能会突然得到一个不同的密钥。

    KDF 或哈希方法已经确保熵被压缩,因此不再需要随机数生成器。我当然更愿意使用 SHA-512 或 SHA-256(按此顺序),而不是提供少于 256 位的哈希算法。

    【讨论】:

    • 如果我理解正确,您建议使用 oldPrivKeyHex 作为一些 KDF 的输入来获取新的私钥,并将其用于“fromPrivate 方法”以获取新的密钥对,对吧?如果是这样,有没有推荐的KDF?以及如何确保 KDF 的结果是有效的 secp256k1 私钥?非常感谢!!!!
    • HKDF 不错,但 KDF1 可能更易于使用。如果找不到 KDF,则只需使用散列即可。私钥是介于 0 和 N 之间的随机数,即曲线的阶数。但是实现已经确定了这一点,所以只需向其提供与 EC 密钥大小大致相同的伪随机数据(当然,最好稍大一些)。
    • 您可能还想查看棘轮 wrt 密钥更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多