首页 > 解决方案 > 使用带有曲线 secp224k1 的私钥签署 ECDSA

问题描述

标签: authenticationcryptographybouncycastlesignatureecdsa

解决方案


  • 根据指令的第 10 步,应该签名的不是 40 字节消息,而是这条消息的 SHA224-hash:客户端签署 40 字节消息的 28 字节 SHA-224 摘要...。请注意,数据不会由 - 方法自动散列GenerateSignature,即必须显式散列,另请参见此处和这些示例

  • -Org.BouncyCastle.Math.BigInteger.ToByteArray方法(在 C# 代码中使用)以大端格式输出字节数组(与 .Net 不同,其System.Numerics.BigInteger.ToByteArray- 方法使用小端格式)。因此,没有必要颠倒字节顺序(使用Reverse- 方法)。

  • 通过这些修改,签名是:

      r = 0x1781ff4997b48d389f518df75001c4b6564082956228d74dd0321656
      s = 0x0aadc68cf78dc75d44fb300f200465e72a70826ec2d5577d49b62e59
    

    但是,它仍然与说明中显示的签名不同。

    在 C# 代码中,ECDsaSigner-instance 使用 -instance 创建HMacDsaKCalculator,生成基于RFC6979的确定性签名。使用ECDSA创建签名时,为非确定性 ECDSA 随机选择 -parameter,而在确定性变体中,它是根据特定算法(在 RFC6979 中描述)从消息和私钥创建的,请参见此处。因此,确定性变体为相同的消息和私钥生成相同的签名,而非确定性变体生成不同的签名。k

    签名之间的差异可能是由 CoinFLEX 使用非确定性变体引起的。不幸的是,这些说明没有详细介绍所使用的 ECDSA 程序。

更新:

确定性和非确定性两种变体都提供有效的 ECDSA 签名!在确定性变体(RFC6979来自 2013 年 8 月)之前,只有非确定性变体,请参见此处

我在 Linux (Debian) 机器上安装并测试了sign_secp224k1-tool。正如怀疑的那样,该工具为相同的私钥和相同的消息生成不同的签名,显然使用了非确定性变体。这也可以从源代码中轻松验证:签名是使用 - 方法计算的,该方法使用随机确定-值。ecp_signk/dev/urandom

因此很明显,使用确定性变体的 C# 代码生成的签名通常无法匹配sign_secp224k1使用非确定性变体的工具生成的签名。


推荐阅读