如何解决ECDSA 签名/验证似乎只考虑数据的前 32 个字节
ec = OpenSSL::PKey::EC.new('secp256k1')
ec.generate_key
signature = ec.dsa_sign_asn1("A" * 64)
refute ec.dsa_verify_asn1("A" * 32,signature) # Fails here
鉴于上面的测试代码,为什么 dsa_sign_asn1
和 dsa_verify_asn1
只考虑提供数据的前 32 个字节?
环境:
Ruby 3.0、Ubuntu 21.04 在 Windows 10 上运行 multipass。OpenSSL::VERSION
是 2.2.0
解决方法
签名时,签名的不是数据本身,而是数据的哈希值。这一方面是为了能够对较长的消息进行签名,另一方面是出于安全原因(第 here 节)。
对于 secp256k1,通常使用输出大小为 256 位的摘要(s. here),例如SHA256。
如果您采用较大输出大小的摘要,则根据 NIST FIPS 186-4 (s. here,其中 n 是密钥大小,即生成器顺序,secp256k1 为 256 位)。
这就是为什么在发布的示例中验证成功的原因:仅考虑前 32 个字节,它们是相同的。
如果改为使用数据的哈希值,则验证将按预期失败:
signature = ec.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest("A" * 64))
verified = ec.dsa_verify_asn1(OpenSSL::Digest::SHA256.digest("A" * 32),signature) # false
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。