打印
[应用方案]

新唐Nuvoton MCU的硬件加密功能应用

[复制链接]
222|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原来是wjc|  楼主 | 2025-3-27 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件加密模块概述
新唐MCU的安全功能包括:

AES(高级加密标准):支持128/192/256位密钥长度,适用于数据加密传输。

RSA(非对称加密):用于身份验证和密钥交换。

SHA(安全哈希算法):数据完整性校验,如SHA-1、SHA-256。

HMAC(哈希消息认证码):用于数据认证。

TRNG(真随机数发生器):用于生成加密密钥,提高安全性。

这些加密功能可加速计算,提高安全性,并减少CPU的计算负担。

2. AES加密与解密
AES是一种对称加密算法,适用于加密存储数据或网络传输数据。

2.1 初始化AES硬件
在新唐MCU中,AES硬件模块需要初始化并设置密钥模式。

c
复制
编辑
void AES_Init(void) {
    CLK->AHBCLK |= CLK_AHBCLK_CRPTCKEN_Msk; // 使能加密模块时钟
}
2.2 AES 128位加密
c
复制
编辑
void AES_Encrypt(uint8_t *input, uint8_t *key, uint8_t *output) {
    AES_Init();

    CRPT->AES_CTL = (AES_MODE_ECB << CRPT_AES_CTL_OPMODE_Pos) | // 设置ECB模式
                    (AES_KEY_SIZE_128 << CRPT_AES_CTL_KEYSZ_Pos) |
                    CRPT_AES_CTL_ENCRPT_Msk; // 启用加密

    memcpy((uint8_t *)CRPT->AES_KEY, key, 16);  // 设置密钥
    memcpy((uint8_t *)CRPT->AES_IV, input, 16); // 设置输入数据

    CRPT->AES_CTL |= CRPT_AES_CTL_START_Msk; // 启动加密
    while (CRPT->AES_STS & CRPT_AES_STS_BUSY_Msk); // 等待完成

    memcpy(output, (uint8_t *)CRPT->AES_IV, 16); // 读取加密结果
}
2.3 AES 128位解密
c
复制
编辑
void AES_Decrypt(uint8_t *input, uint8_t *key, uint8_t *output) {
    AES_Init();

    CRPT->AES_CTL = (AES_MODE_ECB << CRPT_AES_CTL_OPMODE_Pos) |
                    (AES_KEY_SIZE_128 << CRPT_AES_CTL_KEYSZ_Pos); // 启用解密

    memcpy((uint8_t *)CRPT->AES_KEY, key, 16);
    memcpy((uint8_t *)CRPT->AES_IV, input, 16);

    CRPT->AES_CTL |= CRPT_AES_CTL_START_Msk;
    while (CRPT->AES_STS & CRPT_AES_STS_BUSY_Msk);

    memcpy(output, (uint8_t *)CRPT->AES_IV, 16);
}
3. RSA加密与解密
RSA是一种非对称加密算法,适用于身份认证和密钥交换。

3.1 生成RSA密钥对
c
复制
编辑
void RSA_GenerateKey(void) {
    CRPT->RSA_MODE = CRPT_RSA_MODE_KEYGEN;  // 选择密钥生成模式
    CRPT->RSA_CTL |= CRPT_RSA_CTL_START_Msk;
    while (CRPT->RSA_STS & CRPT_RSA_STS_BUSY_Msk); // 等待完成
}
3.2 RSA加密
c
复制
编辑
void RSA_Encrypt(uint8_t *input, uint8_t *public_key, uint8_t *output) {
    CRPT->RSA_MODE = CRPT_RSA_MODE_ENCRYPT;
    memcpy((uint8_t *)CRPT->RSA_E, public_key, 256);
    memcpy((uint8_t *)CRPT->RSA_N, input, 256);

    CRPT->RSA_CTL |= CRPT_RSA_CTL_START_Msk;
    while (CRPT->RSA_STS & CRPT_RSA_STS_BUSY_Msk);

    memcpy(output, (uint8_t *)CRPT->RSA_N, 256);
}
3.3 RSA解密
c
复制
编辑
void RSA_Decrypt(uint8_t *input, uint8_t *private_key, uint8_t *output) {
    CRPT->RSA_MODE = CRPT_RSA_MODE_DECRYPT;
    memcpy((uint8_t *)CRPT->RSA_D, private_key, 256);
    memcpy((uint8_t *)CRPT->RSA_N, input, 256);

    CRPT->RSA_CTL |= CRPT_RSA_CTL_START_Msk;
    while (CRPT->RSA_STS & CRPT_RSA_STS_BUSY_Msk);

    memcpy(output, (uint8_t *)CRPT->RSA_N, 256);
}
4. SHA哈希算法
SHA用于数据完整性校验,常见算法有SHA-1和SHA-256。

4.1 SHA-256计算
c
复制
编辑
void SHA256_Calculate(uint8_t *input, uint32_t length, uint8_t *output) {
    CRPT->HMAC_CTL = CRPT_HMAC_CTL_START_Msk | (SHA_MODE_SHA256 << CRPT_HMAC_CTL_OPMODE_Pos);
    CRPT->HMAC_DMACNT = length;
    memcpy((uint8_t *)CRPT->HMAC_DATIN, input, length);

    while (CRPT->HMAC_STS & CRPT_HMAC_STS_BUSY_Msk);
    memcpy(output, (uint8_t *)CRPT->HMAC_DGST, 32);
}
5. TRNG随机数生成
c
复制
编辑
uint32_t Generate_Random_Number(void) {
    CLK->AHBCLK |= CLK_AHBCLK_TRNGCKEN_Msk; // 使能随机数发生器时钟
    TRNG->CTL |= TRNG_CTL_START_Msk;
    while (TRNG->CTL & TRNG_CTL_BUSY_Msk);
    return TRNG->DATA;
}

使用特权

评论回复
沙发
heisexingqisi| | 2025-3-28 15:02 | 只看该作者
硬件加密的是什么呢,是传输的数据还是固件本身

使用特权

评论回复
板凳
weifeng90| | 2025-3-28 20:33 | 只看该作者
可以用于数据加解密和通信加解密应用

使用特权

评论回复
地板
zhouyong77| | 2025-3-30 11:34 | 只看该作者
真随机数发生器能够通过商密认证检测吗?这个很不容易通过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

1148

帖子

0

粉丝