这篇文章上次修改于 289 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
AES-256 是抗量子安全的,RSA 和 ECC 是量子不安全的。
AES-GCM 可以检测密文是否被篡改。
ECC 被认为是 RSA 的现代继承者,因为在相同的安全级别上使用比 RSA 更小的密钥和签名,并提供非常快速的密钥生成、快速的密钥协商和快速的签名。
ECC 不直接提供加密能力,需要结合 ECDH 和对称加密加密来实现混合加密,如 ECIES。
对称加密 vs 非对称加密
对称加密是一种可以保证数据机密性的密码学原语,其安全性依赖于密钥的保密性。
与对称加密相比,非对称加密的和解密的速度比较慢,因为对称加密的操作是面向比特的,而非对称加密操作常涉及大量复杂的数学运算。
实践中,非对称加密算法只能加密长度不超过特定上限的消息。例如,RSA 算法允许加密的密文长度上限取决于密钥对生成期间设定的安全参数。例如,对于 RSA-4096,允许加密消息的最大长度约为 500 ASCII 字符(相当短的消息)。AES-CTR 的一个 Nonce 可加密约为 69 GB 的消息。
我们很少直接使用非对称加密算法加密消息,主要是因为非对称加密算法允许加密的消息长度相对较小。
混合加密由非对称加密算法和对称加密算法中的认证加密算法组合而成,它可以加密的消息长度与认证加密算法允许加密的消息长度相同。
AES
通常,AES-128 就足够安全了,使用最好的攻击方法攻破 AES-128 大约需要 2^128 次操作,是一个巨大的数字,实践中可以假设我们永远无法达到这样的数字,这样的安全级别能满足几乎所以的应用。AES-256 是抗量子安全的。
就加密速度而言,许多 CPU 供应商已经在硬件中实现链 AES 算法。例如,英特尔和 AMD 的 CPU 中集成了一组关于 AES 的新指令 AES-NI,基于这些指令可以高效地实现 AES 加密和解密。
AES 加密的明文和密文的长度是一样的。加密一个消息时,先将消息拆分称 16 字节块(或许,需要对最后一个块填充)然后逐块加密。这种操作模式加密消息可能会导致密文重复出现,所以需要一个支持随机化的加密操作模式。
对于 CBC(密码块链接 Cipher Block Chaining) 模式,引入初始向量 IV(Initialization Vector),与密码的分组长度相同,必须是唯一的,不可预测的。然后用 IV 与明文的前 16 字节进行异或操作,对于剩下的明文,可以用前一步生成的密文和下一个明文分组进行异或操作(如同前一步用 IV 和明文异或一样)。因为解密是需要用到 IV,因此传送密文时,必须以明文形式传送 IV。因为 IV 是随机的,所以观察到 IV 也不会泄露任何信息。
AES-CBC-HMAC 可以防止密文和 IV 被篡改,具体来说,对明文加密,再用 MAC 算法认证密文和 IV,这样如果敌手篡改了密文和 IV,就不能生成合法的认证标签。生成认证标签后,会把认证标签、IV 以及密文一起发送给接收方。接收方解密前,会先验证标签的合法性,如果被篡改,会抛出异常。
AES-GCM 除了可以检测到密文的修改,还允许对附加数据进行认证,附加数据参数是可选的,既可以为空,也可以包含加密和解密相关的数据,附加数据不会被加密,但会与密文一起发给对方。此外,密文会包含一个附加的认证标签(通常会附加到密文的末尾),因此密文长度会大于明文。为了解密密文,需要使用与加密过程相同的附加数据。解密成功时得到原始的明文,解密错误时说明密文在传输过程中被篡改。
AES-GCM 于 2007 年纳入 NIST 的 SP 800-38D 标准。TLS 协议用到了 AES-GCM,可以说 AES-GCM 对整个网络通信进行了加密。
AES-GCM 采用计数器(CTR)模式,AES-CTR 使用 AES 加密由计数值和 Nonce 拼接起来的分组,计数器初始值为 1。用来加密的 Nonce 和 IV 作用相同,但是,与 CBC 模式对 IV 参数的要求相比,它只要求 Nonce 是唯一的,不要求具备不可预测性。实际应用中,有时也把 AES-GCM 的 Nonce 成为 IV。把 16 字节分块的加密结果成为密钥流,将密钥流与实际明文异或生成密文。CTR 模式不需要任何填充,称为将分组密码转换成了流密码,可以实现逐字节加密。如果密钥流长于明文,先截断为与明文长度相同的字节流,再与明文异或。
切记,不要重复使用一个 Nonce 或 IV,否则会被攻击者破解出密钥。
RSA
RSA 算法自 1977 年首次发布以来,受到了相当多大批评。一种流行的说法是 RSA 太容易理解和实现,导致很多协议在实现时存在弱点。不仅教科书式的 RSA 是不安全的,一些标准中的 RSA 也出现被攻破的情况。
非对称加密标准 RSA PKCS#1 v1.5 中的算法已被攻破。因此,应该使用 RSA PKCS#1 v2.2 中的 RSA-OAEP 算法。大多数安全指南声称模数在 2048 和 4096 比特之间才能提供 128 比特的安全性。然而,鉴于这些指南的安全性评估方法千差万别,许多应用程序都保守地将模数的长度设为 4096 比特。
不过,越来越多的协议不再使用基于 RSA 的非对称加密算法,更倾向于使用 ECDH 密钥交换算法和混合加密算法,因为公钥尺寸更小,协议的安全实现也相对简单。
RSA 不是抗量子安全的,具体可以参考:超链接
ECC
椭圆曲线加密 ECC(Elliptic Curve Cryptograhpy)是现代公钥密码体系,安全假设基于 ECDLP(Elliptic Curve Discrete Logarithm Problem)。ECC 被认为是 RSA 的继任者,新一代的非对称加密算法,因为在相同的安全级别上使用比 RSA 更小的密钥和签名,并提供非常快速的密钥生成、快速的密钥协商和快速的签名。
ECC 不能像 RSA 那样直接用于加密,而是应用于混合加密模式,先通过使用 ECDH(Elliptic Curve Diffie-Hellman)密钥交换来导出共享密钥,然后用该共享密钥进行对称加密和解密。
256 bit 的椭圆曲线(域的大小为 256 bit 的数字)可提供 128-bit 的安全性。
ECC 不是抗量子安全的。
ECIES
基于椭圆曲线混合加密标准 ECIES(Elliptic Curve Integrated Encryption Scheme)是应用最为广泛的混合加密方案之一,由于算法的尺寸较小,且可靠性更强,所以比基于 RSA 的混合加密方案更受欢迎
ECIES 在加密消息前,需要运行 ECDH 算法完成密钥交换,即使用 Alice 的公钥和己的私钥生成一个临时共享密钥。之后,将共享密钥当做 AES-GCM 这类认证加密算法的密钥,对发向 Alice 的消息进行加密。加密完消息后,将临时公钥和密文一起发送给 Alice。Alice 先用收到的临时公钥和自己的私钥进行密钥交换,生成共享密钥。然后用这个共享密钥解密密文,恢复出原始消息。如果消息在传输过程中遭到篡改,解密就会出现错误。
参考
戴维-王. 深入浅出密码学[M]
没有评论