Go语言封装加解密包(AES/DES/RSA)
- [1. Base64编码与解码](#1. Base64编码与解码)
- [2. AES加解密](#2. AES加解密)
- [3. DES加解密](#3. DES加解密)
- [4. RSA加解密](#4. RSA加解密)
- [5. SHA256哈希](#5. SHA256哈希)
- [6. 单元测试](#6. 单元测试)
-
- [1. AES加解密单元测试](#1. AES加解密单元测试)
- [2. DES加解密单元测试](#2. DES加解密单元测试)
- [3. RSA加解密单元测试](#3. RSA加解密单元测试)
- [4. SHA256哈希单元测试](#4. SHA256哈希单元测试)
- 测试用例说明
- 总结
在现代软件开发中,加解密技术是保障数据安全和隐私的重要手段。Go语言作为一门高效的编程语言,提供了丰富的加解密库,能够满足不同场景下的需求。本文将通过一个简单的crypt包,介绍Go语言如何实现常见的加解密算法,包括Base64编码、AES、DES、RSA加解密,以及SHA256哈希等。
1. Base64编码与解码
Base64是一种常见的编码方式,通常用于在网络中传输二进制数据。例如,在电子邮件和HTTP请求中,Base64编码可以将二进制数据转换为文本字符串,方便传输和存储。
Base64编码
go
// Base64Encode 编码数据为Base64格式
func Base64Encode(data []byte) string {
return base64.StdEncoding.EncodeToString(data)
}
Base64解码
go
// Base64Decode 解码Base64格式数据
func Base64Decode(data string) ([]byte, error) {
return base64.StdEncoding.DecodeString(data)
}
示例
go
data := []byte("Hello, World!")
encoded := Base64Encode(data)
fmt.Println("Encoded:", encoded)
decoded, err := Base64Decode(encoded)
if err != nil {
fmt.Println("Error decoding:", err)
} else {
fmt.Println("Decoded:", string(decoded))
}
2. AES加解密
AES(Advanced Encryption Standard)是一种对称加密算法,广泛应用于数据加密。AES加密和解密使用相同的密钥,因此它是一种非常高效的加解密方式。
AES加密
go
// AESEncrypt 使用AES算法加密明文
func AESEncrypt(plaintext, key string) (string, error) {
block, err := aes.NewCipher([]byte(key))
if err != nil {
return "", err
}
// 生成随机的IV
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
_, err = io.ReadFull(rand.Reader, iv)
if err != nil {
return "", err
}
// 使用CFB模式进行加密
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(plaintext))
return Base64Encode(ciphertext), nil
}
AES解密
go
// AESDecrypt 使用AES算法解密密文
func AESDecrypt(ciphertext, key string) (string, error) {
data, err := Base64Decode(ciphertext)
if err != nil {
return "", err
}
block, err := aes.NewCipher([]byte(key))
if err != nil {
return "", err
}
if len(data) < aes.BlockSize {
return "", errors.New("ciphertext too short")
}
iv := data[:aes.BlockSize]
data = data[aes.BlockSize:] // 移除IV
// 使用CFB模式解密
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(data, data)
return string(data), nil
}
3. DES加解密
DES(Data Encryption Standard)是另一种对称加密算法,虽然由于密钥较短(56位),它现在已经不再被推荐用于新的系统中,但它仍然可以作为学习加密算法的一个例子。
DES加密
go
// DesEncrypt 使用DES算法加密明文
func DesEncrypt(plaintext, key string) (string, error) {
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
// 生成随机的IV
ciphertext := make([]byte, des.BlockSize+len(plaintext))
iv := ciphertext[:des.BlockSize]
_, err = io.ReadFull(rand.Reader, iv)
if err != nil {
return "", err
}
// 使用CFB模式进行加密
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(ciphertext[des.BlockSize:], []byte(plaintext))
return Base64Encode(ciphertext), nil
}
DES解密
go
// DesDecrypt 使用DES算法解密密文
func DesDecrypt(ciphertext, key string) (string, error) {
data, err := Base64Decode(ciphertext)
if err != nil {
return "", err
}
block, err := des.NewCipher([]byte(key))
if err != nil {
return "", err
}
if len(data) < des.BlockSize {
return "", errors.New("ciphertext too short")
}
iv := data[:des.BlockSize]
data = data[des.BlockSize:] // 移除IV
// 使用CFB模式解密
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(data, data)
return string(data), nil
}
4. RSA加解密
RSA是一种非对称加密算法,广泛用于数据传输的加密。它使用公钥加密,私钥解密。RSA密钥对是由公钥和私钥组成,具有非常高的安全性。
RSA加密
go
// RsaEncrypt 使用RSA公钥加密明文
func RsaEncrypt(plaintext string, publicKey string) (string, error) {
block, _ := pem.Decode([]byte(publicKey))
if block == nil {
return "", errors.New("public key error")
}
pub, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return "", err
}
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(plaintext))
if err != nil {
return "", err
}
return Base64Encode(ciphertext), nil
}
RSA解密
go
// RsaDecrypt 使用RSA私钥解密密文
func RsaDecrypt(ciphertext string, privateKey string) (string, error) {
block, _ := pem.Decode([]byte(privateKey))
if block == nil {
return "", errors.New("private key error")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
data, err := Base64Decode(ciphertext)
if err != nil {
return "", err
}
decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, priv, data)
if err != nil {
return "", err
}
return string(decryptedBytes), nil
}
生成密钥对
go
// RsaDecrypt 使用RSA私钥解密密文
func RsaDecrypt(ciphertext string, privateKey string) (string, error) {
block, _ := pem.Decode([]byte(privateKey))
if block == nil {
return "", errors.New("private key error")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
data, err := Base64Decode(ciphertext)
if err != nil {
return "", err
}
decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, priv, data)
if err != nil {
return "", err
}
return string(decryptedBytes), nil
}
5. SHA256哈希
SHA256是一种常见的哈希算法,广泛用于数据完整性验证。它将任意长度的数据映射为256位的哈希值。
go
// SHA256Hash 返回SHA256哈希值
func SHA256Hash(data string) string {
hash := sha256.New()
hash.Write([]byte(data))
return Base64Encode(hash.Sum(nil))
}
6. 单元测试
1. AES加解密单元测试
go
func TestAES(t *testing.T) {
key := "1234567890123456" // AES要求16字节密钥
plaintext := "This is a secret message."
// 加密
ciphertext, err := AESEncrypt(plaintext, key)
if err != nil {
t.Fatalf("AES encryption failed: %v", err)
}
t.Logf("Encrypted AES: %s", ciphertext)
// 解密
decryptedText, err := AESDecrypt(ciphertext, key)
if err != nil {
t.Fatalf("AES decryption failed: %v", err)
}
if decryptedText != plaintext {
t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)
}
t.Logf("Decrypted AES: %s", decryptedText)
}
2. DES加解密单元测试
go
func TestDES(t *testing.T) {
key := "12345678" // DES要求8字节密钥
plaintext := "This is another secret message."
// 加密
ciphertext, err := DesEncrypt(plaintext, key)
if err != nil {
t.Fatalf("DES encryption failed: %v", err)
}
t.Logf("Encrypted DES: %s", ciphertext)
// 解密
decryptedText, err := DesDecrypt(ciphertext, key)
if err != nil {
t.Fatalf("DES decryption failed: %v", err)
}
if decryptedText != plaintext {
t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)
}
t.Logf("Decrypted DES: %s", decryptedText)
}
3. RSA加解密单元测试
go
func TestRSA(t *testing.T) {
// 生成RSA密钥对
privateKey, publicKey, err := GenerateRSAKeyPair(2048)
if err != nil {
t.Fatalf("RSA key pair generation failed: %v", err)
}
assert.NotNil(t, privateKey)
assert.NotNil(t, publicKey)
t.Logf("Private Key: %s", privateKey)
t.Logf("Public Key: %s", publicKey)
plaintext := "Sensitive information"
// 使用公钥加密
encryptedText, err := RsaEncrypt(plaintext, publicKey)
if err != nil {
t.Fatalf("RSA encryption failed: %v", err)
}
t.Logf("Encrypted RSA: %s", encryptedText)
// 使用私钥解密
decryptedText, err := RsaDecrypt(encryptedText, privateKey)
if err != nil {
t.Fatalf("RSA decryption failed: %v", err)
}
if decryptedText != plaintext {
t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)
}
t.Logf("Decrypted RSA: %s", decryptedText)
}
4. SHA256哈希单元测试
go
func TestSHA256(t *testing.T) {
data := "Some important data"
hash := SHA256Hash(data)
t.Logf("SHA256 Hash: %s", hash)
}
测试用例说明
- AES和DES加解密:测试首先会对输入的明文进行加密,然后尝试解密密文,确保解密后的结果与原始明文一致。通过这种方式,验证加密和解密过程的正确性。
- RSA加解密:在测试RSA加解密时,首先生成一对公私钥,然后用公钥加密数据,再用私钥解密。解密后的数据应与原始明文相同。
- SHA256哈希:通过生成一个字符串的SHA256哈希值并打印,验证哈希函数的正确性。
- 运行测试:go test -v
总结
通过封装常见的加解密算法,Go语言为我们提供了丰富的工具来保护数据的隐私和完整性。从Base64编码到对称加密(AES、DES),再到非对称加密(RSA)和哈希(SHA256),我们可以根据实际需求选择合适的算法进行数据保护。
本示例展示了如何使用Go语言的标准库和一些常见的加解密算法来实现数据加解密操作。对于需要更高安全性的应用,建议使用更长的密钥、更新的算法(如AES-GCM)以及合适的加密模式。