Files
NetworkAuth/utils/encrypt/rsa_standard.go

125 lines
3.0 KiB
Go
Raw Permalink Normal View History

2025-10-25 02:59:11 +08:00
package encrypt
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"encoding/base64"
"fmt"
)
// RSAEncrypt 普通RSA加密算法结构体
type RSAEncrypt struct {
publicKey *rsa.PublicKey
privateKey *rsa.PrivateKey
}
// NewRSAEncrypt 创建新的RSA加密实例
func NewRSAEncrypt(publicKey *rsa.PublicKey, privateKey *rsa.PrivateKey) *RSAEncrypt {
return &RSAEncrypt{
publicKey: publicKey,
privateKey: privateKey,
}
}
// Encrypt RSA公钥加密
func (r *RSAEncrypt) Encrypt(plaintext string) (string, error) {
if r.publicKey == nil {
return "", fmt.Errorf("RSA公钥不能为空")
}
data := []byte(plaintext)
// 使用OAEP填充进行加密
encrypted, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, r.publicKey, data, nil)
if err != nil {
return "", fmt.Errorf("RSA加密失败: %v", err)
}
// Base64编码
return base64.StdEncoding.EncodeToString(encrypted), nil
}
// Decrypt RSA私钥解密
func (r *RSAEncrypt) Decrypt(ciphertext string) (string, error) {
if r.privateKey == nil {
return "", fmt.Errorf("RSA私钥不能为空")
}
// Base64解码
data, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return "", fmt.Errorf("Base64解码失败: %v", err)
}
// 使用OAEP填充进行解密
decrypted, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, r.privateKey, data, nil)
if err != nil {
return "", fmt.Errorf("RSA解密失败: %v", err)
}
return string(decrypted), nil
}
// EncryptLargeData RSA分块加密大数据
func (r *RSAEncrypt) EncryptLargeData(plaintext string) (string, error) {
if r.publicKey == nil {
return "", fmt.Errorf("RSA公钥不能为空")
}
data := []byte(plaintext)
keySize := r.publicKey.Size()
blockSize := keySize - 2*sha256.Size - 2 // OAEP填充的最大明文长度
var encrypted []byte
for i := 0; i < len(data); i += blockSize {
end := i + blockSize
if end > len(data) {
end = len(data)
}
block := data[i:end]
encryptedBlock, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, r.publicKey, block, nil)
if err != nil {
return "", fmt.Errorf("RSA分块加密失败: %v", err)
}
encrypted = append(encrypted, encryptedBlock...)
}
return base64.StdEncoding.EncodeToString(encrypted), nil
}
// DecryptLargeData RSA分块解密大数据
func (r *RSAEncrypt) DecryptLargeData(ciphertext string) (string, error) {
if r.privateKey == nil {
return "", fmt.Errorf("RSA私钥不能为空")
}
data, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return "", fmt.Errorf("Base64解码失败: %v", err)
}
keySize := r.privateKey.Size()
var decrypted []byte
for i := 0; i < len(data); i += keySize {
end := i + keySize
if end > len(data) {
end = len(data)
}
block := data[i:end]
decryptedBlock, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, r.privateKey, block, nil)
if err != nil {
return "", fmt.Errorf("RSA分块解密失败: %v", err)
}
decrypted = append(decrypted, decryptedBlock...)
}
return string(decrypted), nil
}