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

W55MH32 应用笔记:在 W55MH32 硬件加密中实现 SHA(SHA-1 / SHA-256)

目录

W55MH32 应用笔记:在 W55MH32 硬件加密中实现 SHA(SHA-1 / SHA-256)

1. 简介

2. SHA 概述

什么是 SHA?

SHA 在微控制器中的处理流程

Start-Update-Finish 的优势

3. SHA 在 SSL/TLS 协议中的作用

4. SHA 在 W55MH32 系统中的其他应用

5. 使用步骤

步骤 1:头文件

步骤 2:SHA 流程

步骤 3:主代码

步骤 4:测试结果

SHA1 和 SHA256 的 Python 结果

6 结论

1. 简介

WIZnet W55MH32 是一款高性能微控制器,内置 ARM Cortex-M3 内核,最高运行频率可达 216 MHz。它集成了硬件加密引擎,支持多种加密算法,包括 SHA-1 和 SHA-256。利用 W55MH32 的硬件 SHA 功能,能够提升嵌入式应用的数据完整性和安全性,特别适用于涉及网络通信的应用场景。

本应用笔记将介绍 SHA 的基本功能、其在 SSL/TLS 协议中的角色,以及 SHA 在 W55MH32 上的实际应用。


2. 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 阶段会自动处理数据填充与对齐,简化开发并提升运算效率。

3. SHA 在 SSL/TLS 协议中的作用

在 SSL/TLS 协议中,SHA 主要用于:

  • 消息完整性:生成和验证消息摘要,防止篡改;
  • 证书验证:结合数字签名验证证书合法性;
  • 密钥派生:在伪随机函数(PRF)中协助生成会话密钥。

通过将这些运算任务交由 W55MH32 硬件 SHA 引擎处理,可以显著提升处理速度、降低 CPU 负载,从而提升整体性能与能效。

4. SHA 在 W55MH32 系统中的其他应用

  • 安全固件升级:验证固件镜像完整性;
  • 密码存储:对密码进行哈希处理,安全存储;
  • 数字签名:生成和验证签名;
  • 数据完整性检查:确保数据一致性与完整性。

5. 使用步骤

步骤 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()
{
    uint32_t i;
    WIESHA1_Context ctx;
    WIESHA1_Context ctx2;
    uint8_t digest[20];
    uint8_t buf[64];
    unsigned char TestSHA1[100] = "12345678901234567890123456789012345678901234567890123456789012345678901234567890";
    printf("Test the sha function...\n");
    printf("SHA 160 test data is \n%s\n", TestSHA1);
    WIESHA1_Update(&ctx, TestSHA1, 100);
    WIESHA1_Finish(&ctx, digest);
    printf("SHA 160 result is \n");
    for (i = 0; i < 20; i++)
    {
        printf("%02x", digest[i]);
    }
    printf("\n\n");
    memset(digest, 0, 20);
    memset(buf, 'a', 64);
    memset(buf, 'b', 0x30);
    printf("SHA 256 first set of test data is \n");
    for (i = 0; i < 64; i++)
    {
        printf("%02x", buf[i]);
    }
    WIESHA256_Update(&ctx2, buf, 0x30);
    printf("\nSHA 256 second set of test data is \n");
    for (i = 0; i < 64; i++)
    {
        printf("%02x", buf[i]);
    }
    printf("\n\n");
    WIESHA256_Update(&ctx2, buf, 0x30);
    WIESHA256_Finish(&ctx2, digest);
    printf("The sha_256 result is \n");
    for (i = 0; i < 32; i++)
    {
        printf("%02x", digest[i]);
    }
    printf("\n\n");
}

步骤 4:测试结果

当程序下载到 W55MH32 的 EVB 后,可在串口终端查看结果:

SHA-1 : 29b0e7878271645fffb7eec7db4a7473a1c00bc1  
SHA256: fa0dafbf43f1f551e536353e9d1a942a8e86e41a0b58dfeaf264ef217f6b862a

SHA1 和 SHA256 的 Python 结果

通过与网上的对比,发现SHA的硬件功能运行正常。

6 结论

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值