2. 密码学基础回顾

在 PSA Crypto 密码服务集成工程中,所有安全能力最终都落在几类基础密码原语上。理解它们的原理、边界与组合方式,是后续调用 PSA API、配置密钥属性、设计安全通道的前提。本章不追求数学推导,而是从工程视角梳理六类核心机制:对称加密、非对称加密、哈希、消息认证码、数字签名与密钥交换,并说明它们在 PSA 架构中的典型映射。

一、核心原理:六类原语的分工

密码学原语可以按“是否使用密钥”“密钥是否相同”“是否可逆”三个维度区分。对称加密使用同一密钥完成加密与解密,速度快、适合大数据量;非对称加密使用公私钥对,解决密钥分发与身份绑定问题,但性能较低;哈希函数无密钥、单向、定长输出,用于完整性校验与指纹生成;消息认证码(MAC)在哈希或分组密码基础上加入共享密钥,同时提供完整性与来源认证;数字签名用私钥签名、公钥验证,提供不可否认性;密钥交换则让双方在不安全信道上协商出共享秘密。

六类密码原语的能力与 PSA 映射 对称加密 AES-CBC / AES-GCM / ChaCha20 同一密钥加解密 · 高速 · 大数据量 PSA: psa_cipher_encrypt / decrypt 密钥属性: PSA_KEY_TYPE_AES 非对称加密 RSA-OAEP / ECIES 公钥加密 · 私钥解密 · 慢 PSA: psa_asymmetric_encrypt / decrypt 密钥属性: PSA_KEY_TYPE_RSA_KEY_PAIR 哈希函数 SHA-256 / SHA-3 / SM3 无密钥 · 单向 · 定长摘要 PSA: psa_hash_compute / setup / update 输出长度: 32 字节 (SHA-256) 消息认证码 MAC HMAC-SHA256 / CMAC-AES 共享密钥 · 完整性 + 来源认证 PSA: psa_mac_compute / verify 密钥属性: PSA_KEY_TYPE_HMAC 数字签名 ECDSA / RSA-PSS / EdDSA 私钥签名 · 公钥验证 · 不可否认 PSA: psa_sign_hash / psa_verify_hash 密钥属性: PSA_KEY_TYPE_ECC_KEY_PAIR 密钥交换 ECDH / FFDH / TLS 1.3 密钥调度 双方协商共享秘密 · 前向安全 PSA: psa_raw_key_agreement 输出: 共享秘密 → KDF 派生会话密钥 典型组合:安全通道建立流程 密钥交换(ECDH)→ KDF 派生会话密钥 → 对称加密(AES-GCM)保护数据 数字签名(ECDSA)验证身份 → 哈希(SHA-256)校验完整性 → MAC 保护消息

二、方法流程:从原语到 PSA 调用

在 PSA Crypto 中,使用任一原语都遵循“导入/生成密钥 → 设置策略 → 执行操作 → 销毁密钥”的生命周期。以 AES-GCM 对称加密为例,典型流程如下:

/* 1. 生成或导入密钥 */
psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
psa_set_key_bits(&attr, 256);
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT | PSA_KEY_USAGE_DECRYPT);
psa_set_key_algorithm(&attr, PSA_ALG_GCM);
psa_key_id_t key_id;
psa_generate_key(&attr, &key_id);

/* 2. 加密:一次性接口 */
uint8_t ciphertext[256];
size_t ciphertext_len;
psa_cipher_encrypt(key_id, PSA_ALG_GCM,
                   plaintext, plaintext_len,
                   ciphertext, sizeof(ciphertext), &ciphertext_len);

/* 3. 解密并验证标签 */
psa_cipher_decrypt(key_id, PSA_ALG_GCM,
                   ciphertext, ciphertext_len,
                   output, sizeof(output), &output_len);

/* 4. 销毁密钥 */
psa_destroy_key(key_id);

哈希与 MAC 的调用模式类似,但哈希不需要密钥,MAC 需要设置 PSA_KEY_TYPE_HMAC 并指定算法 PSA_ALG_HMAC(PSA_ALG_SHA_256)。数字签名则使用 psa_sign_hash 与 psa_verify_hash,密钥类型为 ECC 或 RSA 密钥对。密钥交换使用 psa_raw_key_agreement,输出共享秘密后通常再经过 HKDF 派生会话密钥。

三、案例场景:TLS 1.3 握手如何组合这些原语

以一次嵌入式设备与云端的 TLS 1.3 握手为例:客户端与服务器先通过 ECDH 交换公钥,各自计算出相同的共享秘密;随后用 HKDF 从共享秘密派生出握手密钥与应用流量密钥;握手消息用 ECDSA 签名验证服务器身份,用 SHA-256 计算握手 transcript 哈希;应用数据阶段使用 AES-128-GCM 同时完成加密与完整性保护。整个过程在 PSA Crypto 中体现为多次 psa_key_derivation、psa_sign_hash、psa_cipher_encrypt 调用,密钥 ID 与策略由 PSA 密钥库统一管理。

工程提示:在资源受限设备上,优先选择 ECC(如 P-256)而非 RSA,因为 ECC 密钥更短、签名更快、内存占用更低;对称加密优先选择 AES-GCM 或 ChaCha20-Poly1305,它们同时提供机密性与完整性,避免“加密后再 MAC”的组合错误。

四、误区与复盘

常见误区 问题本质 正确做法
用哈希代替 MAC 做完整性校验 哈希无密钥,攻击者可同时篡改数据与摘要 使用 HMAC 或 CMAC,密钥由 PSA 密钥库保护
用非对称加密直接加密大文件 性能极低,且受明文长度限制 用非对称加密保护对称密钥,再用对称加密保护数据
ECDH 共享秘密直接当会话密钥 共享秘密并非均匀随机,且缺少上下文绑定 经 HKDF 派生,并绑定 transcript 哈希与随机数
签名与加密使用同一密钥对 密钥用途混用,违反最小权限原则 PSA 中通过 usage flags 严格区分 SIGN 与 ENCRYPT
忽略 IV/Nonce 唯一性 GCM 下重复 Nonce 会导致密钥流复用,严重泄露明文 每次加密使用唯一 Nonce,推荐随机 96 位或计数器
复盘要点:PSA Crypto 的密钥属性(类型、位数、用途、算法)是安全边界的一部分。导入密钥时若 usage flags 设置过宽,即使算法正确也会引入风险。建议在集成测试中增加“密钥策略校验”用例,确认签名密钥不能被用于加密、加密密钥不能被用于派生。