Golang AES加密解密实战指南
Golang AES加密解密实战指南
本文将介绍如何使用Golang编写AES加解密程序,并提供完整的代码示例和详细解释。
代码示例gopackage main
import ( 'crypto/aes' 'crypto/cipher' 'crypto/rand' 'encoding/base64' 'fmt' 'io')
func main() { key := []byte('0123456789abcdef') // 16字节的AES密钥
plaintext := []byte('Hello, World!') // 要加密的明文
ciphertext, err := encrypt(key, plaintext) if err != nil { fmt.Println('加密失败:', err) return } fmt.Println('密文:', base64.StdEncoding.EncodeToString(ciphertext))
decryptedText, err := decrypt(key, ciphertext) if err != nil { fmt.Println('解密失败:', err) return } fmt.Println('解密后的明文:', string(decryptedText))}
// 加密函数func encrypt(key, plaintext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }
ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return nil, err }
mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
return ciphertext, nil}
// 解密函数func decrypt(key, ciphertext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }
if len(ciphertext) < aes.BlockSize { return nil, fmt.Errorf('密文太短') }
iv := ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:]
mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertext, ciphertext)
return ciphertext, nil}
代码解释
- 密钥: 代码中使用了16字节(128位)的密钥进行AES加密。实际应用中,建议使用更安全的密钥生成方法,例如使用
crypto/rand包生成随机密钥。2. 加密过程: - 使用aes.NewCipher()函数创建AES加密块。 - 生成随机的初始化向量(IV)。 - 使用cipher.NewCBCEncrypter()函数创建CBC模式的加密器。 - 使用加密器加密明文。3. 解密过程: - 使用aes.NewCipher()函数创建AES加密块。 - 从密文中获取IV。 - 使用cipher.NewCBCDecrypter()函数创建CBC模式的解密器。 - 使用解密器解密密文。
最佳实践
- 密钥管理: 安全地生成、存储和管理密钥至关重要。* 随机IV: 每次加密都应该使用不同的随机IV,以增强安全性。* 错误处理: 始终检查加密和解密过程中的错误。
希望这篇指南能够帮助你理解如何在Golang中使用AES进行数据加密解密操作。请记住,安全是一个持续的过程,请始终关注最新的安全最佳实践。
原文地址: https://www.cveoy.top/t/topic/fAaJ 著作权归作者所有。请勿转载和采集!