mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
125 lines
3.0 KiB
Go
125 lines
3.0 KiB
Go
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
|
|
}
|