Go语言封装加解密包(AES/DES/RSA)

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)以及合适的加密模式。

相关推荐
元_汐11 分钟前
【Python通过UDP协议传输视频数据】(界面识别)
开发语言·网络·python·网络协议·tcp/ip·udp
多多*1 小时前
线程池相关 FutureTask介绍 处理阻塞 Future改进->CompletableFuture
java·开发语言·后端·python·spring
siy23331 小时前
[c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
c语言·开发语言·笔记·学习·算法
Quantum&Coder2 小时前
Swift语言的软件工程
开发语言·后端·golang
吴代庄3 小时前
复盘成长——2024年终总结
后端
CyberScriptor3 小时前
CSS语言的语法糖
开发语言·后端·golang
夕阳_醉了6 小时前
如何在JS里进行深拷贝
开发语言·javascript·ecmascript
武昌库里写JAVA7 小时前
React方向:react中5种Dom的操作方式
java·开发语言·spring boot·学习·课程设计
xqhoj8 小时前
C++学习指南(七)——stack/queue/priority_queue
开发语言·c++
数据小小爬虫8 小时前
利用Java爬虫获取义乌购店铺所有商品列表:技术探索与实践
java·开发语言·爬虫