用公钥解密

时间:2017-06-30 17:48:49

标签: encryption go openssl cryptography

如何在golang中解密使用私钥签名的邮件?

$ openssl genrsa -out ./server/server.key
Generating RSA private key, 2048 bit long modulus
..................+++
.............................................+++

$ openssl rsa -in ./server/server.key -pubout -out ./client/client.pub
writing RSA key

$ echo "secret" | openssl rsautl -inkey ./server/server.key -sign > ./secret

# decrypt with public key
$ openssl rsautl -inkey ./client/client.pub -pubin -in ./secret
secret

2 个答案:

答案 0 :(得分:2)

我认为这里有一点误会。 openssl rsautl -sign不会加密数据。它会生成签名secret文件中的内容不是“秘密”,已加密。相反,它是用私钥签名的文本“秘密”的签名。

使用公钥,您可以-verify签名,但这不是您想要做的。听起来你想要加密/解密,而不是签名/验证。

使用-encrypt的{​​{1}}和-decrypt选项。使用公钥进行加密,使用私钥进行解密。

请注意,使用RSA可以加密的数据量有限制。通常,您可以使用RSA保护对称密钥,并使用对称密钥进行批量加密和解密。

答案 1 :(得分:2)

我完全理解我的问题,这是关于openssl的RSA_public_decrypt方法:https://www.openssl.org/docs/man1.1.0/crypto/RSA_public_decrypt.html

我没有找到任何纯粹的golang实现。使用cgo实现:https://github.com/dgkang/rsa/blob/master/rsa/rsa.go

UPD,为我工作:

func RSA_public_decrypt(pubKey *rsa.PublicKey, data []byte) []byte {
    c := new(big.Int)
    m := new(big.Int)
    m.SetBytes(data)
    e := big.NewInt(int64(pubKey.E))
    c.Exp(m, e, pubKey.N)
    out := c.Bytes()
    skip := 0
    for i := 2; i < len(out); i++ {
        if i+1 >= len(out) {
            break
        }
        if out[i] == 0xff && out[i+1] == 0 {
            skip = i + 2
            break
        }
    }
    return out[skip:]
}