还有一些其他问题:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256具有GCM和SHA256。 GCM的用途是什么,SHA256的用途是什么?似乎所有需求都是GCM。
#1 楼
AEAD密码实现通常在内部进行加密,然后进行身份验证(而OpenSSL中的CBC密码则不是)。 TLS确实需要摆脱“身份验证然后加密”的问题,后者需要对AES等分组密码的CBC代码进行特殊处理。 AEAD密码(无论内部结构如何)都应不受认证然后加密引起的问题的影响。AEAD算法通常带有安全证明。这些安全性证明当然取决于基础原语,但是尽管如此,它仍然对完整方案提供了更多的信心。
这些密码通常是单次通过(OCB,不经常使用),1.5通过(GCM,Poly1305)或2通过(EAX)。这意味着它们通常比使用CBC +(H)MAC的两次通过方案具有执行速度优势。如果使用更高级的语言(Java,Python等)来实现TLS,则即使是EAX方案也可以具有性能优势。这是因为在协议级别(CBC + HMAC)上,为两种算法的组合创建一种针对一种算法(EAX)的完全优化的实现更为容易。内部EAX只是CTR + CMAC。
此外,通常可以(强制)遵循RFC 5116的AEAD方案。这意味着对于所有AEAD密码,只需要一个接口即可。 IV和明文的处理。当然,也可以让CBC + HMAC遵守此RFC。
速度和安全性可能是Google在Chrome中已经支持ChaCha20 + Poly1305 / AES的原因。房间里有这么大的大象,Daniel J. Bernstein(所有人)很难忽略这种方案。这是一个1.5传递的AEAD密码,在下面使用了快速流密码,因此总体而言效率很高。
#2 楼
AEAD密码的优点是什么?
这取决于一个方案,但通常意味着您:
仅信任一种算法,而不是两种。
只执行一遍(在AEAD领域是理想的,不是它的结果)。
节省代码,有时也节省计算。
代码节省在嵌入式和IoT设置中可能很重要。
TLS工作组为什么要为此努力?
我还没有?虽然没有遵循IETF TLS WG本身,但是很难正确使用AEAD模式密码。通常,密码学界犯的错误更少,而KAT覆盖的范围更大。
我认为现代密码套件需要SHA256进行身份验证。包括Poly1305在内有什么优势?即,例如SuiteB(SECRET)。它还需要信任SHA256和您的加密算法,以及SHA256的性能和内存要求,这可能不是很大。
从cr.yp.的poly1305部分到:
Poly1305-AES具有几个有用的功能:
如果AES是安全的,则可以保证安全。有一个定理保证即使对于长期密钥(2 ^ 64条消息),安全性差距也非常小(对于16n字节消息,每次伪造尝试n / 2 ^(102)次)。攻击者破解Poly1305-AES的唯一方法是破解AES。
密码可替换性。如果AES出了点问题,用户可以从Poly1305-AES切换到Poly1305-AnotherFunction,并具有相同的安全保证。
极高的速度。我的Poly1305-AES软件仅需3843个Athlon周期,5361 Pentium III周期,5464 Pentium 4周期,4611 Pentium M周期,8464 PowerPC 7410周期,5905 PowerPC RS64 IV周期,5118 UltraSPARC II周期或5601 UltraSPARC III周期即可验证1024字节消息上的身份验证器。 Poly1305-AES可以提供一致的高速,而不仅仅是一个受欢迎的CPU的高速。
低消息开销。我的Poly1305-AES软件仅花费1232个Pentium 4周期,1264 PowerPC 7410周期或1077 UltraSPARC III周期来验证64字节消息上的身份验证器。 Poly1305-AES提供一致的高速,而不仅仅是长消息的高速。大多数竞争功能都是为长消息而设计的,而没有关注短数据包的性能。
关键敏捷性。 Poly1305-AES可以将数千个同时存在的密钥放入高速缓存中,并且即使密钥不在高速缓存中也可以保持快速。 Poly1305-AES提供一致的高速,而不仅仅是单键基准测试的高速。几乎所有竞争功能的每个键都使用一个大表。随着键数量的增加,这些功能会丢失高速缓存并显着降低速度。
并行性和增量性。 Poly1305-AES可以利用额外的硬件来减少长消息的延迟,并且可以以低成本重新计算以对长消息进行少量修改。
没有知识产权的声明。我不知道与Poly1305-AES相关的任何专利或专利申请。
评论
$ \ begingroup $
请注意,我认为像RFC 5116一样直接在密文中包含身份验证标签是非常愚蠢的。它要求解密方缓存密文,直到找到身份验证标签的位置。这使得恐怖的实现对于加密/解密既不在线也不对称。 API开发人员当然不应该遵循此示例。我真的应该尽快将其发布为博客。
$ \ endgroup $
–马腾·博德威斯♦
15年7月31日在13:25
$ \ begingroup $
请您详细说明一下吗?它不必太长,仅足以使您了解所要解决的问题。
$ \ endgroup $
–斯蒂芬·托瑟(Stephen Touset)
15年7月31日在17:26
$ \ begingroup $
在加密过程中,您可以直接将纯文本输入内部加密功能(例如,在GCM,EAX或CCM中执行CTR模式加密)。您可以直接将密文存储在适当的位置。您不能在解密期间执行此操作,因为您可能正在处理密文或标记。因此,您获得的更新函数与密文相比将返回更多或更少的纯文本。如果您有doFinal方法,则可能仍需要返回纯文本。因此,您需要特殊的缓冲区处理来进行解密,而不是加密。在实施中(Bouncy),它需要多33%的空间。
$ \ endgroup $
–马腾·博德威斯♦
15年7月31日在23:44