news 2026/4/23 11:13:11

AES-GCM加密全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AES-GCM加密全流程解析

核心架构:GCM =CTR流加密+GHASH认证
安全目标:机密性 + 完整性 + 抗重放(AEAD模式)


🔄完整加密流程(以AES-128为例)

步骤1:初始化参数准备
参数要求示例值
密钥(K)128/192/256位0x2b7e151628aed2a6abf71588...
Nonce(IV)唯一值(推荐12字节随机)0xcafebabefacedbad(12字节)
附加数据(AAD)需认证的明文头(可空)HTTP协议头
明文(P)待加密数据"SecretMessage" (14字节)

⚠️致命规范:同一密钥下Nonce绝对不可重复


步骤2:生成认证子密钥H

  • 操作:用密钥K加密16字节的全零块
  • 作用:作为GHASH乘法的固定密钥(Galois域乘数)

步骤3:构造初始计数器(J₀)
  • Case 1:Nonce为12字节(推荐)

    示例:0xcafebabefacedbad00000001

  • Case 2:Nonce非12字节

  • IV = 96位(12字节):直接作为前128位计数器块的高96位,低32位置0:J₀ = IV || 0³¹1(即IV后补4字节00 00 00 01)。
  • IV ≠ 96位:通过GHASH函数计算J₀ = GHASH_H(IV || 0^{s} || len(IV)_64),其中s = 128 - (len(IV) mod 128) - 128len(IV)_64是IV长度的64位表示。

步骤4:CTR模式加密明文
# 伪代码实现 def CTR_Encrypt(K, J0, plaintext): ctr = J0 # 初始计数器 ciphertext = b'' for i in range(0, len(plaintext), 16): ctr = increment(ctr) # 末32位+1 (Big-Endian) keystream = AES_Encrypt(K, ctr) block = plaintext[i:i+16] # 当前明文块 ciphertext += xor(block, keystream[:len(block)]) return ciphertext
  • 特性
    • 无填充要求(任意长度数据)
    • 支持并行计算(硬件加速关键)

✅ **步骤5:GHASH认证计算

