伽罗瓦/计数器模式(GCM)详解
伽罗瓦/计数器模式(GCM)详解
Galois/Counter模式(GCM)是一种用于关联数据的已验证加密算法,基于128位对称密钥密码构造,类似于高级加密标准(AES)。GCM通过计数器模式保证数据机密性,并使用二进制有限字段上的通用散列函数(GHASH)提供数据真实性的验证。本文将详细介绍GCM的工作原理、功能及其在DLMS/COSEM中的应用。
1. 概述
Galois/Counter模式(GCM)是一种用于关联数据的已验证加密的算法。GCM由一个经认可的分组长度为128位的对称密钥密码构造而成,类似于高级加密标准(AES)算法,参见FIPS PUB 197。因此,GCM是AES算法的一种操作模式。
GCM使用Counter操作模式的一种变体来保证数据的机密性。GCM使用定义在二进制有限字段(GHASH)上的通用散列函数,提供机密数据真实性的保证(每次调用最多64 GB)。GCM还可以为未加密的额外数据(每次调用实际上是无限长度的)提供身份验证保证。
如果GCM输入被限制为不需要加密的数据,那么GCM的专门化结果(称为GMAC)只是输入数据上的一种身份验证模式。GCM提供了比(非加密的)校验和或错误检测码更强的认证保证;特别地,GCM可以检测:
- 意外的数据修改
- 有意的、未经授权的修改
在DLMS/COSEM中,也可以使用GCM仅提供机密性:在这种情况下,不计算和检查身份验证标记。
2. GCM功能
构成GCM的两个功能被称为认证加密和认证解密,如下图所示。
认证加密函数对机密数据进行加密,并对机密数据和任何额外的非机密数据计算一个认证标签。认证解密函数解密机密数据,取决于对标签的验证。
当输入仅限于非机密数据时,GCM的变体称为GMAC。在GMAC中,认证加解密函数变成了对非机密数据生成和验证认证标签的函数。
最后,如果不需要身份验证,则身份验证加密函数加密机密数据,但不计算身份验证标签。认证解密函数解密机密数据,但不计算和验证认证标签。
在DLMS/COSEM中,身份验证和加密的使用由安全控制字节的第4位和第5位表示。
a) 给定分组密码密钥EK,验证加密函数有三个输入字符串:
- 明文,记为P;
- 附加认证数据(AAD),记为A;
- 初始化向量(IV),记为IV。
明文和AAD是GCM保护的两类数据。GCM保护明文和AAD的真实性;GCM还可以保护明文的机密性,而AAD则不受影响。
IV本质上是一个nonce,即在指定(安全)上下文中唯一的值,它决定对要保护的输入数据调用身份验证加密功能。
认证加密功能输入字符串的位长度应满足以下要求:
- len(P) < 2^39-256;
- len(A) < 2^64-1;
- 1 < len(IV) < 2^64-1
P、A和IV的位长都是8的倍数,因此这些值都是字节串。
有两个输出:
- 一个密文,记为C,其比特长度与明文P相同;
- 身份验证标签(tag),简称T。
b) 身份验证解密函数——给定选择的分组密码密钥EK——有四个输入字符串:
- 初始化向量,记为IV;
- 密文,记为C;
- 附加的认证数据(AAD),记为A;
- 身份验证标签,记为T。
输出如下:
明文P对应密文C,即
在技术报告中表示失败的特殊错误码。
输出P表明T是IV、A和C的正确认证标签;否则,输出为FAIL。
3. 初始化向量IV
在DLMS/COSEM中,用于构造初始化向量IV的确定性构造,如NIST SP 800-38D:2007, 8.2.1应使用所规定的:IV是两个字段的连接,称为固定字段和调用字段。fixed字段应该标识物理设备,或者更一般地,标识身份验证加密函数实例的(安全)上下文。调用字段应标识该特定设备中验证加密函数的输入集合。
对于任何给定的密钥,任何两个不同的物理设备不应该共享相同的固定字段,任何设备的两个不同的输入集不应该共享相同的调用字段。
IV的长度应该是96位(12位):len(IV) = 96。在此:
- 前导(即最左)64位(8位)应保持固定字段。其中应包含系统标题,见4.3.4;
- 尾部(即最右边)32位应保存调用字段。调用字段应该是一个整数计数器。
对于每个加密密钥EK(即分组密码密钥),分别为验证加密和验证解密功能维护一个调用计数器(IC)。适用的规则如下:
- 密钥建立后,对应ic复位为0;
- 当使用认证加密函数时,使用相应的IC,然后将其加1。但是,当IC已达到最大值时,后续对认证加密函数的调用应返回错误,且IC不得增加;
- 使用认证解密功能时,对IC的值进行校验。如果被验证的值小于最小可接受值,则IC的验证失败,认证的解密函数也会失败。如果验证成功,最低可接受值设置为已验证IC的值加1。如果被验证的值等于最大值,则经过验证的解密函数将返回错误。
固定字段的位长限制了能够实现给定密钥的认证加密功能的不同物理设备的数量为2^64。调用字段的比特长度限制了对任何给定输入集调用经过身份验证的加密函数的次数为2^32次,而不违反唯一性要求。
4. 加密密钥EK
GCM只使用一个密钥,即分组密码密钥。在DLMS/COSEM中,这被称为加密密钥,记为EK。它的大小取决于安全套件(见9.2.3.7),应该是:
- 对于安全套件0和1,128位(16位):len(EK) = 128;
- 对于安全套件2,256位(32位):len(EK) = 256;
密钥应随机均匀生成,或近似随机均匀生成,即使每个可能的密钥(几乎)均等地生成。因此,密钥很可能是新的,即不等于任何先前的密钥。密钥必须是保密的,并且只有使用选定的分组密码AES的GCM才能使用应使用。NIST SP 800-38D:2007, 8.1中讨论了密钥建立和管理的其他要求。
5. 认证密钥AK
在DLMS/COSEM中,为了增加安全性,还指定了一个身份验证密钥AK。提交时,应作为附加认证数据的一部分。对于密钥的长度和生成,规则与加密密钥相同。
6. 认证标记的长度
认证标签的位长t是一个安全参数。在安全套件0、1和2中,其值应为96位。