AEAD(Authenticated Encryption with Associated Data) 认证加密之 AES-GCM

AEAD(Authenticated Encryption with Associated Data) 认证加密之 AES-GCM

1. 什么是AEAD

AEAD(Authenticated Encryption with Associated Data)模式是一个密码学的规范和标准。它规定了一种同时提供认证和加密的算法模式。

AEAD模式是现代加密算法和协议的基石,它提供了更高的安全性。许多标准都采用了AEAD模式,如:

  • TLS 1.3使用AES-GCM作为AEAD算法
  • SSH也有采用AEAD的加密方式,如[email protected]
  • IPsec也有AEAD算法,如AES-GCM-ESP
  • QUIC也使用了AEAD,如AES-GCM和Chacha20-Poly1305
    所以,可以说AEAD模式已经成为主流的安全通信协议和标准中广泛采用的加密规范。它提供了更高的安全性,同时具有更高的效率。

结论:AEAD模式是一个密码学的规范和标准。它定义了一种同时提供认证和加密的算法模式,已经被广泛采用于各种主流的安全通讯协议和标准中。

2. 什么是aes-gcm

AES-GCM是高级加密标准(AES)的一种工作模式,全称是Galois/Counter Mode。

它是一种有效的authenticated encryption算法,无需额外的认证算法,AES-GCM自带认证功能,可以同时完成加密和认证

AES-GCM模式的主要特点有:

  1. 基于AES算法,使用AES的密码块进行加密操作
  2. 使用Galois字段上的乘法进行认证,可以有效防止修改和重放攻击
  3. 使用计数器(Counter)来避免在加密相同的明文时产生相同的密文,增强安全性
  4. 认证标签长度较短(只有16字节),性能和带宽开销小

AES-GCM模式是目前比较流行和高效的authenticated encryption算法,已被TLS、IPsec、MACsec等大量安全协议采用,在云计算、物联网和5G等领域有广泛的应用。

AES加密 GCM和CBC模式的区别

AES加密 GCM和CBC模式的区别
参考URL: https://www.bilibili.com/video/BV1Pp4y1H7Cs/

  1. 认证功能
    AES-GCM模式带有认证功能,可以同时进行加密和认证,防止数据被篡改。
    AES-CBC模式仅提供加密,需要额外的HMAC算法进行认证。
  2. 序号使用
    AES-GCM模式使用顺序计数器作为初始化向量,可以有效防止重放攻击。
    AES-CBC模式使用随机初始化向量,需要其他机制防止重放攻击。
  3. 性能影响
    AES-GCM模式的认证只增加了16字节的认证标签,性能影响较小。
    AES-CBC模式需要HMAC算法进行认证,会产生更大的性能开销。
  4. 带宽开销
    AES-GCM模式只需携带16字节的认证标签,带宽开销较小。
    AES-CBC模式需要同时携带HMAC产生的认证值,带宽开销较大。
  5. 标准支持
    AES-GCM已被TLS 1.2/1.3、IPsec、MACsec等大量标准和协议支持和采用。
    AES-CBC逐渐被新的AES-GCM模式替代,标准支持度较差。
    总之,AES-GCM模式具有如下主要优势:
  • 带有认证功能,安全性高,可以防范修改和重放攻击
  • 认证机制简单高效,性能和带宽开销小
  • 序号使用可以有效防止重放攻击
  • 已广泛被安全标准和协议采用
    所以,AES-GCM模式是目前得到广泛支持和应用的高安全加密模式,相比之下AES-CBC模式安全性和标准支持度较差。

当需要同时进行加密和认证时,AES-GCM模式是一个很好的选择。

伽罗瓦计数器模式 GCM 原理

TODO

3. 使用AES-GCM对数据加密与解密的Go代码示例

// Encrypt 加密 使用AES-GCM
func Encrypt(plaintext string, key []byte) (string, []byte) {
    
    
    // Create AES-GCM
    block, err := aes.NewCipher(key)
    if err != nil {
    
    
        panic(err)
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
    
    
        panic(err)
    }

    // Create nonce
    nonce := make([]byte, gcm.NonceSize())
    if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
    
    
        panic(err)
    }

    // Encrypt and seal data
    ciphertext := gcm.Seal(nil, nonce, []byte(plaintext), nil)

    return hex.EncodeToString(ciphertext), nonce  // 返回nonce
}

// Decrypt 解密 使用AES-GCM
func Decrypt(ciphertext string, nonce []byte, key []byte) (string, error) {
    
    
    // Decode hex
    ciphertextByte, _ := hex.DecodeString(ciphertext)

    // Create AES-GCM
    block, err := aes.NewCipher(key)
    if err != nil {
    
    
        panic(err)
    }
    gcm, err := cipher.NewGCM(block)
    if err != nil {
    
    
        panic(err) 
    }

    // Decrypt 
    plaintext, err := gcm.Open(nil, nonce, ciphertextByte, nil)
    if err != nil {
    
    
        return "", err
    }

    return string(plaintext), nil
}
  • 在Encrypt()中生成随机Nonce,并将其与密文一起返回。
  • 在Decrypt()中使用Encrypt()返回的Nonce进行解密。
    这样可以确保在每次加密解密时都使用不同的Nonce,有效地防止重放攻击,提高安全性。

