mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 04:22:33 +08:00
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package rsacrypto
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"crypto/rsa"
|
|
"crypto/sha512"
|
|
"crypto/x509"
|
|
"encoding/base64"
|
|
"encoding/pem"
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
keySize = 2048 // RSA key size in bits
|
|
)
|
|
|
|
// GenerateKey 生成RSA密钥对
|
|
func GenerateKey() (*rsa.PrivateKey, error) {
|
|
return rsa.GenerateKey(rand.Reader, keySize)
|
|
}
|
|
|
|
// EncryptData 加密数据
|
|
func EncryptData(publicKey *rsa.PublicKey, data []byte) (string, error) {
|
|
ciphertext, err := rsa.EncryptOAEP(
|
|
sha512.New(),
|
|
rand.Reader,
|
|
publicKey,
|
|
data,
|
|
nil,
|
|
)
|
|
if err != nil {
|
|
return "", fmt.Errorf("encryption failed: %v", err)
|
|
}
|
|
|
|
return base64.StdEncoding.EncodeToString(ciphertext), nil
|
|
}
|
|
|
|
// DecryptData 解密数据
|
|
func DecryptData(privateKey *rsa.PrivateKey, ciphertext string) ([]byte, error) {
|
|
data, err := base64.StdEncoding.DecodeString(ciphertext)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to decode base64: %v", err)
|
|
}
|
|
|
|
plaintext, err := rsa.DecryptOAEP(
|
|
sha512.New(),
|
|
rand.Reader,
|
|
privateKey,
|
|
data,
|
|
nil,
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("decryption failed: %v", err)
|
|
}
|
|
|
|
return plaintext, nil
|
|
}
|
|
|
|
// PrivateKeyToString 将RSA私钥转换为PEM格式的字符串
|
|
func PrivateKeyToString(privateKey *rsa.PrivateKey) (string, error) {
|
|
privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
|
|
privateKeyPEM := pem.EncodeToMemory(
|
|
&pem.Block{
|
|
Type: "RSA PRIVATE KEY",
|
|
Bytes: privateKeyBytes,
|
|
},
|
|
)
|
|
return string(privateKeyPEM), nil
|
|
}
|
|
|
|
// PublicKeyToString 将RSA公钥转换为PEM格式的字符串
|
|
func PublicKeyToString(publicKey *rsa.PublicKey) (string, error) {
|
|
publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to marshal public key: %v", err)
|
|
}
|
|
|
|
publicKeyPEM := pem.EncodeToMemory(
|
|
&pem.Block{
|
|
Type: "PUBLIC KEY",
|
|
Bytes: publicKeyBytes,
|
|
},
|
|
)
|
|
return string(publicKeyPEM), nil
|
|
}
|