名称: 嵌入式加密 描述: 嵌入式加密操作与安全元件集成。硬件加密加速器、安全密钥存储、TrustZone配置和侧信道攻击防护的专家技能。 允许工具: Read, Grep, Write, Edit, Bash, Glob, WebFetch, WebSearch
嵌入式加密操作技能
嵌入式系统中加密操作的专家技能。提供硬件加密加速器、安全密钥存储、TrustZone配置和安全最佳实践的专长。
概述
嵌入式加密技能支持在嵌入式系统中实现安全的加密功能:
- 硬件加密加速器使用
- AES/SHA/ECC实现
- 安全密钥存储配置
- TrustZone配置(Cortex-M33/M55)
- 安全启动链实现
- 证书管理
- 随机数生成(TRNG)
- 侧信道攻击防护
能力
1. 硬件加密加速器集成
利用硬件加速进行加密操作:
/**
* @brief 初始化硬件加密加速器
*
* 启用时钟并配置加密外设以加速
* AES、SHA和随机数生成。
*
* @return 成功时返回CRYPTO_OK
*/
crypto_status_t crypto_hw_init(void)
{
// 启用外设时钟
RCC->AHB2ENR |= RCC_AHB2ENR_CRYPTEN;
// 启用AES、SHA和RNG模块
CRYP->CR = CRYP_CR_ALGODIR | CRYP_CR_ALGOMODE_AES_CBC;
// 配置为中断或DMA模式
CRYP->CR |= CRYP_CR_CRYPEN;
return CRYPTO_OK;
}
/**
* @brief 硬件加速的AES-128 CBC加密
*
* @param[in] key 128位加密密钥
* @param[in] iv 128位初始化向量
* @param[in] plaintext 要加密的数据
* @param[out] ciphertext 加密输出
* @param[in] length 数据长度(必须是16的倍数)
*
* @return 成功时返回CRYPTO_OK
*/
crypto_status_t crypto_aes128_cbc_encrypt(
const uint8_t key[16],
const uint8_t iv[16],
const uint8_t *plaintext,
uint8_t *ciphertext,
size_t length
);
2. 安全密钥存储
配置安全密钥存储机制:
/**
* @brief 密钥存储位置和保护级别
*/
typedef enum {
KEY_STORAGE_RAM, // 易失性,复位时清除
KEY_STORAGE_OTP, // 一次性可编程熔丝
KEY_STORAGE_SECURE_FLASH, // 带RDP的加密闪存
KEY_STORAGE_TRUSTZONE, // TrustZone安全区域
KEY_STORAGE_HSM, // 外部安全元件
} key_storage_t;
/**
* @brief 安全存储的密钥属性
*/
typedef struct {
uint32_t id; // 密钥标识符
key_storage_t location; // 存储位置
uint32_t algorithm; // 密钥算法(AES、ECC等)
uint16_t bits; // 密钥大小(位)
uint32_t usage; // 允许的操作(加密、签名等)
uint32_t lifetime; // 持久性或易失性
uint8_t exportable; // 密钥是否可导出
} key_attributes_t;
/**
* @brief 将密钥导入安全存储
*
* @param[in] attributes 密钥属性
* @param[in] data 密钥材料
* @param[in] length 密钥长度
* @param[out] key_id 分配的密钥ID
*
* @return 成功时返回CRYPTO_OK
*/
crypto_status_t secure_key_import(
const key_attributes_t *attributes,
const uint8_t *data,
size_t length,
uint32_t *key_id
);
3. TrustZone配置(ARMv8-M)
配置TrustZone以实现安全/非安全分离:
/**
* @brief TrustZone内存区域配置
*
* 带TrustZone的内存映射:
*
* 地址范围 | 安全性 | 用途
* --------------------|----------|------------------
* 0x00000000-0x0001FFFF | 安全 | 安全引导加载程序
* 0x00020000-0x0007FFFF | 非安全 | 非安全应用程序
* 0x10000000-0x1000FFFF | 安全 | 安全代码/数据
* 0x20000000-0x20007FFF | 安全 | 安全RAM
* 0x20008000-0x2001FFFF | 非安全 | 非安全RAM
* 0x40000000-0x4FFFFFFF | 非安全调用 | 外设(SAU)
*/
/**
* @brief 为TrustZone配置SAU区域
*/
void sau_configure(void)
{
// 区域0:非安全闪存(应用程序)
SAU->RNR = 0;
SAU->RBAR = 0x00020000U; // 基地址
SAU->RLAR = 0x0007FFFFU | SAU_RLAR_ENABLE_Msk; // 非安全
// 区域1:非安全RAM
SAU->RNR = 1;
SAU->RBAR = 0x20008000U;
SAU->RLAR = 0x2001FFFFU | SAU_RLAR_ENABLE_Msk;
// 区域2:非安全可调用(NSC)用于安全API
SAU->RNR = 2;
SAU->RBAR = 0x0001F000U;
SAU->RLAR = 0x0001FFFFU | SAU_RLAR_NSC_Msk | SAU_RLAR_ENABLE_Msk;
// 启用SAU
SAU->CTRL = SAU_CTRL_ENABLE_Msk;
}
/**
* @brief 暴露给非安全世界的安全函数
*
* @note 函数必须在NSC区域中
*/
__attribute__((cmse_nonsecure_entry))
int32_t secure_encrypt(uint8_t *data, size_t length)
{
// 验证非安全指针
if (cmse_check_address_range(data, length, CMSE_AU_NONSECURE) == NULL) {
return CRYPTO_ERR_INVALID_PARAM;
}
// 在安全世界执行加密
return crypto_aes128_encrypt_internal(data, length);
}
4. 真随机数生成
实现安全的随机数生成:
/**
* @brief 初始化硬件TRNG
*
* 配置真随机数生成器,包括
* 健康测试和调理。
*
* @return 成功时返回CRYPTO_OK,健康测试失败时返回错误
*/
crypto_status_t trng_init(void)
{
// 启用RNG时钟
RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN;
// 配置健康测试
RNG->CR |= RNG_CR_CED; // 时钟错误检测
RNG->CR |= RNG_CR_RNG_CONFIG3; // 调理
// 启用RNG
RNG->CR |= RNG_CR_RNGEN;
// 等待第一个随机数并验证
if (!trng_health_test()) {
return CRYPTO_ERR_HEALTH_TEST;
}
return CRYPTO_OK;
}
/**
* @brief 生成密码学安全的随机字节
*
* @param[out] output 用随机数据填充的缓冲区
* @param[in] length 要生成的随机字节数
*
* @return 成功时返回CRYPTO_OK
*
* @note 阻塞直到有足够的熵可用
*/
crypto_status_t trng_generate(uint8_t *output, size_t length);
5. 证书管理
处理设备身份的X.509证书:
/**
* @brief 设备证书链
*
* 链结构:
* 1. 设备证书(叶子)
* 2. 中间CA证书
* 3. 根CA证书(可选,通常由对等方信任)
*/
typedef struct {
uint8_t *device_cert;
size_t device_cert_len;
uint8_t *intermediate_cert;
size_t intermediate_cert_len;
uint8_t *root_cert;
size_t root_cert_len;
} cert_chain_t;
/**
* @brief 验证证书链的有效性
*
* @param[in] chain 要验证的证书链
* @param[in] trusted 受信任的根证书
*
* @return 有效时返回CRYPTO_OK,否则返回错误代码
*/
crypto_status_t cert_verify_chain(
const cert_chain_t *chain,
const cert_store_t *trusted
);
/**
* @brief 从证书中提取公钥
*
* @param[in] cert DER编码的证书
* @param[in] cert_len 证书长度
* @param[out] pubkey 提取的公钥
*
* @return 成功时返回CRYPTO_OK
*/
crypto_status_t cert_get_public_key(
const uint8_t *cert,
size_t cert_len,
public_key_t *pubkey
);
6. 侧信道攻击防护
实施针对侧信道攻击的对策:
/**
* @brief 抗侧信道比较
*
* 以恒定时间比较两个缓冲区,以防止
* 时序攻击。
*
* @param[in] a 第一个缓冲区
* @param[in] b 第二个缓冲区
* @param[in] length 要比较的字节数
*
* @return 相等时返回0,否则返回非零值
*/
int crypto_compare_constant_time(
const uint8_t *a,
const uint8_t *b,
size_t length
)
{
uint8_t result = 0;
for (size_t i = 0; i < length; i++) {
result |= a[i] ^ b[i];
}
return result;
}
/**
* @brief 带掩码对策的AES
*
* 对中间值应用随机掩码
* 以保护免受DPA攻击。
*/
typedef struct {
uint8_t key_masked[16];
uint8_t mask[16];
uint8_t state_mask[16];
} aes_masked_ctx_t;
/**
* @brief 使用随机掩码初始化AES
*/
crypto_status_t aes_masked_init(
aes_masked_ctx_t *ctx,
const uint8_t key[16]
)
{
// 生成随机掩码
trng_generate(ctx->mask, 16);
// 用掩码异或密钥
for (int i = 0; i < 16; i++) {
ctx->key_masked[i] = key[i] ^ ctx->mask[i];
}
return CRYPTO_OK;
}
流程集成
此技能与以下流程集成:
| 流程 | 集成点 |
|---|---|
secure-boot-implementation.js |
加密验证和签名 |
functional-safety-certification.js |
安全认证方面 |
ota-firmware-update.js |
更新加密和签名 |
工作流程
1. 安全需求分析
## 安全需求清单
- [ ] 识别要保护的资产(密钥、数据、代码)
- [ ] 确定威胁模型(本地、网络、物理)
- [ ] 选择合适的算法(AES-128/256、ECC P-256)
- [ ] 定义密钥管理策略
- [ ] 规划侧信道防护
- [ ] 识别认证要求(PSA、SESIP、CC)
2. 硬件能力评估
# 检查加密加速器
grep -i "crypto\|aes\|sha\|rng" device_datasheet.pdf
# 验证TrustZone支持(Cortex-M33/M55)
arm-none-eabi-gcc -mcpu=cortex-m33 -print-multi-lib | grep cmse
3. 实施
// 初始化加密子系统
crypto_hw_init();
trng_init();
// 导入设备密钥
key_attributes_t attr = {
.algorithm = KEY_ALG_AES,
.bits = 128,
.usage = KEY_USAGE_ENCRYPT | KEY_USAGE_DECRYPT,
.location = KEY_STORAGE_TRUSTZONE
};
secure_key_import(&attr, device_key, 16, &key_id);
// 配置TrustZone(如果可用)
sau_configure();
4. 安全测试
# 运行静态分析以检查加密问题
cppcheck --enable=security src/crypto/
# 检查时序漏洞
python tools/timing_analysis.py build/firmware.elf
# 验证随机数质量
python tools/rng_test_suite.py
输出模式
{
"cryptoCapabilities": {
"hardware": {
"aes": true,
"sha": true,
"ecc": false,
"trng": true
},
"trustzone": true,
"secureElement": false
},
"keyManagement": {
"storageLocations": ["otp", "trustzone"],
"algorithms": ["aes-128-gcm", "ecdsa-p256"],
"keyCount": 5
},
"implementation": {
"library": "mbedtls",
"hwAcceleration": true,
"sideChannelProtection": true
},
"compliance": {
"psaLevel": 1,
"certifications": ["PSA Certified Level 1"]
},
"artifacts": [
"src/crypto/crypto_hal.c",
"src/crypto/trustzone_config.c",
"src/crypto/key_storage.c",
"docs/security-architecture.md"
]
}
安全最佳实践
密钥管理
- 切勿将密钥以明文形式存储在闪存中
- 对根密钥使用OTP熔丝
- 为会话密钥实施密钥派生
- 使用后清零密钥
算法选择
- 使用AES-GCM进行认证加密
- 使用ECDSA P-256进行签名
- 使用SHA-256作为最小哈希算法
- 避免使用已弃用的算法(DES、MD5、SHA-1)
实施
- 使用经过审查的加密库(mbedTLS、wolfSSL)
- 启用硬件加速(如果可用)
- 实施恒定时间操作
- 从内存中清除敏感数据
测试
- 验证TRNG输出质量
- 测试时序漏洞
- 验证证书处理
- 审计加密配置
参考资料
- ARM TrustZone for ARMv8-M
- mbedTLS文档:https://tls.mbed.org/
- wolfSSL手册:https://www.wolfssl.com/docs/
- PSA认证:https://www.psacertified.org/
- NIST加密标准
另请参阅
secure-boot-implementation.js- 安全启动流程ota-firmware-update.js- 安全更新- SK-015:OTA更新技能
- AG-005:嵌入式安全专家代理