英飞凌 TC3XX单片机HSM内核开发-Secure Boot(三)

安全启动相关的加密服务

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模式的工作原理:

  1. 初始化向量(IV):CBC模式要求为第一个明文块使用一个初始化向量(IV)。IV是一个随机或伪随机的值,用于确保相同的明文在不同的加密操作中生成不同的密文。IV必须在每次加密会话中唯一且随机,以保持安全性。

  2. 异或操作:每个明文块在加密之前都会与前一个密文块进行异或(XOR)操作。这意味着每个密文块不仅依赖于明文,还依赖于前一个密文块。

  3. 加密:在与前一个密文块异或之后,结果将使用AES算法加密,生成当前的密文块。

  4. 解密:在解密过程中,操作过程会反转。每个密文块先被解密得到异或值,然后与前一个密文块(第一个块使用IV)进行异或,以恢复原始的明文块。

通过这种方式,CBC模式通过异或操作和加密将块链接在一起,确保即使明文块相同,每个密文块也都是唯一的。


基于密码的消息认证码(CMAC)

CMAC(Cipher-based Message Authentication Code)是一种基于对称密钥块密码(如高级加密标准AES)的密钥哈希函数。CMAC旨在提供比校验和或错误检测代码更强的数据完整性保证。下面是CMAC的详细介绍:

  1. 功能与优势

    • 数据完整性保证:CMAC提供的数据完整性保证比校验和或错误检测代码更为强大。校验和或错误检测代码只能检测到数据的意外修改,而CMAC则能够检测到有意的、未经授权的修改,此外也可以检测到意外的修改。
    • 对称密钥算法:CMAC基于对称密钥块密码(例如AES),而HMAC(哈希消息认证码)则基于哈希函数(如SHA-1)。因此,当AES在系统中更为可用时,AES-CMAC是更合适的选择。
  2. 工作原理

    • 密钥: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 算法的文字描述

  1. 密钥处理

    • 长度等于块大小(B):如果密钥 K 的长度等于块大小 B,则直接将 K 作为 K0。
    • 长度大于块大小(B):如果密钥 K 的长度大于 B,需要对 K 进行哈希计算得到一个长度为 L 的字符串,然后在其后附加零,直到其长度为 B,即 K0 = H(K) 后跟若干个零。
    • 长度小于块大小(B):如果密钥 K 的长度小于 B,则在 K 的末尾添加零,使其长度达到 B 字节,从而得到 K0。
  2. 填充和异或操作

    • 用内部填充常量(ipad)与 K0 进行异或操作,得到一个长度为 B 字节的中间字符串。
    • 将待认证的消息 m 附加到这个中间字符串后面。
  3. 计算哈希值

    • 对上述组合后的数据(K0 与 ipad 异或后的结果加上消息 m)应用哈希函数,得到一个哈希值。
  4. 外部填充和异或操作

    • 用外部填充常量(opad)与 K0 进行异或操作,得到另一个长度为 B 字节的字符串。
    • 将步骤 3 中得到的哈希值附加到这个字符串后面。
  5. 最终哈希计算

    • 对上述组合后的数据(K0 与 opad 异或后的结果加上步骤 3 的哈希值)再次应用哈希函数,得到最终的 HMAC。
相关推荐
DIY机器人工房2 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技
Johny_Zhao4 小时前
K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站
linux·网络·mysql·nginx·网络安全·信息安全·tomcat·云计算·shell·yum源·系统运维·itsm
小智学长 | 嵌入式5 小时前
单片机-STM32部分:13-1、蜂鸣器
stm32·单片机·嵌入式硬件
#金毛5 小时前
六、STM32 HAL库回调机制详解:从设计原理到实战应用
stm32·单片机·嵌入式硬件
欢乐熊嵌入式编程7 小时前
智能手表 MCU 任务调度图
单片机·嵌入式硬件·智能手表
sword devil9008 小时前
将arduino开发的Marlin部署到stm32(3D打印机驱动)
stm32·单片机·嵌入式硬件
GodKK老神灭8 小时前
STM32 变量存储
stm32·单片机·嵌入式硬件
木宁kk8 小时前
51单片机引脚功能概述
单片机·嵌入式硬件
JANYI20188 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
sword devil90010 小时前
Arduino快速入门
stm32·单片机·嵌入式硬件