硬件加密模块概述
新唐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;
}
|