密码学基础

最后更新: 2026-09-03 15:56:39 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

密码学将数学原语应用于机密性、完整性、对等方身份验证和不可否认性等安全目标。安全原语本身不会使协议安全,因为编码、密钥管理、随机性、状态和攻击者能力也会决定结果。

位、异或和模运算 #

密码学规范操作精确大小的位字符串和字节字符串。异或是模二加法:

aba XOR b
000
011
101
110

异或具有结合律、交换律和自反性,因此 (message XOR mask) XOR mask = message。这些恒等式解释了流密码如何应用和移除密钥流。它们不代表安全性:重复使用掩码会暴露明文之间的关系。

模运算将整数分组为同余类。记号 a ≡ b (mod n) 表示 n 整除 a - b。加法和乘法仍在这些类中进行。当且仅当 gcd(a, n) = 1 时,整数 a 在模 n 下具有乘法逆元;扩展欧几里得算法可以找到该逆元。

素数模数产生有限域,其中每个非零元素都可逆。其他公钥系统在精心选择的有限群上运行,包括椭圆曲线群。实现必须使用所选标准定义的群、编码、验证和子群规则,而不是将任意整数或点视为有效密钥。

概率和安全参数 #

密码学保证具有概率性并且由参数化定义。如果秘密从 2^k 种可能性中均匀采样,穷举搜索平均需要约 2^(k-1) 次猜测。理想的 n 位哈希进行原像攻击需要约 2^n 次工作量,但由于生日界,碰撞只需 2^(n/2) 次工作量。

安全参数表示目标工作因子,而不是每个对象的位数。256 位椭圆曲线群可以针对约 128 位经典安全性,而 256 位哈希针对 256 位原像抗性和 128 位碰撞抗性。特定算法攻击、量子攻击模型、实现泄露、弱随机生成和密钥生命周期都可能降低有效强度。因此,参数选择必须遵循协议标准和当前密钥管理指导。

概率也决定失败限制。身份验证标签可以以某种有界概率被伪造,基于 nonce 的模式会限制在一个密钥下处理的消息数量和总大小。系统必须执行这些使用限制,而不是假设仅凭大密钥就能安全地无限使用。

一次一密和流密码 #

对于等长字符串,一次一密计算:

text
ciphertext = plaintext XOR pad
plaintext  = ciphertext XOR pad

只有在填充均匀随机、保密、至少与明文等长并且从不全部或部分重用时,才具有信息论安全性。重用填充会产生 ciphertext1 XOR ciphertext2 = plaintext1 XOR plaintext2,即使最初不知道任何明文,也会泄露结构。安全地生成、分发和销毁填充,对于大多数软件系统都不实用。

流密码用从紧凑秘密密钥和 nonce 派生的伪随机密钥流替代真正随机的填充。nonce 通常是公开的,但其唯一性要求是强制的。在同一 ChaCha20-Poly1305 密钥下重复 nonce,会重复 ChaCha20 密钥流,也会重用一次性身份验证密钥。AES-GCM 同样会在 nonce 重用后失去强机密性和身份验证保证。使用能够管理或验证 nonce 的库 API,并在模式的消息或数据限制之前轮换密钥。

带关联数据的认证加密 #

单独加密不能检测修改。带关联数据的认证加密(AEAD)方案返回密文和身份验证标签,同时对以下内容进行身份验证:

  • 明文,其仍保持机密;
  • 关联数据,其保持可见但不能在不被发现的情况下更改;以及
  • 根据方案要求的 nonce 和算法输入。

当中间人必须读取协议版本、记录序号、租户标识符或路由字段等标头时,可以将其作为关联数据。两个端点必须精确地序列化相同的关联数据,因为差异会导致标签验证失败。

应通过维护中的密码学库使用标准化 AEAD,例如 AES-GCM 或 ChaCha20-Poly1305。接收方不得释放或处理未经身份验证的明文。标签失败是身份验证失败;重试、日志和错误响应不得泄露部分明文或区分有用的内部失败状态。附加到密文的无密钥摘要不提供这种保护。

哈希、MAC 和密钥派生 #

外观相似的原语具有不同作用:

原语秘密输入主要作用
密码学哈希无稳定摘要、承诺组件或协议定义的传输记录哈希
消息身份验证码(MAC)共享密钥密钥持有者之间的完整性和来源身份验证
密钥派生函数(KDF)秘密密钥材料生成具有所需长度的上下文绑定密钥
密码哈希函数密码和盐使离线密码猜测成本高昂

普通哈希不能对数据进行身份验证,因为攻击者替换消息后可以计算新的摘要。HMAC 是标准化的 MAC 构造;不要替换为 hash(key || message)。HKDF 首先从输入密钥材料中提取固定长度伪随机密钥,然后将其扩展为上下文特定的输出。其 salt 和 info 输入不是密码,与密码哈希的每账户随机盐用途不同。

KDF 上下文标签按协议、版本、方向、角色和用途分离密钥。例如,加密密钥和 MAC 密钥不能仅仅因为都来自一个共享秘密就使用相同字节。应遵循外层协议定义的标签和编码,因为有歧义的拼接会破坏这种分离。

非对称密钥建立和签名 #

Diffie-Hellman 和椭圆曲线 Diffie-Hellman 允许双方在可观察信道上派生共享秘密。裸 Diffie-Hellman 不会验证任一方的身份:主动攻击者可以与每个端点协商一个秘密。完整协议会将交换记录绑定到证书、预共享密钥或之前验证过的公钥,然后使用 KDF 派生通信密钥。

密钥封装机制(KEM)为接收方公钥生成共享秘密和封装。密码学迁移期间,协议可以组合独立安全的组件,但组合方式及其 KDF 必须来自经过审查的协议规范。公钥加密不能与密钥协商或 KEM 互换。

数字签名将私钥签名操作绑定到消息,并允许使用公钥验证。Ed25519、ECDSA 和 RSA-PSS 等算法定义消息格式、哈希、随机性或确定性 nonce 生成以及验证规则。签名不是“使用私钥加密”,签名验证也不会使不受信任的公钥变得真实可信。

从威胁模型开始 #

只有在陈述安全边界后才选择原语:

  1. 确定受保护资产,以及是否需要机密性、完整性、对等方身份验证、抗重放或前向保密。
  2. 确定攻击者能力,包括观察、主动修改、选择输入、端点入侵、旁信道、回滚和拒绝服务。
  3. 定义信任锚、密钥所有权、密钥轮换、入侵恢复和经过身份验证的元数据。
  4. 选择安全属性与这些要求匹配的标准化协议和维护中的实现。

TLS 可以保护传输中的数据,但被入侵的端点、授权错误和应用程序级重放可能处于其边界之外。签名可以证明某个密钥授权了消息,却不能说明该密钥是否应被信任。明确边界可以防止将一个属性误认为另一个属性。

OpenSSH randomart 体现了同样的区别。它是公钥指纹的可视化表示,不是经过身份验证的身份凭证。应通过单独的已验证信道比较完整指纹。

参考资料 #

评论

在 GitHub 上阅读或评论(发表评论需要登录)