如期,解密的时候需要使用公钥,一般来说都是公钥加密,私钥解密。
找到了个解决办法,记录一下:
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:]
}
使用方法就是如下:
data = "我是加密文本"
publicstr := []byte("-----BEGIN RSA Public Key-----\nxxxx\n-----END RSA Public Key-----")
block, _ := pem.Decode(publicstr)
public, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
fmt.Printf("加载公钥错误 %+v\n", err)
return
}
decodeBytes, _ := base64.StdEncoding.DecodeString(data)
var result string
// 因为加密解密用rsa有长度限值,因此这个地方就看具体限值的多少了
for len(decodeBytes) > 0 {
decodePart := decodeBytes[:128]
plain := RSA_public_decrypt(public.(*rsa.PublicKey), decodePart)
result += string(plain)
decodeBytes = decodeBytes[128:]
}
fmt.Printf("%+v\n", result)