在哪种情况下哪一个更受青睐?
我想看看各种模式的评估crtieria列表,也许可以讨论每个标准的适用性。
例如,
我认为其中一个标准是加密和解密的"代码大小",这对于微代码嵌入式系统(如802.11网络适配器)非常重要。 如果实现CBC所需的代码远小于CTR所需的代码(我不知道这是真的,这只是一个例子),那么我就能理解为什么使用较小代码的模式会更受欢迎。 但是,如果我正在编写一个在服务器上运行的应用程序,并且我使用的AES库无论如何都实现了CBC和CTR,那么这个标准就无关紧要了。
请参阅"每个标准的评估标准和适用性列表"的含义?
这与编程无关,但与算法有关。
-
"这与编程无关,但它与算法有关。" ∵算法可以用数学表示。 ∵计算机编程可以通过数学表示。 ∴你的问题是关于计算机编程。
-
"这与编程无关,但它与算法有关。" ∵算法可以用数学表示,股票市场可以用数学表示,你的问题是关于股票市场。 /对不起讽刺,但虽然结论非常明显,但这个论点显然是错误的
-
取决于您对订阅的关系的理解。 某些东西不一定只与一个概念或另一个概念相关。
如果你无法实现自己的密码学,请考虑长期和艰难
事情的丑陋事实是,如果你问这个问题,你可能无法设计和实现一个安全的系统。
让我说明一下我的观点:想象一下,您正在构建一个Web应用程序,并且需要存储一些会话数据。您可以为每个用户分配会话ID,并将会话数据存储在服务器上的哈希映射会话ID中,以映射会话数据。但是你必须在服务器上处理这个讨厌的状态,如果在某些时候你需要多个服务器,事情会变得混乱。因此,您可以将会话数据存储在客户端的cookie中。您当然会加密它,因此用户无法读取和操作数据。那么你应该使用什么模式?来到这里你读到了最顶层的答案(对不起你挑出myforwik)。第一个覆盖 - ECB - 不适合你,你想要加密多个块,下一个 - CBC - 听起来不错,你不需要CTR的并行性,你不需要随机访问,所以没有XTS和专利是PITA,所以没有OCB。使用你的加密库你会发现你需要一些填充,因为你只能加密块大小的倍数。您选择PKCS7是因为它是在一些严肃的加密标准中定义的。在阅读某个地方后,如果使用随机IV和安全分组密码,CBC可证明是安全的,即使您在客户端存储敏感数据,也可以放心。
多年后,您的服务确实已经发展到相当大的规模,IT安全专家会在负责任的披露中与您联系。她告诉你,她可以使用填充oracle攻击来解密所有的cookie,因为如果填充以某种方式被破坏,你的代码会产生一个错误页面。
这不是一个假设的场景:几年前微软在ASP.NET中存在这个确切的缺陷。
问题是密码学存在很多陷阱,建立一个对外行人来说安全的系统非常容易,但对于知识渊博的攻击者来说却是微不足道的。
如果需要加密数据该怎么办
对于实时连接,请使用TLS(请务必检查证书的主机名和颁发者链)。如果您不能使用TLS,请查找您的系统为您的任务提供的最高级API,并确保您了解它提供的保证,更重要的是它不保证。对于上面的示例,像Play这样的框架提供了客户端存储设施,但它不会在一段时间后使存储的数据无效,如果您更改了客户端状态,攻击者可以在不注意的情况下恢复以前的状态。
如果没有可用的高级抽象,请使用高级加密库。一个突出的例子是NaCl和具有许多语言绑定的便携式实现是Sodium。使用这样的库你不必关心加密模式等,但你必须更加小心使用细节而不是更高级别的抽象,比如从不使用两次nonce。
如果由于某种原因您不能使用高级加密库,例如因为您需要以特定方式与现有系统交互,则无法彻底教育自己。我建议阅读Ferguson,Kohno和Schneier的Cryptography Engineering。请不要相信你可以在没有必要背景的情况下建立一个安全的系统。密码学非常微妙,几乎不可能测试系统的安全性。
比较模式
仅限加密:
需要填充的模式:
就像在示例中一样,填充通常是危险的,因为它开启了填充oracle攻击的可能性。最简单的防御是在解密之前验证每条消息。见下文。
ECB独立地加密每个数据块,同一个明文块将产生相同的密文块。在ECB维基百科页面上查看ECB加密的Tux图像,看看为什么这是一个严重的问题。我不知道欧洲央行可以接受的任何用例。
CBC具有IV并且因此每次加密消息时都需要随机性,改变消息的一部分需要在改变之后重新加密所有内容,一个密文块中的传输错误完全破坏明文并改变下一个块的解密,解密可以并行/加密不能,明文在某种程度上是可塑的 - 这可能是一个问题。
流密码模式:这些模式生成可能或可能不依赖于明文的伪随机数据流。通常,与流密码类似,生成的伪随机流与明文进行异或运算以生成密文。因为您可以根据需要使用随机流的多个位,所以根本不需要填充。这种简单性的缺点在于加密是完全可塑的,这意味着攻击者可以以他喜欢的任何方式改变解密,如明文p1,密文c1和伪随机流r,攻击者可以选择差异d等。密文c2 =c1⊕d的解密是p2 =p1⊕d,因为p2 =c2⊕r=(c1⊕d)⊕r=d⊕(c1⊕r)。对于两个密文c1 =p1⊕r和c2 =p2⊕r,同样的伪随机流绝对不能使用两次,攻击者可以计算两个明文的xor为c1⊕c2=p1⊕r⊕p2⊕r= p1⊕p2。这也意味着如果原始消息可能是攻击者获得的,则更改消息需要完全重新加密。以下所有的蒸汽密码模式只需要分组密码的加密操作,因此根据密码,这可能会在极其狭窄的环境中节省一些(硅或机器代码)空间。
CTR很简单,它创建一个独立于明文的伪随机流,不同的伪随机流是通过从不同的nonces / IV中计数得到的,它们乘以最大消息长度以防止重叠,使用nonce消息加密是可能没有每个消息随机性,解密和加密完全可并行化,传输错误只影响错误的位,仅此而已
OFB还创建一个独立于明文的伪随机流,通过从每个消息的不同随机数或随机IV开始获得不同的伪随机流,加密和解密都不可并行化,因为CTR使用随机消息加密是可能的,没有每条消息随机性,与CTR传输错误一样,只影响错误的位,仅此而已
CFB的伪随机流取决于明文,每个消息都需要不同的随机数或随机IV,如CTR和OFB使用随机消息加密是可能的,没有每个消息的随机性,解密是可并行的/加密不是,传输错误完全破坏了跟随块,但仅影响当前块中的错误位
磁盘加密模式:这些模式专门用于加密文件系统抽象下的数据。出于效率原因,更改光盘上的某些数据只需要重写最多一个光盘块(512字节或4kib)。它们超出了这个答案的范围,因为它们的使用场景与其他场景截然不同。除块级磁盘加密外,请勿将它们用于任何其他操作。一些成员:XEX,XTS,LRW。
认证加密:
为了防止填充oracle攻击和密文更改,可以在密文上计算消息认证码(MAC),只有在没有被篡改的情况下才解密。这称为encrypt-then-mac,应该优先于任何其他顺序。除极少数用例外,真实性与机密性一样重要(后者是加密的目的)。经过身份验证的加密方案(带有关联数据(AEAD))将加密和身份验证的两个部分过程组合成一个块密码模式,该模式也会在过程中生成身份验证标记。在大多数情况下,这会提高速度。
CCM是CTR模式和CBC-MAC的简单组合。每个块使用两个分组密码加密非常慢。
OCB更快但受专利限制。但是,对于免费(如在自由中)或非军事软件,专利持有人已经授予了免费许可。
GCM是一种非常快速但可以说是复杂的CTR模式和GHASH的组合,是Galois字段上的MAC,具有2 ^ 128个元素。它在TLS 1.2等重要网络标准中的广泛应用反映在英特尔为加速GHASH计算而引入的特殊指令中。
建议:
考虑到身份验证的重要性,我建议大多数用例使用以下两种分组密码模式(磁盘加密除外):如果数据通过非对称签名进行身份验证,则使用CBC,否则使用GCM。
好。
-
"如果你需要提出这个问题,你可能对密码学知之甚少,无法实现安全系统。" - 你是对的,但你确实意识到提问是人们如何学习的?也许放松一下吧。
-
@RobertMacLean是的,但与IT中的许多其他领域相反,您将无法通过尝试和错误获得安全性。而对于网页设计,应用程序可扩展性等,您可以主动检查您的要求,测试安全方面的范围从难以实现。不幸的是,这是一个很少教的课程。大多数资源都告诉你密码学是如何工作的,而不是在你没有意识到它的情况下它在实践中失败的无数方法。唯一的出路是了解这个主题。这就是帖子的士气:
-
要么投入足够的时间来彻底了解密码学,要么尽可能地避免密码学,并使用强大的抽象。在学习密码学如何打破第一段的主题中,主题远远超过对模式的描述。
-
减1:起始标题是错误的;它应该说"如果你问这个问题,你就会朝着正确的方向前进,坚持下去,你就会出类拔萃!"
-
@Henrik和RobertMacLean:我添加了一个介绍。那个更好吗?
-
@Perseids在我被允许使用像JCA / JCE这样的低级库之前我需要阅读多少本书?
-
@jordanpg,我认为我不能回答这个问题。它当然取决于你读的书。 java加密库特别低级,文档中充斥着遗留代码和Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");等不良实践。因此,您需要牢固地了解哪些基本原语存在,它们应该做什么以及它们如何相互作用。更难以估计的是您对密码学如何失败的了解程度。
-
作为破解密码的介绍,我听说matasano加密挑战的好处。 Matthew Green有关于像BEAST这样更复杂的攻击的博客文章。特洛伊亨特主张先攻击自己。 @jordanpg
-
否则,我会建议您寻找有见识的书籍和指南,不仅告诉您有什么,还建议您使用哪些组合。出于这个原因,我想推荐Cryptography Engineering,因为它比大多数低级别的介绍做得更好。
-
虽然我完全同意你所说的(你永远不能确定你的系统是100%安全的),但是具有一点安全性的服务器比没有安全性的服务器更好。因此,从stackoverflow复制和粘贴可以获得一点安全性,只是不要放松,认为你是牢不可破的。
-
@FerminSilva:是的,但论证的另一个方面是,使用真实和经过测试的解决方案通常比复制粘贴加密代码更容易。例如。当你想要做的就是从智能手机应用程序与服务器通话时,使用Let的加密TLS证书设置Apache反向代理并在应用程序的任何地方写https://your.server要比发明一些密钥交换要简单得多协议并使双方的加密库能够顺利地协同工作。
-
@FerminSilva:此外,设置HTTPS端点是一项需要一次又一次的能力,而调试破碎的本土加密是(希望)没有。并相信我,后者根本没有乐趣(错误消息很少,大多数情况下它根本不解密或验证。例如,你知道PHP标准加密库的功能听起来像AES256(Rijndael 256)但是实际上是一个模糊的变体,旁边没有其他人支持,你实际上需要使用Rijndael 128,它根据关键字节流的长度在内部切换代码路径?)。
-
"如果你需要问这个问题,你可能对加密技术知之甚少,无法实现安全系统。"这是一个问题22,如果你知道你不知道什么,你问,你做的是正确的。关于充分了解的问题,我经常发现文档缺乏。在加密方面存在将安全性误认为是隐藏的习惯。你正在帮助这个,但我个人也会加粗:如果有疑问,请问。总是测试。
-
"我不知道任何欧洲央行可以接受的用例。"很好的例子 - TRNG中的白化功能。愚蠢(但可行)示例 - OTP用分组密码替换XOR操作。
-
@Perseids -"我不知道ECB可以接受的任何用例"..对于需要为相同数据显示相同密文的情况怎么样?假设您在数据库中有一些带有加密数据的查找表。并且您希望检查某个明文字符串之前是否已加密过。除非您解密该表中的每个条目并检查匹配,否则您无法使用CBC执行此操作。
-
@Lieuwe:查看en.wikipedia.org/wiki/Convergent_encryption。对于您的场景:使用文件的HMAC作为nonce。
-
"如果你需要问这个问题,你可能对加密技术知之甚少,无法实现安全系统。" - 如果你无法解释,请停止说话。我们这里都很聪明,你需要更加努力。
-
如果您尝试创建加密安全随机数生成器,您将使用什么模式?我的想法是从操作系统(/ dev / random在类似POSIX的系统,包括Apple的各种操作系统; Windows上的CryptGenRandom)上输入AES-256,混合它(可能与XoRoShiRo),重新AES,然后重新混合它,我不确定哪种模式最好,而且,我看不出任何明显的缺陷,但我不知道很多关于密码学所以我不是确定它有多好。
-
@MarcusJ:查看NIST SP 800-90A 10.2.1:CTR_DRBG并使用AES实例化它。鉴于我们目前对AES安全性的理解,添加任何东西都是不必要的。如果您想对冲您的赌注,请使用完全不同的加密原语,例如带有独立种子的Keccak,并将其与您生成AES的流进行异或。但是,如果您优化整个系统的安全性,只需信任您的操作系统的(快速)CRNG。 [1/2]
-
大多数安全漏洞发生在实现中,而不是标准化算法中。您的操作系统的CRNG经过严格审查。相比之下,我们大多数人每天写的代码只会被我们有限数量的同事看到,很少在安全专家的正式审查中看到。例如,Linux'/dev/urandom并非没有其(理论上的)缺陷,但任何可利用的东西都会在IT新闻中产生巨大的波动,并且无需您作为软件开发人员的干预即可修复。 (特殊警告适用于嵌入式和虚拟化系统上的CRNG。)[2/2]
-
@Perseids由"独立种子"使用我从/ dev / random获得的数据(重新混合之前或之后)作为关键是一个坏主意?再一次,我只是想为测试生成随机数,我不是试图在这个阶段或任何事情解密结果。
-
@MarcusJ:不,这很好,只要你使用来自/dev/random的不同读数的数据作为种子。
-
如果使用相同的密钥加密多个数据块,则不应使用ECB。
-
CBC,OFB和CFB类似,但OFB / CFB更好,因为您只需要加密而不是解密,这可以节省代码空间。
-
如果您想要良好的并行化(即速度)而不是CBC / OFB / CFB,则使用CTR。
-
如果您编码随机可访问数据(如硬盘或RAM),则XTS模式是最常见的。
-
OCB是目前最好的模式,因为它允许一次通过加密和身份验证。但是在美国有专利。
您唯一需要知道的是,除非您只加密1个块,否则不会使用ECB。如果要加密随机访问的数据而不是流,则应使用XTS。
-
每次加密时都应该始终使用唯一的IV,它们应该是随机的。如果您不能保证它们是随机的,请使用OCB,因为它只需要一个nonce而不是IV,并且有明显的区别。如果人们可以猜测下一个,nonce不会降低安全性,IV会导致此问题。
-
CBC,OFB和CFB远非完全相同。
-
CTR可以并行化,因为您可以将消息拆分为块,每个块具有与其关联的一系列计数器值,并独立地加密(或解密)每个块。相比之下,CFB依赖于前一个块的输出作为下一个块的输入之一,因此它是严格顺序的,并且本质上是不可并行化的。与上述其他模式类似。
-
即使您只加密一个块,如果您使用相同的密钥多次加密一个块(甚至可能不止一次),也不应使用ECB。
-
......如果"CBC,OFB和CFB相同"的答案如何没有单一的downvote?
-
OFB和CFB非常好,因为它们用于流式传输。无需跟踪块大小,特别是在进行即时加密/解密时非常有用。此外,在传输过程中不需要特殊的缓冲逻辑(考虑数据包碎片)。
-
还要考虑CCM,它是一种速度较慢但未受阻碍的模式,其属性类似于OCB。
-
GCM与OCB(性能和其他属性)非常相似,但它不受任何专利的阻碍,因此它是最佳选择。唯一的缺点是实现非常复杂 - 但如果您使用库,则不必担心。
-
为了响应OCB"迄今为止最好":OCB只能使用相同的密钥加密64GB的数据,而不会泄漏信息。 [en.wikipedia.org/wiki/OCB_mode#Attacks]
-
顺便说一句,CTR还允许非随机但唯一的随机数,如普通计数器。
-
除了并行之外,如果您使用普通计数器或类似计数器,CTR还支持随机访问。
Phil Rogaway在2011年对此进行了正式分析。第1.6节给出了我在这里转录的摘要,加上我自己强调的粗体(如果你不耐烦,那么他的建议是使用CTR模式,但我建议你阅读我的段落有关消息完整性与加密的情况)。
请注意,其中大多数要求IV是随机的,这意味着不可预测,因此应该使用加密安全性生成。但是,有些只需要一个"nonce",它不要求该属性,而只要求它不被重用。因此,依赖于nonce的设计比不设计的设计更不容易出错(并且相信我,我已经看到许多CBC没有通过正确的IV选择实现的情况)。因此,当Rogaway说"当IV是nonce时未达到机密性"时,你会看到我添加了粗体,这意味着如果你选择IV加密安全(不可预测),那么没问题。但如果你不这样做,那么你就失去了良好的安全属性。切勿在任何这些模式下重复使用IV。
此外,了解消息完整性和加密之间的区别非常重要。加密隐藏数据,但攻击者可能能够修改加密数据,如果您不检查邮件完整性,则软件可能会接受结果。虽然开发人员会说"但修改后的数据将在解密后作为垃圾返回",一位优秀的安全工程师会发现垃圾导致软件出现不良行为的可能性,然后他会将该分析转化为真正的攻击。我见过许多使用加密的情况,但实际上需要的信息完整性比加密更多。了解您的需求。
我应该说尽管GCM同时具有加密和消息完整性,但它是一个非常脆弱的设计:如果你重新使用IV,你就会被搞砸 - 攻击者可以恢复你的密钥。其他设计不那么脆弱,所以我个人不敢根据我在实践中看到的不良加密代码的数量来推荐GCM。
如果你需要消息完整性和加密,你可以结合两种算法:通常我们看到CBC与HMAC,但没有理由将自己绑定到CBC。重要的是要先加密,然后MAC加密内容,而不是相反。此外,IV需要是MAC计算的一部分。
我不知道知识产权问题。
现在来看看Rogaway教授的好消息:
阻止密码模式,加密但不是消息完整性
ECB:块密码,模式通过分别加密每个n比特块来加密n比特的倍数的消息。安全属性很弱,该方法在块位置和时间上泄漏了块的相等性。具有相当大的遗留价值,并且作为其他方案的构建块具有价值,但该模式本身并未实现任何通常理想的安全目标,必须谨慎使用;不应将欧洲央行视为"通用"保密模式。
CBC:基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV,实现与随机比特的不可区分。如果IV仅仅是一个nonce,则不能实现保密,也不会像该标准错误地建议的那样,在该方案使用的相同密钥下加密nonce。 Ciphertexts具有很强的可塑性。没有选择的密文攻击(CCA)安全性。对于许多填充方法,在存在正确填充oracle的情况下,机密性将被取消。加密从本质上是连续的低效。模式的隐私安全属性被广泛使用,导致频繁的误用。可以用作CBC-MAC算法的构建块。我认为与CTR模式相比没有重要的优势。
CFB:基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV,实现与随机比特的不可区分。如果IV是可预测的,则不能实现机密性,也不是由该方案使用的相同密钥加密的随机数制作,正如标准错误建议的那样。 Ciphertexts是可塑的。没有CCA安全性。加密从本质上是连续的低效。方案取决于参数s,1≤s≤n,通常s = 1或s = 8.对于需要一个阻塞调用仅处理s位而言效率低。该模式实现了一个有趣的"自同步"属性;在密文中插入或删除任意数量的s位字符只会暂时中断正确的解密。
OFB:基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV,实现与随机比特的不可区分。如果IV是随机数,则不能实现机密性,尽管固定的IV序列(例如,计数器)确实可以正常工作。 Ciphertexts具有很强的可塑性。没有CCA安全性。加密和解密本身不是串行的。本地加密任何位长度的字符串(不需要填充)。我认为与CTR模式相比没有重要的优势。
CTR:基于IV的加密方案,该模式实现了与假定nonce IV的随机位的不可区分性。作为基于安全随机数的方案,该模式还可以用作概率加密方案,具有随机IV。如果nonce在加密或解密时被重用,则完全失去隐私。与其他机密性模式相比,模式的可并行性通常使其在某些设置中更快,速度更快。用于经过身份验证的加密方案的重要构建块。总的来说,通常是实现仅隐私加密的最佳和最现代的方式。
XTS:基于IV的加密方案,该模式通过将可调整的块密码(作为强PRP安全)应用于每个n比特块来工作。对于长度不能被n整除的消息,最后两个块将被特殊处理。唯一允许使用该模式的是加密块结构存储设备上的数据。底层PRP的窄宽度和分数最终块的不良处理是问题。比(宽块)PRP安全阻塞更有效但不太理想。
MAC(消息完整性但不加密)
ALG1-6:MAC的集合,所有这些都基于CBC-MAC。计划太多了。有些作为VIL PRF可证明是安全的,有些作为FIL PRF,有些没有可证明的安全性。一些计划承认有害的攻击。有些模式已过时。对于具有它的模式,密钥分离没有得到充分的关注。不应该集体采用,但有选择地选择"最佳"方案是可能的。采用这些模式也没有问题,有利于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:基于随机数的MAC,是GCM的一个特例。继承了GCM的许多优点和缺点。但是对于MAC来说,nonce-requirement是不必要的,在这里它几乎没有什么好处。如果标签被截断为≤64位且解密程度不受监控和缩减,则会产生实际攻击。 nonce重用完全失败。如果采用GCM,则无论如何都要隐含使用。不推荐用于单独的标准化。
经过身份验证的加密(加密和消息完整性)
CCM:基于随机数的AEAD方案,结合了CTR模式加密和原始
CBC-MAC。在某些情况下,本质上是连续的,限制速度。假设底层封闭是一个很好的PRP,那么可以保证安全,有良好的界限。笨拙的建筑,明显地完成了这项工作。比GCM更容易实现。可以用作基于nonce的MAC。广泛标准化和使用。
GCM:基于随机数的AEAD方案,结合了CTR模式加密和基于GF(2128)的通用散列函数。某些实施环境的良好效率特性。假设标签截断最小,可证明安全性很好。在存在大量标签截断的情况下,攻击和可证明的安全性很差。可以用作基于随机数的MAC,然后称为GMAC。允许96位以外的nonce的可疑选择。建议将nonce限制为96位,将标记限制为至少96位。广泛标准化和使用。
好。
-
这对于文档部分来说是合乎逻辑的,[加密主题](stackoverflow.com/documentation/encryption/topics()非常适合。
-
GCM模式:鉴于大多数SO对加密知之甚少,不会正确使用任何模式,一般不使用身份验证,而且经常使用ECB模式GCM模式可能是他们最好的选择。遗憾的是缺乏平台实现,在某些情况下(iOS)没有供应商支持,在许多情况下缺乏硬件支持,目前存在问题。否则,对于不熟悉的加密是有好处的,因为它内置了身份验证,似乎是未来。
-
CTR模式:我不同意CTR模式是最佳选择,因为在实践中有很多失败,主要是IV重用。即便是微软也至少搞过几次。
-
@zaph所有模式都有IV重复使用的问题。在这种情况下,为什么CTR比其他任何模式都差?
-
CBC模式:可能是SO上最常用的模式和最常用的模式,ECB(不应该使用)除外。主要的使用缺陷是非随机IV,但我们看到使用CSPRNG的更正确的用法。填充Oracles虽然存在问题,但可以通过简单地忽略而不返回填充错误来轻松修复。一些实现(例如,Common Crypto)不以在API级别上避免它们的基本上成功的方式报告填充错误。
-
IMO CTR更糟糕,因为它是一个简单的xor,其中CBC像其他几种模式一样从一个块到另一个块进行传播。这似乎很容易,但大众市场代码已经出现重大失误。
-
@zaph:关于GCM是最好的选择,我不同意。整个网络都记录了GCM的脆弱性。如果您重新使用带有GCM的IV,攻击者将恢复密钥。如果您重新使用带有CBC的IV,攻击者可能(在某些情况下)发起攻击以恢复明文,但不能恢复密钥。这两种情况之间存在着天壤之别。
-
没有争论。 IMO我们需要的是一个可以实现的标准,包括随机IV,身份验证,版本控制,填充和密钥派生选项。 IOW将我们所知道的所有部分放在一起是必要的。临时用户(普通开发人员)不应该被这些东西困扰,并且有机会弄错他们。 GCM是朝着正确方向迈出的一步,但尚未完全烘焙。
-
我还希望看到关键的锁柜/钥匙串集成,就像我们在几个平台上看到的那样。用户可以指定密钥名称,加密算法和数据。可以返回密钥以在另一个设备上进行解密。
-
我不明白你对GCM不安全和密钥恢复的评论,加密只是带有auth数据和标签的CTR模式你评价"总体而言,通常是实现仅隐私加密的最佳和最现代的方式"。请参阅:GCM模式
-
@zaph有关在GCM中重用IV时恢复密钥的信息,请参阅此文章。我在日常的代码审查任务中一直看到加密问题,而且反复出现的#1问题是硬编码的IV。发生这种情况时,GCM会完全被破坏。另一方面,CBC泄漏信息但不允许密钥恢复。这就是我不推荐GCM的原因。
-
感谢您的纸质链接。但这与CTR模式nonce重用有何不同?似乎可以针对AES-CTR进行相同的论证,这是GCM使用的加密。
-
@zaph不,AES-GCM与AES-CTR非常不同(AES-CTR没有Galois乘法)。如果您声称可以在重复使用IV进行AES-CTR时恢复密钥,那么您将是第一个提出此类声明的人,并且负担将由您提供证据。老实说,我可以向你保证,这种说法根本就不是真的。
-
另请参见此处:对IV重用的攻击适用于身份验证标记,而常规CTR模式则不存在此标记。此攻击是GCM独有的,不适用于CTR。
-
通过阅读链接的文件,似乎只获得了身份验证密钥,而不是来自nonce重用的加密密钥。这似乎不是在这里的评论中声称获得加密密钥。虽然获取认证密钥允许篡改消息但它不允许恢复消息。请指出我可能出错的地方。
-
@zaph:你是对的,获取了身份验证密钥,而不是加密密钥。
-
我确实只是在使用AES_CTR和IV两次时恢复了一个密钥来证明它可以完成。这是微不足道的。永远不要重复使用IV。只是不要这样做。真。永远。
除了欧洲央行之外
如果使用CTR,则必须为每条消息使用不同的IV,否则最终攻击者可以获取两个密文并导出未加密的明文组合。原因是CTR模式实质上将块密码转换为流密码,流密码的第一个规则是永远不要使用相同的Key + IV两次。
模式的实施难度确实没有太大差异。某些模式仅需要分组密码才能在加密方向上运行。但是,大多数分组密码(包括AES)不需要太多代码来实现解密。
对于所有密码模式,如果您的消息在前几个字节中相同,并且您不希望攻击者知道这一点,则对每条消息使用不同的IV非常重要。
-
为了支持你的Point 1(那个btw为+1):codinghorror.com / blog / archives / 001267.html
-
您不应该使用随机数启动CTR,因为它与先前消息的一部分发生冲突的可能性很小但却增加。而是单调递增它(这可能意味着记住你在持久存储中的位置),并在你用完计数器时(如果)时重新键入。
-
@Theran - 第2点 - 每条消息的不同随机数?不,我认为这是不正确的。我的印象是,将计数器始终置于零状态就好了。 @caf,我认为当Theran说"消息"时,他并不意味着"阻止"。当然,对于通过密码运行的特定消息的每个块,计数器会增加。 Theran似乎在说,每条消息必须以不同的计数器初始值开头。我认为这是不正确的。
-
re:第3点 - 我读过一些文章说,例如,CTR模式实现较小,因为解密与加密相同。因此代码的一半。但正如我所说,在服务器级机器上并不相关。
-
是的,我错过了。这是在CTR模式下应该改变的IV / nonce,但是在加密之前它与计数器结合在一起,所以我倾向于将它视为计数器的随机起始点。只要在加密方向节省空间时只需使用密码,对于许多密码,您只需要反转子密钥进行解密。 AES对于解密来说有点笨重,但它并不像你可以在具有128字节RAM的uC上实现它。子键占用的内存比RAM多!
-
@Cheeso:如果您使用相同的密钥发送多个消息(如多个TLS / IPSec / ...的数据包),这些消息不应该都具有零初始化向量(但是递增或随机的)。如果您仍然为每条消息更改密钥(例如在OpenPGP中),则可以从0开始而不会出现问题。
-
为了澄清,允许盐是相同的,不允许使用的是不同的但是可以以可预测的方式(例如顺序地)生产,并且IV不是相同的并且不能以可预测的方式生产
您是否首先阅读维基百科上的信息 - 分组密码操作模式?然后按照维基百科上的参考链接进行NIST:分组密码操作模式的建议。
-
这个答案不符合Stackoverflow的质量标准:请在您的答案中假设所有外部链接都已消失,并总结 - 如果不是完全复制 - 相关信息,理想情况是以最佳方式回答原始问题。
-
@mirabilos近5年后,他提到当时不存在的规范和标准,真的吗?我特别喜欢谈论死链接,因为这两个实际上仍然非常活跃,并且考虑到有问题的网站可能会再保持5年。那好吧。
-
@mirabilos你可能会说得对,但你对5年前似乎已经做出的答案的投诉是不适用的。你应该承认你的错误。即使情况并非如此,并且您反而意味着它应该更新或更改,它仍然不是强制性的。答案就足够了。
-
@KTC除非政府关闭且网站处于脱机状态。你的答案可能是有用的信息,但目前完全没有了。所以这个问题及其答案的读者仍然想知道2014年更新的内容(由于答复不完整)和当前状态(由于政府关闭了NIST网站)。我很乐意添加缺失的信息,但是......
您可能希望根据广泛使用的内容进行选择。我有同样的问题,这是我有限的研究结果。
硬件限制
1 2
| 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 |
开源限制
1 2 3 4 5
| 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
-
ST Micro:EBC应该是ECB;仅供参考:例如: STM32L4A6支持128位和256位AES,具有ECB,CBC,CTR,GCM以及Galois消息认证码(GMAC)或密码消息认证码模式CMAC链接算法也受硬件支持。
我知道一个方面:虽然CBC通过更改每个块的IV来提供更好的安全性,但它不适用于随机访问的加密内容(如加密硬盘)。
因此,对于顺序流使用CBC(和其他顺序模式),对随机访问使用ECB。
-
啊,对,当然。在加密之前,CBC使用明文块对先前的密文块进行异或。第一个块使用IV。因此,要解密任何块,您必须成功解密所有先前的块。好的,这是一个很好的见解。
-
不,您只需要访问先前的密文,这不需要解密任何以前的块。
-
啊,这意味着CBC随机访问就好了,不是吗?
-
@Cheeso:CBC适用于随机读取访问,但不适用于随机写入访问。在那里使用CTR。
-
@Pa?loEbermann对于随机访问,CTR不是一个好主意,因为如果攻击者观察到两个版本的密文,它会允许严重的攻击。请改用XTS或tweakable blockcipher。
-
绝对没有理由在任何地方使用ECB