硬件加密中实现 SHA (SHA-1 / SHA-256)
WIZnet W55MH32 是一款高性能微控制器,内置 ARM Cortex-M3 内核,最高运行频率可达 216 MHz。它集成了硬件加密引擎,支持多种加密算法,包括 SHA-1 和 SHA-256。利用 W55MH32 的硬件 SHA 功能,能够提升嵌入式应用的数据完整性和安全性,特别适用于涉及网络通信的应用场景。
本应用笔记将介绍 SHA 的基本功能、其在 SSL/TLS 协议中的角色,以及 SHA 在 W55MH32 上的实际应用。
SHA 概述
什么是SHA?
安全散列算法(SHA)是一种密码学散列函数,可以将任意长度的输入数据转换成固定长度的摘要(哈希值)。WIZnet W55MH32 通过硬件加密引擎支持 SHA-1(160 位摘要)和 SHA-256(256 位摘要),能够实现加速、低功耗的哈希运算。SHA 是单向函数, 这意味着从哈希值反推出原始数据在计算上是不可行的,同时找到两个不同输入却产生相同哈希值(碰撞)也是极其困难的。
SHA 在微控制器中的处理流程
SHA 硬件引擎或驱动通常提供三阶段函数结构:
- Start: 该阶段用于初始化 SHA 引擎并选择所需的哈希算法(SHA-1 或 SHA-256),设置内部状态变量,清除先前数据,准备接收新的输入数据。
- Update: 该阶段用于向 SHA 引擎输入数据,可以分段输入,以便处理大数据集或流式数据而无需占用大量内存。硬件引擎在每次接收数据块时更新内部状态。
- Finish(或 Final):该阶段完成哈希运算,自动进行必要的数据填充,完成内部计算,并输出最终哈希值,即所有输入数据的数字指纹。
Start-Update-Finish 的优势
该结构支持大文件、流数据或网络数据包的分段处理,有助于高效利用硬件加速器按数据块运算,降低内存占用,并支持实时与增量哈希处理工作流,非常适合安全通信和数据完整性验证场景。 W55MH32 的硬件 SHA 引擎在 Finish 阶段会自动处理数据填充与对齐,简化开发并提升运算效率。
SHA 在 SSL/TLS 协议中的作用
在 SSL/TLS 协议中,SHA 主要用于以下方面:
- 消息完整性: 通过生成和验证消息摘要,确保消息在传输过程中未被篡改。
- 证书验证: 结合数字签名使用哈希函数验证数字证书。
- 密钥派生: 在伪随机函数(PRF)中协助从共享密钥生成会话密钥。
通过将这些运算任务交由 W55MH32 硬件 SHA 引擎处理,可以显著提升处理速度、降低 CPU 负载,从而提升整体性能与能效。
SHA 在 W55MH32 系统中的其他应用
除了 SSL/TLS,SHA 在 W55MH32 上还可应用于多种场景,包括:
- 安全固件升级: 在固件安装前验证固件镜像的完整性。
- 密码存储: 对密码进行哈希处理,以实现安全存储与身份验证。
- 数字签名: 生成和验证用于安全通信的数字签名。
- 数据完整性检查: 确保存储或传输数据的一致性和完整性。
使用步骤
步骤 1:头文件
在使用 SHA 功能时,需要包含 WIZnet 加密库的 wiz_sha.h 头文件。
#include "wiz_sha.h"
步骤 2:SHA 流程
SHA 包含三种主要函数用于消息哈希处理。
Start 函数用于启动 SHA 功能。
WIZSHA1_Starts(&ctx);
WIZSHA256_Starts(&ctx2);
Update 函数用于持续输入更多数据供 SHA 处理。
// SHA1 更新函数,从 TestSHA 获取数据,数据大小为 100 字节
WIZSHA1_Update(&ctx, TestSHA, 100);
// SHA256更新函数,从buf0中获取数据,数据大小为64字节
WIZSHA256_Update(&ctx2, buf0, 0x40);
Finish 函数完成全部数据处理并生成哈希结果。
// SHA1 完成函数并将其保存在digest变量中
WIZSHA1_Finish(&ctx, digest);
// SHA256 完成函数并将其保存在digest变量中
WIZSHA256_Finish(&ctx2, digest);
步骤 3:主代码
主代码包含 SHA-1 和 SHA-256 的测试方法示例。
void SHA_Update_Test()
{
uint16_t i;
WIZSHA1_Context ctx;
WIZSHA256_Context ctx2;
uint8_t buf0[0x40];
uint8_t buf1[0x40];
uint8_t t0[2] = "12";
unsigned char TestSHA[100] = "01234567890123456789012345678901234567890123456789012345678901234567890123456789";
uint8_t digest[32] = {0};
printf("Test the sha function...\r\n");
printf("SHA 160 Test data is %s\r\n", TestSHA);
WIZSHA1_Starts(&ctx);
WIZSHA1_Update(&ctx, TestSHA, 100);
WIZSHA1_Finish(&ctx, digest);
printf("The sha_160 result is \r\n");
for (i = 0; i < 20; i++)
{
printf("%02x", digest[i]);
}
printf(" \r\n");
memset(digest, 0, 32);
memset(buf0, 'a', 0x40);
memset(buf1, 'b', 0x40);
memset(digest, 0, 32);
WIZSHA256_Starts(&ctx2);
printf("SHA 256 First set of test data is \r\n");
for (i = 0; i < 64; i++)
{
printf("%c", buf0[i]);
}
printf("\r\n");
WIZSHA256_Update(&ctx2, buf0, 0x40);
printf("SHA 256 Second set of test data is \r\n");
for (i = 0; i < 64; i++)
{
printf("%c", buf1[i]);
}
printf("\r\n");
WIZSHA256_Update(&ctx2, buf1, 0x40);
WIZSHA256_Update(&ctx2, buf1, 0);
WIZSHA256_Finish(&ctx2, digest);
printf("The sha_256 result is \r\n");
for (i = 0; i < 32; i++)
{
printf("%02x", digest[i]);
}
printf(" \r\n");
}
步骤 4:测试结果
当程序下载到 W55MH32 的 EVB 后,可在串口终端查看结果:

SHA-1 : 29b0e7878271645fffb7eec7db4a7473a1c00bc1
SHA256: fa0dafbf43f1f551e536353e9d1a942a8e86e41a0b58dfeaf264ef217f6b862a
SHA1 和 SHA256 的 Python 结果
通过与网上的对比,发现SHA的硬件功能运行正常。


与Python 比对结果一致,表明硬件 SHA 功能正常。
结论
WIZnet W55MH32 微控制器所支持的硬件 SHA-1 和 SHA-256 功能,为嵌入式系统提供了增强安全性的有力工具。将 SHA 功能集成到应用中,开发者能够实现数据完整性验证、通信认证、防止非法篡改,并同时享受硬件加速带来的性能优势。 有关详细实现示例和更多信息,请参考 WIZnet 官方文档及示例工程。