嵌入式加密 embedded-crypto

嵌入式加密操作技能是专门用于在嵌入式系统中实现安全加密功能的专家技能。它涵盖硬件加密加速器集成、安全密钥存储配置、ARM TrustZone安全区域设置、真随机数生成、X.509证书管理以及侧信道攻击防护等关键技术。该技能适用于物联网设备、智能硬件、工业控制系统等需要高安全性的嵌入式应用场景,帮助开发者构建符合PSA认证等安全标准的嵌入式系统。

嵌入式软件 0 次安装 0 次浏览 更新于 2/25/2026

名称: 嵌入式加密 描述: 嵌入式加密操作与安全元件集成。硬件加密加速器、安全密钥存储、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输出质量
  • 测试时序漏洞
  • 验证证书处理
  • 审计加密配置

参考资料

另请参阅

  • secure-boot-implementation.js - 安全启动流程
  • ota-firmware-update.js - 安全更新
  • SK-015:OTA更新技能
  • AG-005:嵌入式安全专家代理