在 golang 中验证并恢复签名文件

问题描述 投票:0回答:1

我已使用

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.sigpubkey.pem 并验证签名并恢复数据。我想避免

exec.Command(openssl ...) stuff
。所以我找到了像
rsa.DecryptPKCS1v15
这样的函数,但它需要私钥而不是公钥,而
rsa.VerifyPKCS1v15
只返回错误,而不是我需要恢复数据的
[]byte

go rsa digital-signature
1个回答
0
投票

我正在参与一个项目,需要验证数字签名并恢复原始数据。经过一番研究,我发现 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 应用程序中实现相同的功能,而不需要执行外部命令。

你能尝试一下吗?

© www.soinside.com 2019 - 2024. All rights reserved.