crypto GCM 模式加密流
GCM 模式的工作流程
-
加密:
- 生成一个随机的 nonce(唯一值)。
- 使用 CTR 模式加密数据。
- 使用 GMAC 生成认证标签(tag),该标签用于验证数据的完整性和真实性。
- 将 nonce、密文和标签组合在一起,作为最终的加密输出。
-
解密:
- 从加密数据中提取 nonce、密文和标签。
- 使用 CTR 模式解密数据。
- 使用 GMAC 验证标签,确保数据没有被篡改。
- 如果标签验证失败,解密操作失败,返回错误。
示例代码解释
在之前的示例代码中,我们使用了 GCM 模式来进行 AES 加密和解密:
// AES加密
func encrypt(plaintext, key []byte) (ciphertext []byte, err error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
// 创建一个新的GCM模式实例
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
// 创建一个随机的nonce(唯一值)
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
return nil, err
}
// 使用GCM进行加密
ciphertext = gcm.Seal(nonce, nonce, plaintext, nil)
return ciphertext, nil
}
// AES解密
func decrypt(ciphertext, key []byte) (plaintext []byte, err error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
// 创建一个新的GCM模式实例
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
// 提取nonce
nonceSize := gcm.NonceSize()
if len(ciphertext) < nonceSize {
return nil, fmt.Errorf("ciphertext too short")
}
nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
// 使用GCM进行解密
plaintext, err = gcm.Open(nil, nonce, ciphertext, nil)
if err != nil {
return nil, err
}
return plaintext, nil
}
在这个示例中:
encrypt函数生成一个随机的 nonce,并使用 GCM 模式进行加密。加密结果包括 nonce、密文和认证标签。decrypt函数从加密数据中提取 nonce,并使用 GCM 模式进行解密和认证。如果数据被篡改,解密操作将失败。
总 结
GCM 模式提供了高效、安全和易用的加密和认证功能,是现代加密系统中的常见选择。通过结合计数器模式和 Galois 消息认证码,GCM 模式确保了数据的机密性、完整性和真实性。