0

我需要签署一条消息以提交到远程服务(通过 websocket)。为此,我需要基于整数(我的用户 ID)和密码(base64 编码的字符串)构造一个私钥,并使用 SHA224 进行哈希处理。我正在使用 golang 和 crypto/ecdsa 以及随附的字节编码包等。

这是我拥有的文档:

签名使用椭圆曲线数字签名算法 (ECDSA) 编码的消息,其中包含:用户 ID、服务器随机数、客户端节点和私钥。使用 SHA224 对您的用户 ID 和密码进行散列生成私钥。

这是我的功能:

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
}

我对这个函数的意图是:

  1. 散列 userId 并正确传递[]byte使用 SHA224。

  2. 将其读入int64然后用作私钥

  3. 构造一个实例ecdsa.PrivateKeyecdsa.PublicKey正确对应

  4. 返回用于ecdsa.Sign()函数调用的键

然后我签署另一条由 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())}

问题:

  1. 我的NewKey功能正确吗?

  2. 和组件非常大 - 大概是因为我正在r使用. 这可能是一个问题吗?sint64

  3. 拥有这两个项目的行是否sha256.New224().Sum([]byte(userId + pass))“正确”?

  4. 如何正确创建我的私钥(假设它是错误的)并随后签署消息?

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

4

1 回答 1

-2

回答我自己的问题:

我的 NewKey 功能是否正确?

不。

r 和 s 分量非常大——大概是因为我使用的是 int64。这可能是一个问题吗?

它们应该很大。

sha256.New224().Sum([]byte(userId + pass)) 行是否“正确”用于散列这两项?

就我传递它而言,这是正确的[]byte

如何正确创建我的私钥(假设它是错误的)并随后签署消息?

密钥需要 a big.Int,因此假设哈希正确,使用以下内容就足够了:

key := new(big.Int).SetBytes(sum)
于 2014-03-12T12:18:38.397 回答