前言
本文是一个使用GO-RSA解密的一个例子,我们使用的是ECB模式。使用到的库是 github.com/smartwalle/crypto4go
一、Rsa解密
1.引入库
我们引入库的时候,可以使用go get。如果开启了go mod,也可以使用go mod 下载。
go get github.com/smartwalle/crypto4go
2.代码部分
思路就是,把我们的密钥key 和要解密的数据data,转换成base64格式的字符串,传入封装好的方法中,会返回解密后的数据。
下面包含了一个完整的例子,复制过去应该就可以执行测试。
package main
import (
"bytes"
"crypto/rand"
"crypto/rsa"
"encoding/base64"
"fmt"
"log"
"strings"
"github.com/smartwalle/crypto4go"
)
func main() {
data :="bo4iVXaCbS7t6SRvD7mJdZL/ugiC+qpssSQYfh4GXwBIzP3wa8Pk+MC7EzCEIaBt1TQVR41WW41tz7TV1xlKTl0+proxd498oUgyG9IcnpmJ5BVnWepZGL5xvgYxoo4DKq3RgJkTXlwJlThxgglDV+Lbv2kVfIipmYNnwriQgWg="
privateKey :="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL6CtOwMoKpxEGw8WTuf6NRuUDGXUXb3rOOo6NZ65U3bYgGE3z6b880eQF37Wd2WBDcUKfBiw2xwhunqAQLSq9XDlIcejydctNsTb+HV8FmqqMEzC4mO4O10N4l4hEIkcHomOk1+wdvgEx555P/TwMPvG5zUxneKTpMdaDxHnf3TAgMBAAECgYAEYvQRf1Tvt7y+EUGouszcn1GfYrGQgLFtaIU78wZ2nXeLO2j8gxDBB1JKF7CBBqRANGmmzE9dntWsayPs0bb9IdHXXHby1oZ62wMX7pfwBrvf5wOCz8JazRYZjaP7dOP3dGHWGEtX2I5SFG43hRwrvT7AMnB5YTWSjapAQEPQAQJBAPYt5gJ5XFmAwOXZ977lR96AgV62nuFFRRJjrX/7eh0jvhp1AVDa8fW95PQY+h3F8OJwZBDYYXVQ9zrNr4QWZdMCQQDGHErgUPL4H1crDK2UGLS3TqbTPmIQp5uVauhmNMnqjqtceWI2I/an+NPx+4hI8rTzekmyrn+oQP/wCgX5owgBAkEA7Q4dotxCdV1qYuuViZk3r6aG7TFlpP8TGDYr6EW8vTqh4NAyyC1NOZn2UqeKkgj9gM9BTIdQsauZpmJSVRtMSQJBAMR7Lu/GmRLo0mUJz+V/k0vyH5aG2m+2K6JHQ3KKjG+rS90NLhCQHoN9T4dBdmsS+9A2yn0Cf+15edyxtDdgMAECQQCTHpjhdcfIbUNktNtbbb9X5oHjtooUsbavqePAQTZB5dl8j5caCa2KkC0P+hvfid8BFZ5fJAVsO0U6QrKvusxx"
aeskey, err := RSADecryptByPrivateKey(data , privateKey )
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(aeskey)//3WZHqust0PBS9z5CBBbQig==
}
func RSADecryptByPrivateKey(data string, privateKey string) (string, error) {
priKey, err := crypto4go.ParsePKCS1PrivateKey(crypto4go.FormatPKCS1PrivateKey(string(privateKey)))
if err != nil {
priKey, err = crypto4go.ParsePKCS8PrivateKey(crypto4go.FormatPKCS8PrivateKey(string(privateKey)))
if err != nil {
fmt.Println("ParsePKCS8PrivateKey : ", err.Error())
return "", err
}
}
key, err := base64.StdEncoding.DecodeString(data)
if err != nil {
fmt.Println("base64.RawURLEncoding.DecodeString : ", err.Error())
return "", err
}
partLen := priKey.N.BitLen() / 8
chunks := split([]byte(key), partLen)
buffer := bytes.NewBufferString("")
for _, chunk := range chunks {
decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, priKey, chunk)
if err != nil {
return "", err
}
buffer.Write(decrypted)
}
return buffer.String(), err
}
func split(buf []byte, lim int) [][]byte {
var chunk []byte
chunks := make([][]byte, 0, len(buf)/lim+1)
for len(buf) >= lim {
chunk, buf = buf[:lim], buf[lim:]
chunks = append(chunks, chunk)
}
if len(buf) > 0 {
chunks = append(chunks, buf[:len(buf)])
}
return chunks
}