【发布时间】:2018-08-20 13:44:12
【问题描述】:
我有一个签名:
3044022014d647cd08f1ea5b31d1e6539b6cbceb9182f6e7b2e29fb969354ef7e3434923022028bb4eda36af410149baa936322e7c0e46cc5540a3aa89c811bc3c3600
哈希
f27c6c3aa42563c958292922be1e53fe107f4db0dfadba11122f0b12bf77f3ab
还有一个公钥
04b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e6537a576782eba668a7ef8bd3b3cfb1edb7117ab65129b8a2e681f3c1e0908ef7b
下面是我验证签名的 Go 代码,但它失败了!我有信息表明这三个部分应该可以验证,并且其他人已经以其他方式验证了它们。所以我想知道这个 Go 代码中的什么错误让我得到了错误的结果。
如果你想了解更多信息,这个链接是关于我如何建立我的签名以及有人说他如何以其他方式验证成功。我现在很无助: https://bitcointalk.org/index.php?topic=4879014.msg43992837#msg43992837
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"encoding/hex"
"fmt"
"math/big"
)
func main() {
pubkey, err := hex.DecodeString("b0bd634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e6537a576782eba668a7ef8bd3b3cfb1edb7117ab65129b8a2e681f3c1e0908ef7b")
if err != nil {
panic(err)
}
curve := elliptic.P256()
// length
keyLen := len(pubkey)
x := big.Int{}
y := big.Int{}
x.SetBytes(pubkey[:(keyLen / 2)])
y.SetBytes(pubkey[(keyLen / 2):])
rawPubKey := ecdsa.PublicKey{curve, &x, &y}
// hash
hash, err := hex.DecodeString("f27c6c3aa42563c958292922be1e53fe107f4db0dfadba11122f0b12bf77f3ab")
if err != nil {
panic(err)
}
r := big.Int{}
s := big.Int{}
rr, err := hex.DecodeString("14d647cd08f1ea5b31d1e6539b6cbceb9182f6e7b2e29fb969354ef7e3434923")
if err != nil {
panic(err)
}
ss, err := hex.DecodeString("28bb4eda36af410149baa936322e7c0e46cc5540a3aa89c811bc3c360028bfd3")
if err != nil {
panic(err)
}
r.SetBytes(rr)
s.SetBytes(ss)
fmt.Printf("%v\n", ecdsa.Verify(&rawPubKey, hash[:], &r, &s))
}
【问题讨论】:
-
修复空间后验证仍然失败。代码看起来不错,您是否使用其他工具验证了自己这是一个有效的签名?
-
非常认为您的回复。此链接是关于我如何建立我的签名以及有人说他如何以其他方式成功验证。我现在感到很无助。 [bitcointalk.org/…