使用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...