如何在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
答案 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:]
}