事实上,丑陋的真相是,如果您正在问这个问题,那么您可能无法设计和实现一个安全的系统。
让我解释一下我的观点:假设您正在构建一个Web应用程序并需要存储一些会话数据。您可以为每个用户分配一个会话ID,并将会话数据存储在服务器上的哈希映射中,将会话ID映射到会话数据。但是,这样您就必须处理服务器上的这种烦人状态,如果在某个时候您需要多个服务器,情况将变得混乱。因此,您想到了将会话数据存储在客户端的Cookie中。当然,您会对其进行加密,以便用户无法读取和操纵数据。那么,您应该使用哪种模式?来到这里,您阅读了最佳答案(抱歉,我要单独提出myforwik)。第一个涵盖的ECB不适合您,您需要加密多个块,下一个CBC听起来不错,您不需要CTR的并行性,也不需要随机访问,因此不需要XTS和专利问题,因此不使用OCB。使用您的加密库,您意识到您需要一些填充,因为您只能加密块大小的倍数。您选择PKCS7,因为它在某些严格的密码学标准中定义。在某处读到,如果使用随机IV和安全块密码,则CBC是可证明安全的,因此即使您将敏感数据存储在客户端上,您也可以放心。为了防止填充预言攻击和密文更改,可以在密文上计算消息认证码(MAC),只有在未被篡改的情况下才解密它。这称为“加密然后认证”,应优先考虑使用此方法。除非极少数情况下,真实性与保密性同样重要(后者是加密的目的)。带关联数据的认证加密方案(AEAD)将加密和身份验证两个过程合并为一个块密码模式,并在过程中生成身份验证标签。在大多数情况下,这会导致速度提高。
考虑到身份验证的重要性,我建议对于大多数用例(除了磁盘加密目的),使用以下两种分组密码模式:如果数据通过非对称签名进行身份验证,则使用CBC,否则使用GCM。
如果使用相同密钥加密多个数据块,则不应使用ECB。
CBC、OFB和CFB类似,但OFB/CFB更好,因为只需要加密而不需要解密,这可以节省代码空间。
如果想要良好的并行性(即速度),则应使用CTR,而不是CBC/OFB/CFB。
如果要编码随机可访问的数据(如硬盘或RAM),则XTS模式是最常见的。
OCB是迄今为止最好的模式,因为它允许在单次传递中进行加密和身份验证。但是,在美国有专利。
你真正需要知道的是,除非只加密1个数据块,否则不要使用ECB。如果要加密随机访问的数据而不是流,则应使用XTS。
ECB: 一种块密码模式,逐个加密长度为n比特的消息块。但安全性较弱,该方法会泄露块之间的等性特征,从而影响整体安全性。它具有重要的遗产价值,并且可以用作其他方案的基础构件,但是必须小心使用;不应将ECB视为“通用”的保密模式。
CBC: 一种IV(初始化向量)加密方案,该模式作为概率加密方案是安全的,可以实现与随机位无法区分的安全性,前提是使用随机IV。如果IV仅作为nonce,则不能实现保密性,如果将其作为方案使用的相同密钥下的nonce进行加密,则也不能满足保密性,因为标准错误地建议这样做。密文易受篡改。没有选择密文攻击(CCA)安全性。许多填充方法存在正确填充Oracle的情况下,保密性将被放弃。加密效率低下,因为其本质上是串行的。广泛使用的此模式的仅限于隐私保护的安全属性导致经常被滥用。可用作CBC-MAC算法的构建块。我无法识别出与CTR模式相比的重要优势。
CFB: 一种IV加密方案,该模式作为概率加密方案是安全的,可以实现与随机位无法区分的安全性,前提是使用随机IV。如果IV是可预测的,则不能实现保密性,同样地,如果它由方案使用的相同密钥下的nonce进行加密,则也不能满足保密性,因为标准错误地建议这样做。密文易受篡改。没有CCA安全性。加密效率低下,因为其本质上是串行的。该方案取决于参数s,1≤s≤n,通常情况下,s=1或s=8。需要一个块密码调用才能处理只有s位的数据,因此效率低下。该模式具有有趣的“自同步”属性;任何数量的s位字符的插入或删除仅会暂时破坏正确解密。
OFB: 一种IV加密方案,该模式作为概率加密方案是安全的,可以实现与随机位无法区分的安全性,前提是使用随机IV。如果IV是nonce,则不能实现保密性,尽管固定的IV序列(例如计数器)可以正常工作。密文易受篡改。没有CCA安全性。加密和解密效率低,因为其本质上是串行的。原生加密任何位长的字符串(不需要填充)。我无法识别出与CTR模式相比的重要优势。
CTR: 一个基于IV的加密方案,假设nonce IV即可实现与随机位无法区分的安全性。作为安全的nonce-based方案,该模式也可以作为概率加密方案,使用随机IV。如果在加密或解密中重复使用nonce则会完全破坏隐私。该模式的可并行性通常使其比其他保密模式更快,在某些情况下快得多。是验证加密方案的重要构建块。总体而言,通常是实现仅隐私加密的最佳和最现代的方法。
XTS: 一种基于IV的加密方案,该模式通过对每个n位块应用一个可调谐的块密码(作为强PRP安全)来运作。对于长度不可被n整除的消息,最后两个块会被特殊处理。该模式唯一允许的用途是加密块结构存储设备上的数据。底层PRP的窄宽度和对分数终端块的差处理是问题所在。虽然比(宽块)PRP-secure块密码更有效,但不如后者理想。
ALG1–6: 一组MACs,全部基于CBC-MAC。方案太多了。有些方案被证明是VIL PRFs安全的,有些则是FIL PRFs安全的,还有一些没有可证安全性。其中一些方案存在破坏性攻击。某些模式已经过时。对于具有密钥分离的模式来说,其处理不足。不应大规模采用,但可以选择“最佳”方案。也可以选择不使用这些模式,而选择CMAC。ISO 9797-1 MAC中的一些模式被广泛标准化和使用,特别是在银行业。该标准的修订版本(ISO/IEC FDIS 9797-1:2010)即将发布[93]。
CMAC: 基于CBC-MAC的MAC,该模式被证明是(VIL)PRF(假设底层块密码是良好的PRP)安全的(直到生日界限)。与基于CBCMAC的方案相比,实际上不存在额外开销。固有的串行性质在某些应用领域是问题所在,并且在使用64位块密码时必须偶尔重新进行密钥更新。比ISO 9797-1 MAC集合更简洁。
HMAC: 基于加密哈希函数而不是块密码的MAC(尽管大多数加密哈希函数本身都基于块密码)。该机制享有强可证明安全界限,尽管并非首选假设。文献中存在多个密切相关的变体,这使得理解已知内容变得复杂。从未提出过破坏性攻击。被广泛标准化和使用。
GMAC: 一种基于nonce的MAC,是GCM的特殊情况。继承了GCM的许多优点和缺点。然而,MAC并不需要nonce,这里获得的好处很少。如果标签被截断为≤64位并且解密程度没有受到监控和限制,则存在实际攻击风险。在nonce重用时会完全失败。如果采用GCM,则使用是隐式的。不建议进行单独的标准化。
CCM: 一种基于nonce的AEAD方案,将CTR模式加密和原始CBC-MAC结合使用。内在上是串行的,在某些情况下限制了速度。假定底层块密码是良好的PRP,具有良好的可证明安全性和较好的界限。设计虽繁琐但可行。比GCM更简单易实现。可以用作基于nonce的MAC。已广泛标准化和使用。
GCM: 一种基于nonce的AEAD方案,将CTR模式加密和基于GF(2128)的通用哈希函数组合使用。在某些实现环境中具有良好的效率特性。在最小标签截断的情况下具有良好的可证明安全性结果。在存在大量标签截断时存在攻击和差的可证明安全性界限。可以用作基于nonce的MAC,此时称为GMAC。允许使用96位以外的nonce是有问题的选择。建议将nonce限制为96位,并将标签至少限制为96位。已广泛标准化和使用。
你是否已经阅读了维基百科上有关 分组密码运作模式 的信息?然后跟随维基百科上的参考链接前往NIST:分组密码运作模式推荐。
你可能希望根据普遍可用的内容进行选择。我曾经有同样的问题,以下是我有限的研究结果。
硬件限制
STM32L (low energy ARM cores) from ST Micro support ECB, CBC,CTR GCM
CC2541 (Bluetooth Low Energy) from TI supports ECB, CBC, CFB, OFB, CTR, and CBC-MAC
开源软件的限制
Original rijndael-api source - ECB, CBC, CFB1
OpenSSL - command line CBC, CFB, CFB1, CFB8, ECB, OFB
OpenSSL - C/C++ API CBC, CFB, CFB1, CFB8, ECB, OFB and CTR
EFAES lib [1] - ECB, CBC, PCBC, OFB, CFB, CRT ([sic] CTR mispelled)
OpenAES [2] - ECB, CBC
[1] 这里提供了一个快速且易于使用的AES库。
[2] 这里可以下载OpenAES-0.8.0压缩包。
虽然如此,他们仍声称CFB和OFB是安全的,但相对不够安全,并且它们一开始就没有真正的优势。CFB与CBC共享相同的弱点,而且除此之外还不能防止重放攻击。OFB与CTR共享相同的弱点,但根本不能并行化。因此,CFB就像没有填充的CBC,但不够安全,而OFB就像CTR,但没有其速度优势并具有更广泛的攻击面。
只有一种特殊情况,你可能需要使用OFB,那就是如果你需要在实时解密数据(例如,一串流入数据)的硬件上进行解密,但是该硬件实际上过于薄弱无法满足要求,但你会提前知道解密密钥。在这种情况下,您可以预先计算所有XOR块并将其存储在某个地方,当真实数据到达时,整个解密过程只需将传入数据与存储的XOR块进行XOR操作,这需要非常少的计算能力。这是OFB可做到的唯一一件事,而其他链接方式均无法实现。
https://your.server
要简单得多,而不是发明某些密钥交换协议并让两端的加密库顺利地协作。 - Perseids