Cryptography 使用ecdsa和SHA224摘要中的私钥进行Golang签名

Cryptography 使用ecdsa和SHA224摘要中的私钥进行Golang签名,cryptography,go,ecdsa,Cryptography,Go,Ecdsa,我需要通过websocket为提交到远程服务的消息签名。要做到这一点,我需要基于一个整数(我的用户id)和一个密码短语(base64编码的字符串)构造一个私钥,使用SHA224散列。我正在使用golang和crypto/ecdsa以及用于字节编码等的附带软件包 以下是我的文档: 签名使用椭圆曲线数字签名算法ECDSA 包含以下内容的编码消息:用户ID、服务器Nonce、客户端节点和 私钥。私钥是通过散列您的用户ID和 密码为SHA224 这是我的职责: func NewKey(userId in

我需要通过websocket为提交到远程服务的消息签名。要做到这一点,我需要基于一个整数(我的用户id)和一个密码短语(base64编码的字符串)构造一个私钥,使用SHA224散列。我正在使用golang和crypto/ecdsa以及用于字节编码等的附带软件包

以下是我的文档:

签名使用椭圆曲线数字签名算法ECDSA 包含以下内容的编码消息:用户ID、服务器Nonce、客户端节点和 私钥。私钥是通过散列您的用户ID和 密码为SHA224

这是我的职责:

func NewKey(userId int64, pass string) (prKey ecdsa.PrivateKey) {
    buf := new(bytes.Buffer)
    binary.Write(buf, binary.BigEndian, userId)
    passArr := []byte(pass)

    sha := sha256.New224()
    sha.Write(buf.Bytes())
    sha.Write(passArr)
    sum := sha.Sum(nil)

    var in int64
    reader := bytes.NewReader(sum)
    err := binary.Read(reader, binary.BigEndian, &in)

    if err != nil {
        log.Fatal(err)
    }

    prKey.D = big.NewInt(in)
    prKey.PublicKey.Curve = elliptic.P224()
    return prKey
}
我对该职能的意图是:

散列用户ID,并使用SHA224在[]字节中正确传递

将其读入int64,然后将其用作私钥

正确构造ecdsa.PrivateKey和相应ecdsa.PublicKey的实例

返回所述密钥以在ecdsa中使用。对函数调用进行签名

然后,我对另一条消息进行签名,该消息由一个userId整数和两个nonce组成

以下是我如何签署我的信息:

key := NewKey(userId, pass) // the above func
msg := sha256.New224().Sum([]byte(userId + srNonce + clNonce))
r, s, err := ecdsa.Sign(rand.Reader, &key, msg)
sig := []string{enc(r.String()), enc(s.String())}
问题:

我的新钥匙功能正确吗

r和s组件非常大——可能是因为我使用的是int64。这可能是个问题吗

行sha256.New224.Sum[]byteuserId+pass是否正确地包含这两项

假设私钥错误,如何正确创建私钥并随后对消息进行签名


我对ECDSA非常陌生,一般都有基本的加密知识。

要回答我自己的问题:

我的新钥匙功能正确吗

没有

r和s组件非常大——可能是因为我使用的是int64。这可能是个问题吗

它们应该很大

行sha256.New224.Sum[]byteuserId+pass对这两项进行散列是否正确

这是正确的,因为我要传递一个[]字节

假设私钥错误且 随后签署该消息

该键需要一个大的.Int,因此假设散列是正确的,使用以下内容就足够了:

key := new(big.Int).SetBytes(sum)

1您可能不需要binary.PutUvarint,而是binary.LittleEndian.putunit64`或BigEndian(如果合适)。2您能否提供一个链接来描述您试图实现的协议?没有这一点,很难说什么是错的。我将取代那个普通的电话——谢谢。更新了我的一些文档。实际上我现在使用的是PutVarint,因为它是一个有符号的64位整数。encoding/binary中的Varint编码是一种来自协议缓冲区规范的可变长度编码。如果只想将整数编码为8字节,则不需要PutVarint。请使用我在第一条注释中提到的内容:binary.LittleEndian.PutUint64或binary.BigEndian.PutUint64。如果您有一个有符号整数,则需要首先将其强制转换为无符号变量。当然,请参见此处: