如何解决使用secp256r1 / scep384r1 / secp521r1性能差异在Golang中进行ECDSA签名验证
我正在使用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 举报,一经查实,本站将立刻删除。