gpt4 book ai didi

go - 无法使用ecdsa软件包验证ECDSA签名

转载 作者:行者123 更新时间:2023-12-03 10:10:28 28 4
gpt4 key购买 nike

我已经生成了一个签名并对其进行了base64编码:4d4559434951436c627834634e4b4d513944764d2f4d4f536c3636642f344f4f4c74777a48493661676e427a4149395838514968414c37683959464e575242784e56497675706b534b3362564b735049717a445067464e5a563164415a506565使用公钥:MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzIeFzpGyGzsHi66o07Hlzkv7T92dbSvDh5UIerOJl7l93RCc8VnvSm6MhuvKb4snojkUEMq0gDVb4fHlzSfzWw==当我对同一条消息进行哈希处理并尝试对其进行验证时,它将失败。
我在Go中使用了crypto/ecsda软件包,并在软件包中使用了SignASN1VerifyASN1函数。
我已经编写了2个程序,一个要签名,另一个要在运动场中验证,但无法验证,这可能是什么问题?
签名程序:https://play.golang.org/p/D8KLUrEelRI
验证程序:https://play.golang.org/p/R7ZUBnvCJ0o
注意:功能在go 15及更高版本中可用。
程序代码签名

package main

import (
"crypto/ecdsa"
"crypto/rand"
"fmt"
"encoding/base64"
"crypto/x509"
"crypto/sha256"
)

func main() {
prik ,ee := base64.StdEncoding.DecodeString("MHcCAQEEIOjE1zQtdzs10msOj4JuX6URIDJOVg5AaR8wCtEM227ZoAoGCCqGSM49AwEHoUQDQgAEzIeFzpGyGzsHi66o07Hlzkv7T92dbSvDh5UIerOJl7l93RCc8VnvSm6MhuvKb4snojkUEMq0gDVb4fHlzSfzWw==")
if ee != nil{
panic(ee)
}

privateKey, e := x509.ParseECPrivateKey(prik)
if e != nil{
panic(e)
}


msg := "6e80bec4-1"
hash := sha256.Sum256([]byte(msg))
sig, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])

if err != nil {
panic(err)
}
fmt.Printf("signature: %x\n", base64.StdEncoding.EncodeToString(sig))






}
程序以验证签名。
package main

import (
"crypto/ecdsa"
"fmt"
"encoding/base64"
"crypto/x509"
"crypto/sha256"
)

func main() {
pubkdata, _ := base64.StdEncoding.DecodeString("MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzIeFzpGyGzsHi66o07Hlzkv7T92dbSvDh5UIerOJl7l93RCc8VnvSm6MhuvKb4snojkUEMq0gDVb4fHlzSfzWw==")
sig, _ := base64.StdEncoding.DecodeString("4d4559434951436c627834634e4b4d513944764d2f4d4f536c3636642f344f4f4c74777a48493661676e427a4149395838514968414c37683959464e575242784e56497675706b534b3362564b735049717a445067464e5a563164415a506565")
PK, _:= x509.ParsePKIXPublicKey(pubkdata)
//Validate the signture

msg := "6e80bec4-1"
hash := sha256.Sum256([]byte(msg))
valid := ecdsa.VerifyASN1(PK.(*ecdsa.PublicKey), hash[:], sig)
fmt.Println("signature verified:", valid)
}
结果: signature verified: false

最佳答案

您正在使用十六进制表示形式输出签名的base64:

fmt.Printf("signature: %x\n", base64.StdEncoding.EncodeToString(sig))
之后,您尝试将输出解析为base64,这就是为什么得到不同结果的原因。将打印格式替换为 %s,它应该可以工作:
fmt.Printf("signature: %s\n", base64.StdEncoding.EncodeToString(sig))

关于go - 无法使用ecdsa软件包验证ECDSA签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66025851/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com