AES-GCM

AES-GCM通过在CTR模式基础上添加tag提供额外的安全性,防止选择明文攻击。然而,重复使用nonce可能导致H的泄露,从而允许执行Forbidden Attack来伪造tag。在UTCTF 2020 Galois挑战中,尽管预期攻击是针对AES-GCM的Forbidden Attack,但实际上可以利用CTR模式的弱点求解。该博客讨论了攻击的原理和复现过程,并提到了其他可能的解题方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AES-GCM

badmonkey的博客
AES-GCM是基于AES-CTR模式改编的,不同于CTR的是GCM在对明文进行加密的时候还会产生tag(类似签名的东西),可以有效的抵御选择明文攻击,因为GCM首先会看tag是否合法,然后才决定是否调用decrypt oracle 进行解密。加密的流程在这篇paper讲的很清楚,我把其中的一部分拿了出来(只有两个明文块的情况)

加密流程

具体的符号定义如下:

符号定义

其中: H = E n c k ( 0 128 ) H=Enc_k(0^{128}) H=Enck(0128)

经过多次的 G m u l H ( X ) Gmul_H(X) GmulH(X),最后将结果和处理后的密文C和填充的信息A异或得到T即tag。需要注意的是nonce是不能重复使用的,否则会造成H的泄露,进而伪造tag,接着应该就可以利用oracle的点了(口胡,原文只是说了TLS相关的东西)。

Forbidden Attack

利用重复使用的nonce所生成的T和C,求解H,伪造新的tag。

每次的X都是根据上一次的X计算得到的,具体的关系如下

递归式

最终的X可以表示为:
X m + n = A 1 H m + n + A 2 m + n − 1 + ⋯ + A m H n + 1 + C 1 H n + C 2 H n − 1 + ⋯ + C n H X_{m+n}=A_1H^{m+n}+A_2^{m+n-1}+ \cdots +A_mH^{n+1}+C_1H^n+C_2H^{n-1}+\cdots +C_nH Xm+n=A1Hm+n+A2m+n1++AmHn+1+C1H

