本文主要档针对车端密钥体系,详解并对比AES‑CBC与AES‑GCM两种加密模式,结合业务场景给出选型依据。
1 AES-CBC详解
AES-CBC 不是独立加密算法,是AES分组密码搭配 CBC(Cipher Block Chaining,密码分组链接)模式构成的分组密码工作模式方案。AES 负责单个固定长度明文块的加解密;CBC 定义多个明文块如何串联、引入块间依赖,解决 ECB(电子密码本)模式的安全缺陷。
1.1 分组密码
分组密码将固定长度的明文块,在密钥控制下,置换为等长密文块;是确定性置换。AES 的块大小固定为128比特。 分组密码本身仅能加密单个块。当明文长度大于分组长度,必须使用工作模式将多个分组串联。
在分组加密这一类型中,存在ECB(电子密码本)这一基础模式。该模式核心思想:将明文直接分组,得到相同的密钥分组。但是这样的模式存在以下两种缺陷:
- 相同明文分组,得到相同密文分组;攻击者可识别重复模式;
- 块之间无任何依赖,攻击者可直接重排、删除、插入密文块而不破坏后续解密。
AES-CBC的出现很好的解决了上面的缺陷,其核心思想:让前一块密文参与当前块的加密,使得相同明文块不再产生相同密文,引入分组间相关性。
1.2 CBC模式原理
1.2.1 CBC加密流程
如图1:
步骤1:将明文按照一组128bit进行分组处理(长度不够则进行填充)并生成初始化向量IV,长度等于分组大小,不需要保密,但必须不可预测;
步骤2:第 1 块明文P1先与初始向量IV异或,再进行AES加密,得到密文C1,以下是密文C1的数学公式;
步骤3:后续每一块明文,与前一块得到的密文异或,再送入AES加密,直到算出最后的密文Cn,以下是后续加密公式:
…
图1 AES-CBC加密流程
1.2.2 CBC解密流程
如图2所示:
步骤1:解密方拿到密文C1…Cn与初始向量IV后,先将C1进行AES解密运算并与初始向量IV进行异或得到明文分组P1,以下是P1的数学公式:
步骤2:后续每一块密文都先进行AES解密运算后与前一步骤得到的明文P进行异或,直到得到最后一块明文Pn,以下是后续解密公式:
…
图2 AES-CBC解密流程
1.3 AES-CBC 优缺点总结
优点:
- 原理简单,理论成熟;
- 串行加密:加密必须等待前一块密文完成,解密可以并行;
- 广泛兼容,旧系统大量使用。
缺点:
- 加密串行,无法并行加密;但解密可并行;
- 需要填充,引入填充预言攻击面;
- 原生无消息认证,必须额外叠加HMAC,使用门槛高,极易误用;
- IV必须密码随机,工程上很容易出错;
- 存在密文块篡改导致明文可控比特翻转风险。
2 AES-GCM详解
AES-GCM(Galois/Counter Mode)是基于 AES 分组密码构造的AEAD(Authenticated Encryption with Associated Data,带关联数据的认证加密)方案。 AEAD 同时提供两项密码学安全目标:保密性(加密) + 完整性与真实性(认证);并且支持关联数据AAD(Associated Data)——AAD 不加密,但必须通过完整性校验,典型场景:报文头、协议元数据。
2.1 AEAD 基础与 GCM 的设计动机
CBC 仅提供保密性,原生无认证。为实现完整性,需要额外叠加MAC算法。而GCM 能够完成单 套原语的同时完成加密 + 认证,硬件友好、可并行,原生支持AAD。
2.2 GCM模式原理
2.2.1 构造计数器块
加密方生成一个随机数Nonce(IV)作为初始输入,若不满128bit则填充至128bit,得到初始计数器块J0,以下是J0的生成公式:
随后逐步生成计数块J0至Jn,保证每一个明文分组都有与之对应的计数块:
…
(注:其中的加法是128bit 无符号整数大端加法)
2.2.2 构造密文
对计数器块作为输入进行AES加密处理,得到密钥流块Si:
将明文P切分为128bit块P1…Pn,末尾不足128bit保留剩余比特,将明文与密钥流块Si做异或处理得到密文:
2.2.3 GHASH计算认证哈希
对关联数据 AAD和刚刚生成的密文C一起做GHASH运算。GHASH就是一个带密钥的滚动哈希,一次性把 AAD 和C的信息打包算出一个摘要,只要 AAD或者C被改动一点,摘要Y就会完全变化。
步骤1:把AAD、密文C依次拼接;不足128bit块的地方补 0 对齐;
步骤2:在拼接串末尾,额外带上AAD的长度、密文的长度信息(防止长度篡改);
步骤3:使用预先算出的哈希子密钥 H(H = AES加密全0块),在 GF (2¹²⁸) 有限域上迭代运算,得到摘要值Y。
以下是摘要值Y的运算过程:
(注:为AAD末尾填充0至128bit边界;
为C末尾填充0至128bit 边界。)
2.2.4 生成认证标签Tag
拿1.2.3中GHASH算出的摘要Y,和S0(用密钥K加密初始块J0的结果)做异或,截取指定长度,得到最终认证标签Tag:
图3 AES-GCM加密流程图
2.2.5解密与校验流程
解密方收到随机数Nonce、关联数据AAD、密文C与认证标签Tag;
首先使用Nonce生成初始计数块J0,对J0进行AES加密处理得到S0;并计算认证哈希(详情见1.2.3)得到摘要Y;最后得到Tag'=Y⊕S0,校验Tag'是否等于Tag,若不等则直接丢弃密文,相等则:
重复1.2.1章节步骤生成计数块J1至Jn,并使用相同方式得到得到密钥流块Si,通过Si与Ci异或操作还原出明文Pi:
3 AES-CBC与AES-GCM的对比
综上所述,将CBC与GCM之间进行对比,详见下表:
AES-GCM | AES-CBC | |
类型 | 分组+AEAD认证加密 | 分组模式 |
填充 | 不需要填充 | 需要 |
并行性 | 加密、解密、GHASH 均可并行 | 加密串行;解密可并行 |
关联数据 | 原生支持 | 不支持 |
认证 | 内置 Tag | 依赖外部 HMAC |
4选型原则
4.1 优先选用AES‑GCM场景
(1)载荷为高风险业务指令、上报业务数据;
(2)需要同时实现机密性、完整性、数据源认证,需要抵抗篡改、重放攻击;
(3)硬件 / 操作系统支持 GCM 硬件加速。
4.2 选用AES‑CBC场景
(1)密钥包裹场景,传输密钥材料,业务载荷有RSA/ECC签名兜底安全;
(2)存量硬件、操作系统安全库不支持GCM;
(3)本地静态数据存储。
5 业务场景选型对照表
结合车端密钥需求,业务场景、算法选择、选型理由汇总如下:
密钥名称 | 业务场景 | 选用算法 | 选型核心逻辑 |
RD‑master 脚本密钥 | 远程诊断配置脚本(云端下行下发高风险诊断脚本) | AES‑256‑GCM | 诊断脚本无上层 RSA 签名兜底;需要同时防泄露、防篡改、防重放;GCM原生完成加密+校验。 |
DC‑master‑DEK | CCU 数采数据,车辆上行上报采集数据 | AES‑256‑GCM | 上报数采数据,需要确认数据来源为真实车辆;利用AAD携带VIN、报文序号抵抗篡改与重放攻击。 |
OTA‑master‑KEK | OTA 升级密钥链,密钥包裹传输,用于固件升级 | AES‑256‑CBC | 属于密钥包裹场景;固件包整体合法性由 CCU 安全刷写公钥 RSA2048 验签兜底;CBC仅保障密钥机密性。 |
数据本地 加解密密钥DEK | CCU 安卓 / TBOX 本地业务数据存储,上下行传输 | AES‑128‑CBC | 本地静态存储加密;安卓车载组件兼容性好,完整性由上层HMAC保障 |
车云数据 加解密密钥 | 车云双向会话通信报文 | AES‑256‑CBC +HMAC‑SHA256 | 车云通信协议,加密与签名模块解耦;CBC 负责加密,HMAC独立完成完整性校验 |