全部例程

硬件加密中实现 SHA (SHA-1 / SHA-256)

W55MH32 其他标签

2025/02/12 更新

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 官方文档及示例工程。

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板