4. AES-128加密与解密
任务目标
在RH850 U2A HSM环境中,通过HSM固件提供的AES硬件加速接口,实现AES-128 ECB模式的单块(16字节)数据加密与解密,并验证加解密结果的正确性。
前置条件
本案例基于HSM固件开发环境,需要已正确配置HSM时钟与安全启动流程。AES硬件加速由HSM固件内部驱动,应用层通过HSM标准API调用,无需直接操作寄存器。依赖的头文件为HSM固件包提供的hsm_api.h。
核心实现
以下代码实现AES-128 ECB模式单块加解密。使用固定测试密钥与明文,通过HSM API完成硬件加速操作,并对比加解密结果验证正确性。
#include "hsm_api.h"
#include <string.h>
#include <stdio.h>
/* 测试密钥:16字节 = 128位 */
static const uint8_t test_key[16] = {
0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
};
/* 测试明文:16字节 = 1个AES块 */
static const uint8_t test_plaintext[16] = {
0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,
0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A
};
/* 已知正确密文(用于验证) */
static const uint8_t expected_ciphertext[16] = {
0x3A, 0xD7, 0x7B, 0xB4, 0x0D, 0x7A, 0x36, 0x60,
0xA8, 0x9E, 0xCA, 0xF3, 0x24, 0x66, 0xEF, 0x97
};
int aes128_ecb_demo(void)
{
hsm_err_t err;
hsm_context_t ctx;
hsm_key_t key;
uint8_t ciphertext[16] = {0};
uint8_t decrypted[16] = {0};
/* 初始化HSM上下文 */
err = hsm_ctx_init(&ctx);
if (err != HSM_OK) {
printf("HSM context init failed: %d\n", err);
return -1;
}
/* 加载密钥到HSM */
key.key_type = HSM_KEY_TYPE_AES_128;
key.key_addr = (uint32_t)test_key;
key.key_size = sizeof(test_key);
err = hsm_key_load(&ctx, &key);
if (err != HSM_OK) {
printf("Key load failed: %d\n", err);
hsm_ctx_deinit(&ctx);
return -1;
}
/* 加密:ECB模式,单块 */
err = hsm_aes_ecb_encrypt(&ctx, &key,
test_plaintext, sizeof(test_plaintext),
ciphertext, sizeof(ciphertext));
if (err != HSM_OK) {
printf("AES encrypt failed: %d\n", err);
hsm_key_delete(&ctx, &key);
hsm_ctx_deinit(&ctx);
return -1;
}
/* 验证密文与预期一致 */
if (memcmp(ciphertext, expected_ciphertext, 16) != 0) {
printf("Ciphertext mismatch!\n");
hsm_key_delete(&ctx, &key);
hsm_ctx_deinit(&ctx);
return -1;
}
printf("Encrypt OK\n");
/* 解密:使用相同密钥 */
err = hsm_aes_ecb_decrypt(&ctx, &key,
ciphertext, sizeof(ciphertext),
decrypted, sizeof(decrypted));
if (err != HSM_OK) {
printf("AES decrypt failed: %d\n", err);
hsm_key_delete(&ctx, &key);
hsm_ctx_deinit(&ctx);
return -1;
}
/* 验证解密结果与原始明文一致 */
if (memcmp(decrypted, test_plaintext, 16) != 0) {
printf("Decrypted data mismatch!\n");
hsm_key_delete(&ctx, &key);
hsm_ctx_deinit(&ctx);
return -1;
}
printf("Decrypt OK\n");
/* 清理 */
hsm_key_delete(&ctx, &key);
hsm_ctx_deinit(&ctx);
return 0;
}
编译与运行
- 将上述代码保存为
aes128_ecb_demo.c,并链接HSM固件库(如libhsm.a)。 - 编译命令示例(具体路径按实际环境调整):
cc -I/path/to/hsm/include aes128_ecb_demo.c -L/path/to/hsm/lib -lhsm -o aes128_demo
- 在目标板或模拟器上运行:
./aes128_demo
验证方法
程序运行后,串口输出以下内容即表示加解密链路正确:
Encrypt OK
Decrypt OK
若输出Ciphertext mismatch!或Decrypted data mismatch!,说明HSM硬件加速结果与预期不符,需检查密钥加载流程或HSM固件配置。
常见问题
- HSM上下文初始化失败:确认HSM固件已正确启动,且
hsm_ctx_init在安全域内被调用。 - 密钥加载失败:检查密钥地址是否在HSM可访问的内存范围内,部分HSM要求密钥位于特定安全RAM区域。
- API名称差异:不同HSM固件版本的API命名可能略有不同,请以实际固件头文件为准。