输入数据序列

  • 数据块拆分

  • 迭代GHASH计算

    \begin{align*} Y_0 &= 0^{128} \\ Y_i &= (Y_{i-1} \oplus X_i) \cdot H \quad \text{(GF(2^{128})乘法)} \\ \text{结果} &= Y_m \end{align*}
  • 解析:输入拼接X = AAD || 0^v || C || 0^u || len(AAD)_64 || len(C)_64
    • len()_64:AAD和C长度的64位大端表示。
    • u:填充至密文长度为128的倍数(u = 128 - (len(C) mod 128))。
    • v:填充至AAD长度为128的倍数(v = 128 - (len(AAD) mod 128))。
    • 分块处理:将X分成128位块X_1, X_2, ..., X_n
    • 迭代计算
      Y_0 = 0¹²⁸ Y_i = (Y_{i-1} \oplus X_i) \cdot H \quad \text{(在GF(2¹²⁸)域)}
      • 最终输出S = Y_n(GHASH结果)。
  • 加密初始计数器块T' = CIPH_K(J₀)

  • 生成标签T = MSB_t(S \oplus T')(取结果的前t位,通常t=128)。

🔬GF(2¹²⁸)乘法优化
硬件通过CLMUL指令单周期完成(Intel/AMD CPU)


步骤6:生成认证标签(Tag)

  • 截断输出(可选但需≥96位):

📦最终输出

组件长度要求示例
密文(C)同明文长度0x3AD77BB40D7A3660...
认证标签(T)128位(不可截断)0x5BC94FBC3221A5DB94FAE95...

🔧解密验证流程

  1. 用相同(K, Nonce)重新计算CTR密钥流
  2. 解密获得明文:P' = C ⊕ keystream
  3. 认证验证
    • 用相同参数重算GHASH → 得预期标签T_expected
    • 比对接收标签T_received == T_expected
    • 不等则立即丢弃数据(防篡改)

安全关键点

  1. Nonce重用灾难
    • 若两次加密使用相同(K, Nonce)H密钥泄露→ 完全破解
      # 攻击示例(理论) T1 ⊕ T2 = (AES(K,J0)⊕GHASH1) ⊕ (AES(K,J0)⊕GHASH2) = GHASH1 ⊕ GHASH2
  2. Tag长度安全
    • 96位Tag → 暴力破解概率≈1/2⁹⁶(安全)
    • 64位Tag → 暴力破解仅需分钟级(危险!)

📊 GCM性能优化(硬件加速)

平台密钥长度吞吐量加速技术
Intel AES-NIAES-25612 GB/s单指令完成AES轮函数
ARMv8 Crypto扩展AES-1285.2 GB/s并行CTR + PMULL指令
NVIDIA A100 GPUAES-256240 GB/s万级并发CTR计数器流

💡设计建议:TLS 1.3等协议强制使用GCM,因其在10Gbps网络下CPU占用率<3%。


💎总结:GCM操作清单

  1. 生成随机Nonce(12字节)
  2. 计算认证子密钥 H = AESₖ(0¹²⁸)
  3. 构造计数器初值 J₀ = Nonce || 0x00000001
  4. CTR模式加密:C = AESₖ(J₀+1) ⊕ P
  5. GHASH认证:T' = GHASHₕ(AAD || C || len(AAD) || len(C))
  6. 生成标签:T = AESₖ(J₀) ⊕ T'
  7. 输出 (C, T)

最后警示
始终通过恒定时间比较验证标签(防时序攻击),并遵循NIST SP 800-38D标准实现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 11:25:52

新站如何月入过万?我用这5招让流量暴涨200倍

今天跟大家分享一下我做 AI 图片生成工具这个项目的 SEO 经验。看到后台数据从 0 飙到月访 18.7K&#xff0c;真的挺爽的。 先看看我的成绩单 截止 2025年11月&#xff0c;我的网站数据&#xff1a; 月访问量&#xff1a;18.71K&#xff08;从9月的0开始&#xff09;跳出率&a…

作者头像 李华
网站建设 2026/4/18 12:39:28

LobeChat能否对接Asana项目管理?任务分配AI辅助

LobeChat能否对接Asana项目管理&#xff1f;任务分配AI辅助 在现代敏捷团队的日常协作中&#xff0c;一个常见的场景是&#xff1a;会议刚结束&#xff0c;产品经理随口说了一句“把用户登录优化的需求加到V2迭代里&#xff0c;让王芳下周完成”&#xff0c;结果半小时后发现—…

作者头像 李华
网站建设 2026/4/23 5:05:30

MHT-FE710 光纤组合导航系统技术指南:高精度导航的多接口适配与工程实践

在自动驾驶特种车辆、大型无人机、远洋船舶等高端导航场景中&#xff0c;导航设备的姿态精度、多源适配能力与环境可靠性直接决定作业质量。苏州邈航 MHT-FE710 光纤组合导航系统&#xff0c;以≤0.03 航向精度、多接口兼容特性及强环境耐受能力&#xff0c;成为高端场景的核心…

作者头像 李华
网站建设 2026/4/18 9:50:25

MyBatis 全面解析 Spring Boot 集成实战

目录 一、MyBatis 核心原理 1. 核心架构 2. 核心特性 二、Spring Boot 集成 MyBatis 实战 1. 环境准备 &#xff08;1&#xff09;依赖引入&#xff08;Maven&#xff09; &#xff08;2&#xff09;核心配置&#xff08;application.yml&#xff09; 2. 代码实现 &am…

作者头像 李华
网站建设 2026/4/18 3:27:29

大语言模型推理性能优化:Axolotl缓存加速技术深度解析

大语言模型推理性能优化&#xff1a;Axolotl缓存加速技术深度解析 【免费下载链接】axolotl 项目地址: https://gitcode.com/GitHub_Trending/ax/axolotl 在大规模语言模型应用部署中&#xff0c;重复计算是影响推理效率的主要瓶颈。特别是在客服系统、内容生成平台等高…

作者头像 李华
网站建设 2026/4/13 7:29:24

怎么查看自己Ubuntu剩余空间有多少个G呢?

问题描述&#xff1a;怎么查看自己Ubuntu剩余空间有多少个G呢&#xff1f;问题解答&#xff1a;在 Ubuntu 上查看剩余磁盘空间&#xff08;多少 GB&#xff09;&#xff0c;最常用、也最直观的方法有下面几种 &#x1f447;✅ 方法 1&#xff1a;df -h&#xff08;最推荐&#…

作者头像 李华