问题描述
我正在使用Golang验证由ECDSA密钥使用secp256r1 / scep384r1 / secp521r1签名的数字签名。
secp256r1 / scep384r1 / secp521r1的签名验证性能差异令人震惊。
对于由密钥secp256r1 签名的数字签名,Golang能够每秒验证约27k签名。
对于由密钥secp384r1 签名的签名,它能够每秒验证大约1700个签名,对于由secp521r1的密钥签名的签名,每秒仅验证350个签名。
数字签名验证的差异确实很大,三种情况下的签名算法都是相同的,即SHA256withECDSA。
用于验证签名的示例代码:
package main
import (
"crypto/ecdsa"
"crypto/sha256"
"encoding/asn1"
"encoding/base64"
"encoding/json"
"errors"
// "fmt"
"math/big"
"sync/atomic"
)
type ECDSASignature struct {
R,S *big.Int
}
type Envelope struct {
RawMessage json.RawMessage `json:"message"`
Message interface{} `json:"-"`
Signature string `json:"signature"`
}
func hash(b []byte) []byte {
h := sha256.New()
h.Write(b)
return h.Sum(nil)
}
func (e *Envelope) Validate(publicKey *ecdsa.PublicKey) bool{
der,err := base64.StdEncoding.DecodeString(e.Signature)
if err != nil {
return err
}
sig := &ECDSASignature{}
_,err = asn1.Unmarshal(der,sig)
if err != nil {
return err
}
h := hash(e.RawMessage)
valid := ecdsa.Verify(
publicKey,h,sig.R,sig.S,)
return valid
}
我在这里想念什么吗?验证签名是否需要以不同的方式处理secp384r1和secp521r1?如何提高验证这些签名的性能?这些语言类型在Golang中是一种预期的行为吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)