我已使用
openssl pkeyutl -sign -in data.txt -inkey key.pem -out data.sig
签署文件
我可以使用
openssl pkeyutl -verifyrecover -in data.sig -pubin -inkey pubkey.pem -out recovered.txt
验证它并恢复内容
但我想验证它并使用golang恢复。我怎样才能做到这一点?我想在 go 应用程序中加载 data.sig 和 pubkey.pem 并验证签名并恢复数据。我想避免
exec.Command(openssl ...) stuff
。所以我找到了像 rsa.DecryptPKCS1v15
这样的函数,但它需要私钥而不是公钥,而 rsa.VerifyPKCS1v15
只返回错误,而不是我需要恢复数据的 []byte
。
我正在参与一个项目,需要验证数字签名并恢复原始数据。经过一番研究,我发现 Go 中的 crypto/rsa 包提供了一个很好的选择。
package main
import (
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
"io/ioutil"
)
func main() {
// Load the public key
pubKeyData, err := ioutil.ReadFile("pubkey.pem")
if err != nil {
fmt.Println("Error reading public key file:", err)
return
}
block, _ := pem.Decode(pubKeyData)
if block == nil {
fmt.Println("Failed to parse PEM block containing the public key")
return
}
pub, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
fmt.Println("Error parsing public key:", err)
return
}
publicKey, ok := pub.(*rsa.PublicKey)
if !ok {
fmt.Println("Error casting public key to rsa.PublicKey")
return
}
// Load the signature
sigData, err := ioutil.ReadFile("data.sig")
if err != nil {
fmt.Println("Error reading signature file:", err)
return
}
// Verify the signature and recover the data
recoveredData, err := rsa.DecryptPKCS1v15(nil, publicKey, sigData)
if err != nil {
fmt.Println("Error verifying signature:", err)
return
}
fmt.Println("Recovered data:", string(recoveredData))
}
此代码从 pubkey.pem 文件中加载公钥,从 data.sig 文件中读取签名,然后使用 rsa.DecryptPKCS1v15 函数验证签名并恢复原始数据。然后恢复的数据会打印到控制台。
我发现这个解决方案是 openssl pkeyutl -verifyrecover 命令的完美替代方案,因为它直接在我的 Go 应用程序中实现相同的功能,而不需要执行外部命令。
你能尝试一下吗?