1. 密码学基础回顾:对称加密与非对称加密概念、哈希函数作用、数字签名原理
在深入调试加密库之前,必须牢固掌握密码学的三大基石:对称加密、非对称加密与哈希函数。这三者构成了安全通信的底层逻辑,也是后续调试中定位加解密失败、签名验证错误、密钥协商异常的根本依据。
1.1 对称加密
对称加密使用同一把密钥完成加密与解密。发送方用密钥加密明文,接收方用同一密钥解密密文。其核心优势在于计算速度快,适合大批量数据加密;但密钥分发与管理是主要安全挑战。
| 特性 | 说明 |
|---|---|
| 密钥关系 | 加密密钥 == 解密密钥 |
| 典型算法 | AES(推荐)、ChaCha20、SM4(国密) |
| 工作模式 | ECB(不推荐)、CBC、GCM(推荐,带认证)、CTR |
| 密钥长度 | AES-128 / AES-256 |
| 主要风险 | 密钥泄露、IV 重用、填充预言攻击 |
调试提示: 对称加密调试中最常见的错误是 IV 不匹配 或 密钥长度错误。使用 AES-GCM 模式时,务必确认 nonce(IV)长度为 12 字节,且解密端与加密端完全一致。
1.2 非对称加密
非对称加密使用密钥对:公钥公开,私钥保密。公钥加密的数据只能用对应的私钥解密;私钥签名的数据只能用对应的公钥验证。它解决了对称加密的密钥分发难题,但计算速度慢,通常只用于加密会话密钥或数字签名。
| 特性 | 说明 |
|---|---|
| 密钥关系 | 公钥加密,私钥解密;私钥签名,公钥验签 |
| 典型算法 | RSA(2048位以上)、ECC(推荐)、SM2(国密) |
| 典型用途 | 密钥交换(ECDH)、数字签名(ECDSA)、证书(X.509) |
| 性能 | 比对称加密慢 100~1000 倍 |
| 主要风险 | 私钥泄露、随机数质量差、填充方案错误(如 RSA-OAEP vs PKCS#1 v1.5) |
常见调试陷阱: RSA 加密时必须指定填充模式。Python 的
cryptography 库默认使用 PKCS#1 v1.5 填充,但安全标准已推荐使用 OAEP。若两端填充模式不一致,解密会抛出 ValueError 或返回乱码。
1.3 哈希函数
哈希函数将任意长度的输入数据映射为固定长度的摘要值。它是单向的:从摘要无法反推出原始数据。哈希函数在密码学中用于数据完整性校验、密码存储和数字签名的中间步骤。
- 抗碰撞性:难以找到两个不同输入产生相同哈希值。
- 抗原像性:给定哈希值,难以找到对应的原始输入。
- 典型算法:SHA-256(推荐)、SHA-3、SM3(国密)。
- 输出长度:SHA-256 输出 32 字节(256 位)。
调试要点: 哈希函数本身不加密数据。调试时若发现哈希值不匹配,优先检查输入数据的编码(UTF-8 vs ASCII)和是否包含尾部换行符。Python 中
hashlib.sha256(b"hello") 与 hashlib.sha256("hello".encode()) 结果相同,但 hashlib.sha256("hello") 会报错。
1.4 数字签名原理
数字签名结合了哈希函数与非对称加密,提供身份认证、数据完整性和不可否认性。签名过程:发送方对消息哈希,然后用自己的私钥加密哈希值,生成签名。验证过程:接收方用发送方的公钥解密签名,得到哈希值,再与本地计算的消息哈希比对。
- 签名算法:ECDSA(推荐)、RSA-PSS、SM2(国密)。
- 关键步骤:Hash → Sign → Verify。
- 调试常见错误:哈希算法不一致、公钥格式错误(PEM vs DER)、签名编码问题(DER vs IEEE P1363)。
调试案例: 使用 Python
cryptography 库进行 ECDSA 签名时,若签名结果与预期不符,检查是否使用了 Prehashed 模式。标准流程应传入原始消息,库内部自动哈希;若手动哈希后传入 Prehashed,两端必须使用完全相同的哈希算法。
1.5 三种机制对比总结
| 机制 | 密钥 | 速度 | 主要用途 | 调试关注点 |
|---|---|---|---|---|
| 对称加密 | 单密钥 | 快 | 数据加密 | IV、密钥长度、填充模式 |
| 非对称加密 | 密钥对 | 慢 | 密钥交换、签名 | 私钥保护、填充方案、公钥格式 |
| 哈希函数 | 无密钥 | 极快 | 完整性校验 | 输入编码、算法一致性 |
| 数字签名 | 私钥签名,公钥验签 | 中等 | 认证、不可否认性 | 哈希算法匹配、签名编码格式 |
调试核心原则: 无论使用哪种机制,调试时始终遵循 “输入-操作-输出” 三段式检查。先确认输入数据(明文、密钥、IV)的字节表示完全一致,再检查操作参数(算法、模式、填充),最后验证输出(密文、签名、哈希值)的编码格式。Python 中多用
bytes.hex() 打印对比,避免不可见字符干扰。