安全启动相关的加密服务
1 随机数生成器
伪随机数生成器(PRNG)基于由HSM实现的真随机数生成器(TRNG)生成的种子。PRNG序列使用AES-CTR模式生成,该模式使用一个从零开始的计数器进行生成。
- 种子生成:PRNG的种子由TRNG模块生成。
- 生成模式:使用AES-CTR模式生成伪随机数,确保生成的序列具有良好的随机性。
真随机数生成器(TRNG)TRNG模块利用非确定性现象生成随机数据流,该数据流符合德国BSI AIS-20/31出版物定义的质量标准[15]。
- 数据块大小:TRNG外设可以生成8位、16位或32位的数据块。
- API组合:这些数据块进一步组合,以为用户提供128位的数据(由四个32位字组成)。
TRNG的随机性和不可预测性使其适用于需要高安全性的应用,如密钥生成和加密操作。
2 AES算法
高级加密标准(AES)指定了一个经过FIPS批准的加密算法,可用于保护电子数据。AES算法是一种对称块密码,可以加密(加密)和解密(解密)信息。加密将数据转换为称为密文的不可读形式;解密密文将数据恢复为原始形式,称为明文。AES算法能够使用128、192和256位的密钥对128位的块进行加密和解密。
在AURIX中,AES硬件外设的当前实现仅支持128位的加密密钥,并且处理128位的数据块。它能够对单个128位数据块(即明文或密文块)进行加密和解密,也可以对多个128位的数据块进行加密或解密。为此,实施了几种所谓的操作模式:
-
ECB(电子密码本模式):每个数据块独立加密。简单但不够安全,因为相同的明文块总是会加密成相同的密文块。
-
CBC(密码块链模式):每个数据块在加密前与前一个数据块的密文进行异或操作。提高了安全性,因为相同的明文块将被加密为不同的密文块。
-
CTR(计数器模式):使用计数器作为密钥流生成器,将密文和明文与计数器加密的结果进行异或操作。能够支持并行加密。
-
OFB(输出反馈模式):将加密后的密文块作为下一轮加密的输入。适合需要流模式加密的场景。
-
CFB(密码反馈模式):与OFB类似,但加密结果与明文块进行异或操作。适用于流模式加密。
-
GCM(Galois计数器模式):结合了计数器模式的加密和Galois/Counter模式的认证。提供加密和数据完整性验证。
-
XTS(XEX基于调节密码本模式与密文窃取):用于加密磁盘块设备的数据,提供更高的安全性和数据完整性。
2.1 填充
AES操作在128位块上进行。当数据长度不是128位的倍数时,该块必须进行填充。用户代码负责填充数据块,常用的填充模式有三种:
ANSI X.923
在ANSI X.923中,用零字节填充数据块,最后一个字节定义了填充的边界或填充字节的数量。例如,块大小为8字节,需填充4字节(以十六进制格式表示):
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
PKCS#7
PKCS#7描述在RFC 2315和RFC 5652中。填充是按完整字节进行的。每个填充字节的值是添加的字节数,即N字节,每个字节的值为N。添加的字节数取决于需要扩展到的块边界。填充将是以下之一:
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
- 依此类推...
这种填充方法(以及前两种)在N小于256的情况下是明确定义的。例如,块大小为8字节,需填充4字节:
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
零填充
所有需要填充的字节用零填充。例如,块大小为8字节,需填充4字节:
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
2.2 加密模式
电子密码本模式(ECB)
ECB是最简单的加密模式。消息被划分为块,每个块单独加密。这种方法的缺点在于,相同的明文块会被加密成相同的密文块。由于没有块间的依赖性,这种模式在某些情况下会暴露数据模式的信息。例如,如果明文中有重复的数据块,那么加密后的密文中也会有相同的块,这可能使攻击者通过分析密文块之间的模式来推断出一些信息。
这种模式的优点是其实现简单,并且可以并行处理块,因为每个块的加密操作是独立的。然而,正是因为其结构上的简单性,ECB模式在处理需要高安全性的场合时通常不被推荐,因为它无法隐藏数据中的模式信息。
密文块链接(CBC)模式
密文块链接(Cipher-Block Chaining, CBC)模式是由Ehrsam、Meyer、Smith和Tuchman于1976年发明的。它通过在加密过程中引入块间的依赖关系,解决了电子代码本(ECB)模式的一些安全问题。以下是CBC模式的工作原理:
-
初始化向量(IV):CBC模式要求为第一个明文块使用一个初始化向量(IV)。IV是一个随机或伪随机的值,用于确保相同的明文在不同的加密操作中生成不同的密文。IV必须在每次加密会话中唯一且随机,以保持安全性。
-
异或操作:每个明文块在加密之前都会与前一个密文块进行异或(XOR)操作。这意味着每个密文块不仅依赖于明文,还依赖于前一个密文块。
-
加密:在与前一个密文块异或之后,结果将使用AES算法加密,生成当前的密文块。
-
解密:在解密过程中,操作过程会反转。每个密文块先被解密得到异或值,然后与前一个密文块(第一个块使用IV)进行异或,以恢复原始的明文块。
通过这种方式,CBC模式通过异或操作和加密将块链接在一起,确保即使明文块相同,每个密文块也都是唯一的。
基于密码的消息认证码(CMAC)
CMAC(Cipher-based Message Authentication Code)是一种基于对称密钥块密码(如高级加密标准AES)的密钥哈希函数。CMAC旨在提供比校验和或错误检测代码更强的数据完整性保证。下面是CMAC的详细介绍:
-
功能与优势:
- 数据完整性保证:CMAC提供的数据完整性保证比校验和或错误检测代码更为强大。校验和或错误检测代码只能检测到数据的意外修改,而CMAC则能够检测到有意的、未经授权的修改,此外也可以检测到意外的修改。
- 对称密钥算法:CMAC基于对称密钥块密码(例如AES),而HMAC(哈希消息认证码)则基于哈希函数(如SHA-1)。因此,当AES在系统中更为可用时,AES-CMAC是更合适的选择。
-
工作原理:
- 密钥:CMAC使用对称密钥进行操作,该密钥用于加密消息。
- 加密操作:AES-CMAC算法将消息分成块,并通过对称密钥和AES算法进行加密。每个消息块经过加密后与前一个密文块进行异或操作,直到处理完整个消息。
- 生成MAC值:最终生成的消息认证码(MAC)是对整个消息的唯一标识。任何对消息内容的修改都会导致MAC值的改变,从而能够检测到数据的篡改。
基于哈希的消息认证码(HMAC)
HMAC(Hash-based Message Authentication Code)是一种使用哈希函数和密钥的认证机制。它结合了哈希函数的安全性与密钥的保密性,以提供消息的完整性和认证。HMAC的定义来源于RFC 2104,具体公式如下:
其中:
- H 是一个加密哈希函数。
- K 是秘密密钥。
- m 是需要认证的消息。
- K_0 是从原始密钥 K 派生出的另一个秘密密钥。其生成方式是将 K 右填充额外的零,以适应哈希函数的输入块大小,或如果 K 的长度超过块大小,则对 K 进行哈希处理。
- **||**表示拼接操作。
- ^ 表示异或(XOR)操作。
- opad 是外部填充(0x5c5c5c...5c5c,长度为一个块的十六进制常量)。
- ipad 是内部填充(0x363636...3636,长度为一个块的十六进制常量)。
HMAC 算法的文字描述
-
密钥处理:
- 长度等于块大小(B):如果密钥 K 的长度等于块大小 B,则直接将 K 作为 K0。
- 长度大于块大小(B):如果密钥 K 的长度大于 B,需要对 K 进行哈希计算得到一个长度为 L 的字符串,然后在其后附加零,直到其长度为 B,即 K0 = H(K) 后跟若干个零。
- 长度小于块大小(B):如果密钥 K 的长度小于 B,则在 K 的末尾添加零,使其长度达到 B 字节,从而得到 K0。
-
填充和异或操作:
- 用内部填充常量(ipad)与 K0 进行异或操作,得到一个长度为 B 字节的中间字符串。
- 将待认证的消息 m 附加到这个中间字符串后面。
-
计算哈希值:
- 对上述组合后的数据(K0 与 ipad 异或后的结果加上消息 m)应用哈希函数,得到一个哈希值。
-
外部填充和异或操作:
- 用外部填充常量(opad)与 K0 进行异或操作,得到另一个长度为 B 字节的字符串。
- 将步骤 3 中得到的哈希值附加到这个字符串后面。
-
最终哈希计算:
- 对上述组合后的数据(K0 与 opad 异或后的结果加上步骤 3 的哈希值)再次应用哈希函数,得到最终的 HMAC。