encryption - 如何选择AES加密模式( CBC ECB CTR OCB CFB ) ?

在哪种情况下最好选择哪个?

时间: 作者:

  • 如果使用同一密钥加密多个数据块,则不应使用ECB。

  • CBC,OFB和CFB相似,但是OFB/CFB更好,因为您只需要加密而不需要解密,可以节省代码空间。

  • 如果您想获得良好的并行化效果,请使用CTR(速度),而不是CBC/OFB/CFB。

  • 如果您正在编码随机可访问的数据(例如硬盘或RAM),则XTS模式是最常见的。

  • OCB是迄今为止最好的模式,因为它允许一次通过加密和身份验证。但美国有专利。

  • 未定义未定义未定义

作者:

简介: 这个回答部分的回答了我在 [encryption] 标签下看到的很多问题,这些问题表明人们部署了完全不安全的代码。 解决这些程序员我写了下面的开头语与打算唤醒他们足够的思考他们的加密方法,之前他们的应用程序被攻击。 如果你在学习的过程中,那很好 ! 我们需要更多具有加密背景知识的程序员。 继续询问并添加一个安静的"还还还"到我的洞口: !

如果你需要问这个问题,你可能对实现安全系统知之甚少。

我知道这听起来很刺耳,所以让我来说明我的观点: 假设你正在构建一个web应用程序,你需要存储一些会话数据。 你可以给每个用户分配一个会话标识,并将会话数据存储在服务器的散列映射映射会话标识到会话数据。 但是,你必须在服务器上处理这个烦人的状态,如果你需要不止一个服务器的东西会变得混乱。 因此,你可以将会话数据存储在客户端的cookie中。 你将对它进行加密,这样用户就无法读取和操作数据。 那么你应该使用什么模式? 在这里你阅读了顶部的答案( 对不起,singling你退出 myforwik ) 。 第一个覆盖——欧洲央行不适合你,你想要加密多个块,下一个-cbc听起来不错,你不需要ctr的并行性,你不需要随机访问,所以没有xt和专利是皮塔饼,所以没有台籍干部。 使用你的加密库,你意识到你需要一些填充,因为你只能加密块大小的倍数。 你选择 PKCS7,因为它是在一些严重的加密标准中定义的。 读完cbc证实安全地方如果使用一个随机iv和一个安全的分组密码,你放心,即使你存储敏感数据在客户端。

年后你的服务的确发展到大规模,it安全专家联系你一个负责任的披露。 她告诉你,她可以解密所有 Cookies 使用 paddingoracle攻击,因为你的代码产生一个错误页面填充好像是坏了。

这不是一个假想的场景: 在几年前, Microsoft在 ASP.NET 中遇到了这个问题。

在is problem ofpitfalls批号cryptography特点的适足和极其容易建立一个宽泛的layman for secure looksto客货两用车而是庸俗。knowledgeable attacker a

如果需要加密数据,应该做什么

对于实时连接使用 TLS ( 确保检查证书的主机名和颁发者链) 。 如果你不能使用 TLS,请寻找你的系统为任务提供的最高级别的API,并确保你理解它提供的保证以及它不保证的重要内容。 等上面的示例框架玩提供客户端存储设施,它不存储数据无效之后一段时间,不过,如果你改变了客户端状态,攻击者可以恢复以前的状态了,你还没注意到。

如果没有高级抽象可用,请使用高级加密库。 一个突出的例子是 NaCl 和一个可移植的实现,带有许多语言绑定的可移植实现是 使用这样的库你不必关心加密模式 等等 但你必须小心使用细节甚至比一个更高级别的抽象,像从未使用nonce两次。

如果出于某种原因,你不能使用高级加密库,例如你需要以特定的方式与现有系统进行交互,因此无法全面地进行培训。 我建议你阅读 Cryptography Kohno和 Schneier的加密工程。 请不要欺骗自己,相信你可以构建一个没有必要背景的安全系统。 加密非常微妙,几乎不可能测试系统的安全性。

出于教育目的,比较模式

