Golang使用SHA224摘要与ecdsa和私钥签名

时间:2014-02-09 11:26:26

标签: cryptography go ecdsa

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

这是我的文档:

  

签名使用椭圆曲线数字签名算法(ECDSA)   编码消息包含:用户ID,服务器随机数,客户端节点和   私钥。生成的私钥会散列您的用户ID和您的用户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
}

我对这个功能的意图是它:

  1. 哈希值userId并使用SHA224在[]byte中正确传递。

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

  3. 正确构建ecdsa.PrivateKey及相应ecdsa.PublicKey的实例

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

  5. 的所述密钥

    然后我签署另一条消息,其中包含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. rs组件非常大 - 可能是因为我使用int64。这可能是一个问题吗?

    3. sha256.New224().Sum([]byte(userId + pass))"是否正确"是否有这两项?

    4. 如何正确创建私钥(假设错误),然后签署邮件?

    5. 我对ECDSA非常陌生并且具有基本的加密知识。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

  

我的NewKey功能是否正确?

没有

  

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

它们应该很大。

  

是行sha256.New224()。总和([]字节(userId + pass))"正确"哈希这两个项目?

在我传递[]byte之前,这是正确的。

  

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

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

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