【发布时间】:2018-07-21 16:06:02
【问题描述】:
我有一个结构体Transaction,其中包含以下字段,
type Transaction struct {
Sender string `json:"sender"`
Receiver string `json:"receiver"`
Signature string `json:"signature"`
Amount int64 `json:"amount"`
}
我还有一个函数GetPrivateKey(),它返回一个*rsa.PrivateKey
func GetPrivateKey() (*rsa.PrivateKey, error) {
key, err := ioutil.ReadFile("/Users/xxx/.ssh/id_rsa")
if err != nil {
return nil, err
}
block, _ := pem.Decode(key)
der, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return der, err
}
我的计划是使用系统中已有的私钥对结构transaction的内容进行签名,然后将其作为字符串存储在结构中的字段signature中,为此,我有一个函数@ 987654328@
func SignPayload(txnObj *Transaction) error {
privateKey, err := GetPrivateKey()
if err != nil {
panic(err)
}
bodyHash, err := rsa.SignPKCS1v15(rand.Reader, privateKey,
crypto.SHA256, []byte(fmt.Sprintf("%v", *txnObj)))
if err != nil {
panic(err)
}
txnObj.Signature = string(bodyHash)
log.Println(txnObj.Signature)
return err
}
不幸的是,这不起作用,rsa.SignPKCS1v15() 抛出一个错误说:
crypto/rsa:输入必须是散列消息
这里的最终目标是使用此签名通过将其与字段sender 中存在的公钥进行比较来验证结构的真实性。
我是密码学的绝对新手,我在这里做错了什么?更重要的是,我该怎么做?
提前致谢!
【问题讨论】:
标签: go cryptography rsa