仅加密:

  • 需要填充模式: 示例中一样,填充通常很危险,因为它打开了填充oracle攻击的可能性。 最简单的防御是在解密之前验证每条消息。 见下文。
  • 流密码模式: 这些模式生成一个伪随机数据流,它可能或者不依赖于纯文本。 类似于流密码,生成的伪随机流是XORed并用明文生成密文。 因为你可以使用任意数量的随机流,因为你根本不需要填充。 这种简洁是目前加密的缺点是完全可塑性,这意味着他喜欢的解密可以由攻击者以任何方式更改例如为明文 p1,一个密文c1和一个伪随机流 R 和攻击者可以选择什么区别d 之时,解密的密文c2=c1⊕d是 p2 = p1⊕d,就是 p2 = c2⊕r = ( c1 ⊕ ) ⊕ R = d ⊕ ( c1 ⊕ R ) 。 同样的伪随机流不能被两次使用两次作为两个密文c1=p1⊕r和 c2=p2⊕r,攻击者可以计算两个明文的xor作为 c1⊕c2=p1⊕r⊕p2⊕r=p1⊕p2. 这也意味着更改消息需要完全重新加密,如果原始消息可以由攻击者获得。 以下所有的蒸汽密码模式只需要加密块密码,这取决于密码,这可能会在非常狭窄的环境中节省一些( 硅或者机器码) 空间。
    • 点击率很简单,它将创建一个伪随机流,该流的纯文本,不同的伪随机流皆无关大小所获得来自不同 nonces/ivs将会被( 乘以一个因子最大消息长度,以保证每封邮件的重叠是预防和及时使用nonces消息加密是可能的,随机性,解密和加密,可以并行完成,传输错误只影响显示错误的位,而不需要任何更多
    • 还创建一个伪随机流获得了独立的纯文本,不同的伪随机流,通过启动带有不同现时标志或者随机IV使用nonces消息加密是可能的,而每封邮件的随机性。对于每种消息,如用CTR解密加密并不是唯一影响,如用点击率传输错误错了位,而不需要任何更多的可以并行化/
    • 在当前 block, 循环流化床伪随机流所需的纯文本,不同的现时标志或者随机的IV是依赖于的每一封邮件,就像用点击率和描使用nonces消息加密是可能的,而每封邮件的随机性。解密可以并行化/加密,传输错误没有被全面删除下面的块中,而只是效果错了位
  • 磁盘加密模式: 这些模式专门用于加密文件系统抽象下的数据。 出于效率原因,更改光盘上的某些数据必须只需要重写一个磁盘块( 512字节或者 4 KiB ) 。 它们超出了这个答案的范围,因为它们的使用场景不同于其他的。 不用于除块级光盘加密外的任何内容。 一些成员:XEX,esxi,LRW 。

经过身份验证的加密:

为了防止填充oracle攻击和对密文的更改,可以在密文中计算消息验证代码 ( 苹果机),如果它没有被篡改,则只解密它。 这被称为encrypt-then-mac和 ,应优先于任何其他顺序 。 除了很少的用例真实性,真实性( 后者是加密的目的) 同样重要。 经过验证的加密方案( 使用相关数据( AEAD ) ) 将加密和身份验证的两个部分过程合并为一个分组密码模式,该模式也在进程中生成一个验证标记。 在大多数情况下,这会提高速度。

  • CCM是一个简单和CBC-MACctr的组合模式。 每块使用两个块加密加密,速度很慢。
  • 的公民群体更快,但受专利保护。 对于免费的( 如同自由) 或者non-military软件,专利持有者已经授予了一个免费的许可证,尽管。
  • GCM非常快,但可以说是复杂的ctr的组合模式和GHASH,mac在伽罗瓦域 2 ^128元素。 它在重要网络标准如 TLS 1.2中的广泛使用被特殊指令 Intel引入,以加速GHASH的计算。

推荐:

考虑到身份验证的重要性,我建议使用以下两种分组密码模式( 除了磁盘加密之外): 如果数据通过非对称签名验证,请使用 CBC,否则使用 GCM 。

作者:
  1. 除了ECB以外的任何东西。
  2. 如果使用ctr,当务之急是你为每个消息使用不同的第四,否则你最终攻击者能够取两个暗文和派生一个未加密的明文相结合。 原因是CTR模式本质上将一个分组密码转换成一个流密码,而流密码的第一条规则是从不使用相同的Key+IV两次。
  3. 实现模式的难度实际上没有多大差别。 某些模式只需要分组密码在加密方向上操作。 然而,大多数块加密算法,包括 AES,都不需要更多的代码来实现解密。
  4. 对于所有的密码模式,如果你的消息在前几个字节中可能是相同的,那么对每条消息使用不同的切分是很重要的,并且你不希望攻击者知道这个。

你是否开始阅读维基百科上的信息- 块密码模式的操作? 然后跟随维基百科上的参考链接到 NIST: 对操作的分组密码模式的建议。

作者:

阅读其他的答案,recommandations针对ECB的问题是安全( 大多数都没有提到原因),以及破解它的容易程度。

如果你选择了 CBC,CFB或者 OFB,你需要沿着数据发送一个初始化向量( IV ),这基本上是随机( 每次在这些模式下加密时,加密结果都会不同) 。 如果你有 IV,则只能解密数据。

如果发送一个ivincovenient,是不可能( 协议限制,已经是in-place代码或者 wtvr ) 或欧洲央行是唯一可用的aes模式,使央行更安全,垫beggining与随机 bytes(optionally variable length based on the value of the first byte; not keyboard random, but random everytime you pad) 加密数据。 GZip或者其他任何可用的数据压缩数据。 加密。

在解密和解压缩之后,只需在使用数据之前删除填充。

注意:ECB将加密subsequeqent块,而不是基于前一个加密块的加密方式。 这可以通过随机padding+compression算法( 但是,它并不总是工作的- 也许你可以在加密之前用一个随机密码来加密 beggining ) 来缓解。

我有同样的问题,这是我有限研究的结果。

硬件限制


STM32L (low energy ARM cores) from ST Micro support EBC, 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] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library

[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip

作者:

我知道一个方面:尽管CBC为每个块提供了更高的安全性,但它不适用于随机访问的加密内容( 像一个加密的硬盘) 。

因此,使用 CBC ( 以及其他顺序模式) 为顺序流和ECB进行随机访问。

作者:
...