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

Encryption 如何选择AES加密模式(CBC ECB CTR OCB CFB)?,encryption,aes,Encryption,Aes,在什么情况下,他们中的哪一个是首选的 我想看看各种模式的评估标准列表,也许还可以讨论每个标准的适用性 比如说,, 我认为其中一个标准是加密和解密的“代码大小”,这对于微代码嵌入式系统(如802.11网络适配器)很重要。如果实现CBC所需的代码比CTR所需的代码小得多(我不知道这是真的,这只是一个示例),那么我可以理解为什么使用较小代码的模式更可取。但是,如果我正在编写一个在服务器上运行的应用程序,并且我使用的AES库实现了CBC和CTR,那么这个标准是不相关的 看到我所说的“评估标准清单和每个标

在什么情况下,他们中的哪一个是首选的

我想看看各种模式的评估标准列表,也许还可以讨论每个标准的适用性

比如说,, 我认为其中一个标准是加密和解密的“代码大小”,这对于微代码嵌入式系统(如802.11网络适配器)很重要。如果实现CBC所需的代码比CTR所需的代码小得多(我不知道这是真的,这只是一个示例),那么我可以理解为什么使用较小代码的模式更可取。但是,如果我正在编写一个在服务器上运行的应用程序,并且我使用的AES库实现了CBC和CTR,那么这个标准是不相关的

看到我所说的“评估标准清单和每个标准的适用性”了吗


这实际上与编程无关,但与算法有关。

您是否已开始阅读维基百科上的相关信息?然后,按照维基百科上的参考链接访问

  • 除了欧洲央行什么都可以
  • 如果使用CTR,则必须对每条消息使用不同的IV,否则攻击者最终能够获取两个密文并导出一个组合的未加密明文。原因是CTR模式本质上将分组密码转换为流密码,流密码的第一条规则是永远不要使用同一密钥+IV两次
  • 在实现这些模式的难度方面,实际上没有太大区别。某些模式仅要求分组密码在加密方向上运行。然而,大多数分组密码,包括AES,不需要更多的代码来实现解密
  • 对于所有密码模式,如果您的消息在前几个字节中可能是相同的,并且您不希望攻击者知道这一点,那么为每条消息使用不同的IVs是很重要的

  • 我知道一个方面:虽然CBC通过更改每个块的IV来提供更好的安全性,但它不适用于随机访问的加密内容(如加密硬盘)

    因此,对顺序流使用CBC(和其他顺序模式),对随机访问使用ECB

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

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

    • 如果您想要良好的并行化(即速度),则使用CTR,而不是CBC/OFB/CFB

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

    • OCB是目前为止最好的模式,因为它允许在一次传递中进行加密和身份验证。然而,在美国有专利

    您真正需要知道的唯一一件事是,除非您只加密1个数据块,否则不能使用ECB。如果加密的是随机访问的数据而不是流,则应使用XTS

    • 每次加密时都应该使用unique,而且应该是。如果您不能保证它们是,请使用OCB,因为它只需要a,而不需要a,并且有明显的区别。A不会降低安全性如果人们能够猜到下一个,A可能会导致此问题

    您可能希望根据广泛可用的内容进行选择。我也有同样的问题,以下是我有限研究的结果

    硬件限制

    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 
    
    开源限制

    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]

    (2)

    如果你无法绕过自己的密码,请考虑长期和困难。 事情的丑陋真相是,如果你问这个问题,你可能无法设计和实现一个安全的系统

    让我来说明我的观点:假设您正在构建一个web应用程序,并且需要存储一些会话数据。您可以为每个用户分配一个会话ID,并将会话数据存储在服务器上的哈希映射中,将会话ID映射到会话数据。但是你必须在服务器上处理这种令人讨厌的状态,如果在某个时候你需要不止一台服务器,事情就会变得一团糟。因此,您可以将会话数据存储在客户端的cookie中。当然,您将对其进行加密,以便用户无法读取和操作数据。那么你应该使用什么模式呢?来到这里,你读到了最上面的答案(很抱歉把你挑出来)。第一个是ECB,不适合你,你需要加密多个块,下一个是CBC,听起来不错,你不需要CTR的并行性,你不需要随机访问,所以没有XTS和专利是PITA,所以没有OCB。使用加密库,您会意识到需要一些填充,因为您只能加密块大小的倍数。您选择它是因为它是在一些严格的加密标准中定义的。在某个地方读到CBC如果与随机IV和安全分组密码一起使用,即使您将敏感数据存储在客户端,您也可以放心

    几年后,在您的服务确实增长到相当大的规模之后,IT安全专家会以负责任的方式与您联系。她告诉你,她可以用密码解密你所有的cookies,因为如果填充被破坏,你的代码会生成一个错误页面

    这不是一个假设情况:

    问题在于,密码学有很多陷阱,构建一个对外行来说看起来很安全,但对知识渊博的攻击者来说却很容易破解的系统非常容易

    如果需要加密数据,该怎么办 对于实时连接,请使用TLS(确保检查证书的主机名和颁发者链)。如果您不能使用TLS,请查找您的系统为您的任务提供的最高级别API,并确保您了解它提供的保证,更重要的是了解它不保证的内容。对于上面的示例,请使用framewor