You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.5 KiB
78 lines
1.5 KiB
package gorsa
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/x509"
|
|
"encoding/base64"
|
|
"encoding/pem"
|
|
"os"
|
|
)
|
|
|
|
// PublicEncrypt 公钥加密
|
|
func PublicEncrypt(encryptStr string, path string) (string, error) {
|
|
// 打开文件
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer file.Close()
|
|
|
|
// 读取文件内容
|
|
info, _ := file.Stat()
|
|
buf := make([]byte, info.Size())
|
|
file.Read(buf)
|
|
|
|
// pem 解码
|
|
block, _ := pem.Decode(buf)
|
|
|
|
// x509 解码
|
|
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 类型断言
|
|
publicKey := publicKeyInterface.(*rsa.PublicKey)
|
|
|
|
//对明文进行加密
|
|
encryptedStr, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, []byte(encryptStr))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
//返回密文
|
|
return base64.URLEncoding.EncodeToString(encryptedStr), nil
|
|
}
|
|
|
|
// PrivateDecrypt 私钥解密
|
|
func PrivateDecrypt(decryptStr string, path string) (string, error) {
|
|
// 打开文件
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer file.Close()
|
|
|
|
// 获取文件内容
|
|
info, _ := file.Stat()
|
|
buf := make([]byte, info.Size())
|
|
file.Read(buf)
|
|
|
|
// pem 解码
|
|
block, _ := pem.Decode(buf)
|
|
|
|
// X509 解码
|
|
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
decryptBytes, err := base64.URLEncoding.DecodeString(decryptStr)
|
|
|
|
//对密文进行解密
|
|
decrypted, _ := rsa.DecryptPKCS1v15(rand.Reader, privateKey, decryptBytes)
|
|
|
|
//返回明文
|
|
return string(decrypted), nil
|
|
}
|