<think>好的,我需要帮助用户了解和使用AES-GCM-128加密算法。首先,我应该回顾一下AES-GCM的基本概念。AES是高级加密标准,使用对称密钥,而GCM是Galois/Counter Mode,提供认证加密。AES-GCM-128指的是使用128位密钥的AES算法结合GCM模式。 接下来,我需要解释AES-GCM的工作原理。可能包括加密过程、认证标签的生成,以及其优势,比如同时提供机密性和完整性。需要确保使用正确的术语,比如IV(初始化向量)、nonce,以及它们的长度要求。例如,通常IV是12字节,这样在计数器模式下更高效。 然后,用户可能需要知道如何实现AES-GCM-128。这里要参考现有的库和API,比如Java中的javax.crypto库,或者Bouncy Castle的实现。需要提供示例代码,但根据用户提供的引用,特别是引用[2]中的Bouncy Castle示例代码和测试类,可能应该用Java来展示。同时,要确保代码符合安全实践,比如正确生成密钥和IV,不使用固定值。 还要注意提到的引用[1],即RFC 3602关于AES-CBC在IPsec中的应用,但用户问的是GCM模式,可能需要指出GCM通常用于需要认证加密的场景,如TLS 1.3,而CBC可能在某些传统系统中使用。不过RFC 3602可能不直接相关,但可以说明标准文档的重要性。 另外,引用[3]提到Java安全API的广泛性,包括加密和PKI接口,这可能支持使用Java作为示例语言。因此,代码示例可以使用Java的Cipher类,指定"AES/GCM/NoPadding"转换,并处理关联数据(AAD)和认证标签。 还需要讨论实现中的注意事项,比如密钥管理、IV的唯一性、认证标签的验证等。安全问题如重复IV的风险必须强调,因为会导致密钥泄露。 用户可能需要知道如何生成密钥和IV。可以使用KeyGenerator类生成128位的AES密钥,而IV应该通过SecureRandom生成,确保每次加密都是唯一的。此外,GCM通常推荐12字节的IV,因为更高效。 在性能方面,可以提到GCM的效率,尤其是在硬件支持AES-NI指令集的处理器上,但这是底层细节,可能不需要深入。不过用户可能关心资源消耗,特别是在轻量级应用中,但引用[4]中的优化库可能不直接相关,但说明性能优化可以通过适当选择库来实现。 最后,生成相关问题,比如与其他模式(如CBC)的比较、常见错误、认证失败处理、性能优化等,这些问题可以帮助用户进一步学习。 需要确保所有数学公式和变量使用$...$格式,例如,提到计数器模式时的数学表达式,但用户的问题可能不涉及太多数学,但如果有的话,比如GHASH函数的计算,需要用正确的LaTeX格式。独立公式如加密过程的描述如果需要,使用$$...$$。 检查是否有站内引用需要添加,比如引用[1]、[2]、[3]中的内容,在适当的地方引用。例如,当提到Bouncy Castle实现时,可以引用[2],或者在讨论Java安全API时引用[3]。 现在组织回答结构:概述、工作原理、实现步骤、示例代码、注意事项、相关问题。各部分要清晰,使用标题,但根据用户要求避免使用Markdown格式,所以用数字或项目符号分隔。</think>### AES-GCM-128加密算法详解与实现 #### 1. **概述** AES-GCM-128是一种结合加密与认证的对称加密算法,基于AES(Advanced Encryption Standard)的128位密钥和GCM(Galois/Counter Mode)模式。其核心优势是同时提供数据机密性、完整性和身份验证,适用于高性能网络传输(如TLS 1.3)和存储加密[^1]。 #### 2. **工作原理** - **加密流程**: 1. 生成12字节的随机Nonce(一次性数值)作为初始化向量(IV)。 2. 使用AES-CTR模式加密明文,生成密文。 3. 通过GHASH函数计算密文和附加数据(AAD)的认证标签(通常16字节)。 公式表示:$$ \text{密文} = \text{AES-CTR}(K, \text{Nonce}, \text{明文}) $$ $$ \text{标签} = \text{GHASH}(K, \text{AAD} \parallel \text{密文}) $$ - **解密流程**: 解密后需重新计算标签并与接收的标签对比,若不一致则数据被篡改。 #### 3. **实现步骤(以Java为例)** ```java import javax.crypto.*; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; public class AESGCMExample { public static void main(String[] args) throws Exception { // 1. 生成密钥(需安全存储) byte[] keyBytes = new byte[16]; // 128位密钥 new SecureRandom().nextBytes(keyBytes); SecretKey key = new SecretKeySpec(keyBytes, "AES"); // 2. 生成12字节Nonce byte[] nonce = new byte[12]; new SecureRandom().nextBytes(nonce); // 3. 初始化加密器 Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(128, nonce); // 128位标签长度 cipher.init(Cipher.ENCRYPT_MODE, key, spec); // 4. 添加AAD(可选) cipher.updateAAD("AdditionalData".getBytes()); // 5. 加密数据 byte[] plaintext = "Hello, AES-GCM!".getBytes(); byte[] ciphertext = cipher.doFinal(plaintext); // 解密流程类似,需传递相同的Nonce和密钥 } } ``` #### 4. **注意事项** - **Nonce唯一性**:同一密钥下,Nonce不可重复,否则可能泄露密钥[^1]。 - **密钥管理**:密钥需通过安全随机数生成,并存储在硬件安全模块(HSM)或密钥库中[^3]。 - **认证标签验证**:解密时必须验证标签,否则可能接受篡改数据。 - **性能优化**:GCM模式对硬件加速支持良好,如Intel AES-NI指令集可提升吞吐量[^4]。 #### 5. **与其他模式的对比** - **AES-CBC**:仅提供加密,需单独实现MAC(如HMAC)保证完整性[^1]。 - **AES-GCM**:集成加密与认证,性能更高且代码更简洁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值