authentication - 使用带有曲线 secp224k1 的私钥签署 ECDSA
问题描述
解决方案
根据指令的第 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_sign
k
/dev/urandom
因此很明显,使用确定性变体的 C# 代码生成的签名通常无法匹配sign_secp224k1
使用非确定性变体的工具生成的签名。
推荐阅读
- c# - 获取 C# 记录的主构造函数
- rust - Serde 自定义序列化程序
- javascript - 打字稿:类型上不存在属性“导航”省略反应导航v5
- ios - 即使应用程序未启动,也会收到应用程序崩溃警报
- reporting-services - SSRS 组格式
- rust - 接受(可选)参考 fn 参数的 Rust 特征
- python - 如何从 OpenWeatherMap 中检索使用本地时区表示的给定本地日期和时间的天气预报?
- asp.net-mvc - 无法在 Visual Studio 中运行 MVC 应用程序,redirection.config 问题
- reactjs - React redux - 刷新页面不使用useEffect设置Form数据
- javascript - 如何在 Vuejs 中的 3 个组件之间传输数据?