本帖最后由 xu@xupt 于 2024-8-13 11:28 编辑
一、HMAC-SHA512简介
HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码,用于验证消息的完整性和真实性。SHA512(Secure Hash Algorithm 512)是SHA-2家族的一种哈希函数,它生成长度为512位的哈希值。HMAC-SHA512结合了HMAC和SHA512,形成了一种强大的加密算法,用于生成消息认证码(MAC),确保数据在传输过程中未被篡改。
HMAC的核心思想是利用一个密钥(key)和消息(message)作为输入,通过哈希函数生成一个固定长度的输出(哈希值),以确保消息的完整性和真实性。HMAC的计算过程如下:
1. 准备密钥:
- 密钥(key)通常长度与哈希块大小相同(对于SHA512,块大小为1024位)。如果密钥长度不足,填充到1024位;如果超过,先哈希再填充。
- 生成两个派生密钥:`opad`(外部填充)和`ipad`(内部填充),通过密钥与常量异或(XOR)操作得到。
2. 内部哈希计算:
- 将`ipad`和消息拼接,然后输入哈希函数,得到中间哈希值。
3. 外部哈希计算:
- 将`opad`与中间哈希值拼接,再次输入哈希函数,得到最终的HMAC值。
HMAC-SHA512的应用
HMAC-SHA512被广泛应用于各种需要数据完整性和认证的场景,如:
- TLS/SSL: 在传输层安全协议中,用于数据的完整性校验。
- IPSec: 在网络安全协议中,用于验证数据包的真实性和完整性。
- 文件签名: 用于生成文件的数字签名,确保文件未被篡改。
- JWT(JSON Web Token): 用于生成和验证Web应用中的令牌。
在STM32中,HMAC-SHA512通常由硬件加速器实现,以提高运算速度和降低功耗。编写程序时,只需调用相关库函数,即可轻松实现HMAC-SHA512的运算。
二、基于STM32CubeMX的HASH配置
基于STM32CubeMX可以配置AES、GTZC_NS、GTZC_S、HASH、OTFDEC1、PKA、RNG、SAES等多种加密算法。
三、程序解读
基于STM32微控制器的应用程序,主要用于计算HMAC-SHA512的哈希值。
在主程序开始时,调用HAL_Init()函数以重置所有外设,初始化Flash接口和systick。然后使用SystemClock_Config()函数配置系统时钟(SYSCLK),使其以250 MHz运行。
所使用的密钥是长类型(2088位 = 261字节)。
HMAC SHA-512消息摘要结果为512位长(64字节)。
预期的HMAC摘要(expectedHmacSHA512)已使用在线HASH工具计算出来。将这些值与HASH外设计算出的摘要(Sha512Hmacoutput)进行比较。如果不匹配,则LED2会闪烁。如果HMAC SHA512摘要计算正确,则LED2会点亮。
1. 头文件和预处理指令
程序首先包含了`main.h`头文件,包含一些必要的库、定义和函数原型。
2. 私有变量
HASH_HandleTypeDef hhash;
__ALIGN_BEGIN static const uint8_t pKeyHASH[261] __ALIGN_END = {...};
__ALIGN_BEGIN const uint8_t Input[INPUT_TAB_SIZE] __ALIGN_END = {...};
__ALIGN_BEGIN static uint8_t aDigest[64] __ALIGN_END;
__ALIGN_BEGIN static uint8_t aExpectedDigest[64] = {...};
- `hhash` 是一个哈希句柄,用于存储哈希模块的状态和配置信息。
- `pKeyHASH` 是HMAC的密钥,用于加密消息。
- `Input` 是要进行HMAC计算的输入数据。
- `aDigest` 是存储计算结果的数组。
- `aExpectedDigest` 是预期的哈希值,用于与计算结果进行比较。
3. 主函数 (`main`)
<blockquote>int main(void)
- `HAL_Init()` 初始化硬件抽象层(HAL)。
- `SystemClock_Config()` 配置系统时钟。
- `BSP_LED_Init(LED2)` 初始化LED2,这里用来指示程序状态。
- `MX_GPIO_Init()` 初始化GPIO。
- `MX_ICACHE_Init()` 初始化指令缓存(ICACHE)。
- `MX_HASH_Init()` 初始化HASH硬件模块,设置SHA512算法和密钥。
在`HAL_HASH_HMAC_Start`函数中,程序开始计算HMAC-SHA512哈希值,将计算结果存储在`aDigest`中。然后,它会将计算的哈希值与`aExpectedDigest`进行比较。如果不匹配,程序会进入错误处理函数`Error_Handler()`;如果匹配,LED2将点亮。
4. 系统时钟配置
void SystemClock_Config(void)
{
// 系统时钟配置代码
}
此函数配置STM32微控制器的时钟系统,包括PLL设置等。
5. HASH模块初始化
<blockquote>static void MX_HASH_Init(void)
此函数配置并初始化HASH模块,指定数据类型、密钥大小、算法(SHA512),并将密钥设置为`pKeyHASH`。
6. GPIO初始化
<p>static void MX_GPIO_Init(void)</p><p>{</p><p> __HAL_RCC_GPIOH_CLK_ENABLE();</p><p>}</p>
此函数启用了GPIOH时钟,为后续使用GPIO端口做准备。
7. 错误处理函数
<p>void Error_Handler(void)</p><p>{</p><p> while (1)</p><p> {</p><p> BSP_LED_Toggle(LED2);</p><p> HAL_Delay(200);</p><p> }</p><p>}</p>
当程序发生错误时,LED2会以200ms的间隔闪烁,指示错误状态。
|