optimized_go_tools/am_rsa/rsa.go
2024-07-08 11:14:19 +08:00

120 lines
2.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package am_rsa
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
)
// 工具错误类型
var (
KeyPairAlreadyExistError = errors.New("key pair already exist")
)
// KeyPair备份值
var keyPair map[string]string
/*
* 产生Keypair
* 参数:
* bits int长度一般为1024或2048
*/
func GenRSAKeypair(bits int) (privateKey, publicKey string, err error) {
// 防止重复生成
if keyPair != nil {
return "", "", KeyPairAlreadyExistError
}
// 生成keypair
key, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return "", "", err
}
// 将私钥处理为PEM格式
pkcs1PrivateKey := x509.MarshalPKCS1PrivateKey(key)
p := &pem.Block{
Type: "PRIVATE KEY",
Bytes: pkcs1PrivateKey,
}
privKeyPEM := pem.EncodeToMemory(p)
// 将公钥处理成PEM格式
pubKeyBytes, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
if err != nil {
return "", "", err
}
p = &pem.Block{
Type: "PUBLIC KEY",
Bytes: pubKeyBytes,
}
pubKeyPEM := pem.EncodeToMemory(p)
// 生成最后的PEM字串
privateKey = string(privKeyPEM)
publicKey = string(pubKeyPEM)
// 备份keypair
keyPair = map[string]string{
"private": privateKey,
"public": publicKey,
}
return
}
/*
* RSA公钥加密
* 参数:
* 1. originData string要加密的明文
* 2. publicKey string公钥PEM
*/
func RsaEncryptBase64(originalData, publicKey string) (string, error) {
block, _ := pem.Decode([]byte(publicKey)) // 解密公钥
// 加载公钥
pubKey, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return "", err
}
// 使用公钥加密数据
encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey.(*rsa.PublicKey), []byte(originalData))
if err != nil {
return "", err
}
// 产生base64字串
return base64.StdEncoding.EncodeToString(encryptedData), err
}
/*
* RSA私钥解密
* 参数:
* 1. encryptedData string加密过后的密文
* 2. privateKey string私钥PEM
*/
func RsaDecryptBase64(encryptedData, privateKey string) (string, error) {
// 解密私钥
encryptedDecodeBytes, err := base64.StdEncoding.DecodeString(encryptedData)
if err != nil {
return "", err
}
block, _ := pem.Decode([]byte(privateKey))
// 加载私钥
priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
// 使用私钥解密
originalData, err := rsa.DecryptPKCS1v15(rand.Reader, priKey, encryptedDecodeBytes)
if err != nil {
return "", err
}
// 返回原数据
return string(originalData), nil
}