解密数据报错:panic: cipher: message authentication failed

AES-GCM模式同时提供数据的保密性和完整性。在解密数据时,需要验证认证标签来确认数据完整性。如果验证失败,会产生这个panic错误。
这个错误的常见原因有:

  1. 非法Nonce。AES-GCM需要使用与加密相同的Nonce来解密,如果Nonce不同会导致认证失败。
  2. 数据被篡改。如果密文的数据被篡改过,解密时会验证认证失败并panic。
  3. 错误密钥。使用错误的密钥解密数据也会导致认证失败。

重点先确认:确认输入的Nonce与加密时使用的相同
4. 在加密和解密时生成并使用相同的随机Nonce。
5. 如果Nonce不能提前生成,则在加密时将其与密文一起返回,解密时从输入中获取正确的Nonce。
6. 无论何种情况,必须保证解密使用的Nonce与加密相同,否则会导致认证失败并panic。

gcm.NonceSize()

在AES-GCM模式中,Nonce的大小是可配置的,并不一定相同。
gcm.NonceSize()方法会返回对应AES-GCM实例配置的Nonce大小。在创建AES-GCM实例时,可以指定Nonce的大小,例如:
go

block, err := aes.NewCipher(key)
if err != nil {
    
    
   panic(err)
}
// 指定Nonce大小为12字节
gcm, err := cipher.NewGCM(block, 12) 

所以,不同的AES-GCM实例可以有不同的Nonce大小,gcm.NonceSize()返回对应实例配置的值。

因此,为了成功解密,客户端必须提前知晓nonce的大小,并在解密时使用相同大小的nonce。

4. AES-GCM模式中的消息认证与HMAC区别

AES-GCM使用的认证机制并不是HMAC,两者有以下主要区别:

  1. HMAC使用专门的Hash算法(如SHA-256)计算MAC,AES-GCM使用AES算法本身产生认证值。
  2. AES-GCM的认证是通过Galois/Counter Mode(GCM)模式产生的,而HMAC直接使用Hash算法计算HMAC值。
  3. AES-GCM的认证使用了一个附加的Nonce值,而HMAC直接使用共享密钥和消息。
  4. AES-GCM同时提供了数据的机密性和完整性保护,HMAC只提供完整性保护。

AES-GCM通过其模式(GCM)和Nonce为每条消息生成认证值,并利用AES算法实现机密性保护

在AES-GCM中,收发双方生成相同的Nonce和认证值可以证明双方知晓相同的Nonce。但是,这只是实现过程的一部分,Nonce的主要目的是用于防止重放攻击和区分不同消息,认证值才是真正用来验证消息完整性的凭证。

总之,AES-GCM和HMAC都是基于共享密钥的消息认证机制,但两者的具体实现方式不同。AES-GCM提供了认证与加密的全套解决方案,其安全性也高于HMAC。

就是说AES-GCM不光有认证,还有加密的功效。两者的实现原理完全不同。

5. aec-cgm 知道密文、nonce 不知道私钥,有安全风险吗?

在AES-GCM加密模式下,如果攻击者知道密文和Nonce,但不知道私钥,仍存在一定的安全风险。
这是因为AES-GCM模式下使用的Nonce如果在加密不同的密文时重复使用,会导致重放攻击的安全风险。

攻击者可以使用被加密的原始密文与其对应的Nonce来伪造新的有效密文。
例如,如果使用相同的Nonce加密两个不同的密文得到:
Ciphertext1 = Encrypt(Plaintext1, Nonce, Key)
Ciphertext2 = Encrypt(Plaintext2, Nonce, Key)
那么攻击者可以将Ciphertext1解密得到Plaintext1, 然后使用相同的Nonce和Key重新加密Plaintext2得到Ciphertext1’。
Ciphertext1’ 也是一个有效的密文,也可以正确解密。这样就造成了重放攻击。

为了防止这种攻击,AES-GCM模式下必须要使用不同的随机Nonce对不同的明文进行加密。
所以,如果攻击者知道某个密文和其对应的Nonce,就可以使用这个Nonce重新加密其他的明文,伪造新的密文,这是一定的安全风险。
不过,如果除Nonce外,攻击者还不知道私钥,那么他仍然无法解密阅读原始的密文,或是解密伪造出的新的有效密文。私钥的安全仍然是最重要的一环。

总结:在AES-GCM模式下,如果攻击者知道某个密文与其Nonce,由于存在重放攻击的风险,理论上可以伪造新的有效密文。
但如果私钥仍然安全,他们无法解密任何密文,安全性仍然可以得到基本保障。

猜你喜欢

转载自blog.csdn.net/inthat/article/details/131105960
今日推荐