mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
Add the encrypt toolkit
This commit is contained in:
124
utils/encrypt/rsa_standard.go
Normal file
124
utils/encrypt/rsa_standard.go
Normal file
@@ -0,0 +1,124 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user