Golang AES加密解密实战教程

本教程将引导你学习如何在Golang中使用AES算法进行数据的加密和解密。我们将提供完整的代码示例,并对关键部分进行详细解释。

1. 代码示例

以下是用Golang进行AES加解密的示例代码:

package main

import (
	'crypto/aes'
	'crypto/cipher'
	'crypto/rand'
	'encoding/base64'
	'fmt'
	'io'
)

func main() {
	// 原始数据
	plainText := 'Hello, World!'

	// 密钥(16字节)
	key := []byte('0123456789abcdef')

	// 加密
	cipherText, err := encrypt(plainText, key)
	if err != nil {
		fmt.Println('加密失败:', err)
		return
	}
	fmt.Println('加密后的数据:', cipherText)

	// 解密
	decryptedText, err := decrypt(cipherText, key)
	if err != nil {
		fmt.Println('解密失败:', err)
		return
	}
	fmt.Println('解密后的数据:', decryptedText)
}

// 加密函数
func encrypt(plainText string, key []byte) (string, error) {
	// 创建一个新的AES加密块
	block, err := aes.NewCipher(key)
	if err != nil {
		return '', err
	}

	// 创建一个GCM模式的AES加密器
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return '', err
	}

	// 生成随机的Nonce
	nonce := make([]byte, gcm.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		return '', err
	}

	// 加密数据
	cipherText := gcm.Seal(nil, nonce, []byte(plainText), nil)

	// 返回Base64编码的加密数据
	return base64.StdEncoding.EncodeToString(cipherText), nil
}

// 解密函数
func decrypt(cipherText string, key []byte) (string, error) {
	// 创建一个新的AES加密块
	block, err := aes.NewCipher(key)
	if err != nil {
		return '', err
	}

	// 创建一个GCM模式的AES解密器
	gcm, err := cipher.NewGCM(block)
	if err != nil {
		return '', err
	}

	// 解码Base64编码的加密数据
	decodedCipherText, err := base64.StdEncoding.DecodeString(cipherText)
	if err != nil {
		return '', err
	}

	// 提取Nonce
	nonceSize := gcm.NonceSize()
	if len(decodedCipherText) < nonceSize {
		return '', fmt.Errorf('加密数据无效')
	}
	nonce := decodedCipherText[:nonceSize]
	cipherText = string(decodedCipherText[nonceSize:])

	// 解密数据
	plainText, err := gcm.Open(nil, nonce, []byte(cipherText), nil)
	if err != nil {
		return '', err
	}

	return string(plainText), nil
}

2. 代码解释

  1. 导入必要的包: 代码首先导入了所需的加密和编码相关的包,包括 crypto/aes, crypto/cipher, crypto/rand, encoding/base64 等。

  2. 定义密钥: 代码中定义了一个16字节的密钥 key。请注意,AES算法支持16字节 (AES-128), 24字节 (AES-192) 或 32字节 (AES-256) 的密钥长度。

  3. 加密函数 encrypt():

    • 使用 aes.NewCipher() 创建一个新的AES加密块。
    • 使用 cipher.NewGCM() 创建一个GCM模式的AES加密器。 GCM (Galois/Counter Mode)是一种推荐的AES操作模式,因为它提供了数据完整性校验。
    • 使用 rand.Reader 生成一个随机的Nonce (Number used once)。 Nonce在每次加密过程中都应该是唯一的,它保证了即使使用相同的密钥加密相同的数据,也会得到不同的密文。
    • 使用 gcm.Seal() 函数进行加密操作。
    • 使用 base64.StdEncoding.EncodeToString() 将加密后的字节数组转换为Base64编码的字符串,方便存储和传输。
  4. 解密函数 decrypt():

    • 与加密过程类似,首先创建AES加密块和GCM解密器。
    • 使用 base64.StdEncoding.DecodeString() 将Base64编码的密文解码为字节数组。
    • 从解码后的字节数组中提取Nonce。
    • 使用 gcm.Open() 函数进行解密操作。

3. 安全注意事项

  • 密钥管理: 安全地生成、存储和管理密钥对于AES加密至关重要。 避免将密钥硬编码在代码中, 应该使用安全的密钥管理系统。
  • Nonce生成: 确保每次加密操作都使用唯一的Nonce至关重要。 重复使用Nonce会严重削弱AES-GCM的安全性。
  • 其他安全措施: 除了AES加密外,还可以考虑结合其他安全措施,例如数据签名和验证,以增强整体安全性。

希望本教程能够帮助你理解如何在Golang中使用AES进行加密解密。 请记住,安全是一个持续的过程,请务必及时了解最新的安全最佳实践。

Golang AES加密解密教程与代码示例

原文地址: https://www.cveoy.top/t/topic/fSzr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录