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") 会报错。
对称加密 vs 非对称加密 流程对比 对称加密 发送方:明文 + 密钥 加密 → 密文 接收方:密文 + 同一密钥 解密 → 原始明文 非对称加密 发送方:明文 + 接收方公钥 加密 → 密文 接收方:密文 + 自己的私钥 解密 → 原始明文 对称加密:同一密钥加密解密;非对称加密:公钥加密,私钥解密

1.4 数字签名原理

数字签名结合了哈希函数与非对称加密,提供身份认证、数据完整性和不可否认性。签名过程:发送方对消息哈希,然后用自己的私钥加密哈希值,生成签名。验证过程:接收方用发送方的公钥解密签名,得到哈希值,再与本地计算的消息哈希比对。

  • 签名算法:ECDSA(推荐)、RSA-PSS、SM2(国密)。
  • 关键步骤:Hash → Sign → Verify。
  • 调试常见错误:哈希算法不一致、公钥格式错误(PEM vs DER)、签名编码问题(DER vs IEEE P1363)。
调试案例: 使用 Python cryptography 库进行 ECDSA 签名时,若签名结果与预期不符,检查是否使用了 Prehashed 模式。标准流程应传入原始消息,库内部自动哈希;若手动哈希后传入 Prehashed,两端必须使用完全相同的哈希算法。
数字签名流程 发送方 原始消息 哈希函数 (SHA-256) 私钥加密 → 签名 接收方 收到的消息 + 签名 哈希函数 (SHA-256) 公钥解密签名 → 哈希值 哈希值比对 哈希值一致 → 签名有效;不一致 → 签名无效(数据被篡改或身份伪造)

1.5 三种机制对比总结

机制 密钥 速度 主要用途 调试关注点
对称加密 单密钥 快 数据加密 IV、密钥长度、填充模式
非对称加密 密钥对 慢 密钥交换、签名 私钥保护、填充方案、公钥格式
哈希函数 无密钥 极快 完整性校验 输入编码、算法一致性
数字签名 私钥签名,公钥验签 中等 认证、不可否认性 哈希算法匹配、签名编码格式
调试核心原则: 无论使用哪种机制,调试时始终遵循 “输入-操作-输出” 三段式检查。先确认输入数据(明文、密钥、IV)的字节表示完全一致,再检查操作参数(算法、模式、填充),最后验证输出(密文、签名、哈希值)的编码格式。Python 中多用 bytes.hex() 打印对比,避免不可见字符干扰。