程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法使用 ecsda 包验证 ECDSA 签名大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法使用 ecsda 包验证 ECDSA 签名?

开发过程中遇到无法使用 ecsda 包验证 ECDSA 签名的问题如何解决?下面主要结合日常开发的经验,给出你关于无法使用 ecsda 包验证 ECDSA 签名的解决方法建议,希望对你解决无法使用 ecsda 包验证 ECDSA 签名有所启发或帮助;

我生成了一个签名并对其进行了 base64 编码:

4d4559434951436c627834634e4b4d513944764d2f4d4f536c3636642f344f4f4c74777a48493661676e427a4149395838514968414c37683959464e575242784e56497675706b534b3362564b735049717a445067464e5a563164415a506565

使用公钥: @H_898_5@mFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzIEFzpGyGzsHi66o07Hlzkv7T92dbSvDh5UIErOJl7l93RCc8VnvSm6MhuvKb4snojkUEMq0gDVb4fHlzSfzWw==

当我散列相同的消息并尝试验证它时,它失败了。

我在 Go 中使用包 crypto/ecsda 以及包中的函数 SignASN1VerifyASN1

我写了 2 个程序,一个用于签名,另一个用于在 go playground 中验证,但无法验证,可能是什么问题?

签署程序: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:


this.http.post<object>(url,body)
.pipe( map(jsonObject => {
          const map = new Map<String,String[]>();
          for (const value in jsonObject) {
            map.set(value,jsonObject[value]);
          }
          return map;
        })
      ).subscribe(
        (data: Map<String,String[]>) => {
          console.log(data);
          console.log(data instanceof Map); // true
          data.get("key1");
        },error => console.log(error.error)
      );

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

%s

大佬总结

以上是大佬教程为你收集整理的无法使用 ecsda 包验证 ECDSA 签名全部内容,希望文章能够帮你解决无法使用 ecsda 包验证 ECDSA 签名所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。