在多个地方都描述了对IV的保密性缺乏需求的含糊之处。这种模棱两可的意思是否表明实际上在某些情况下必须对静脉注射保密?还是在几种流行资源中都存在一种语言怪癖?
(ISC)2 CISSP状态指南(重点是我的):
在大多数情况下,IV不需要是秘密的,但重要的是切勿将其与相同的密钥重复使用。
Crypto.StackExchange:
IV通常不需要是秘密的,但是,在大多数情况下,永远不要在同一密钥下重复使用初始化向量很重要。
< Wikipedia:
初始化矢量与密钥相比具有不同的安全性要求,因此IV通常不需要是秘密的。
我了解IV所扮演的角色以及通常被认为是非秘密信息的原因。我很好奇是否在某些情况下必须将其视为机密信息,或者这仅仅是一种语言上的重复操作而已。
#1 楼
通常,在经过适当设计的密码系统中,必须保密的所有内容要么是实际数据(并且该系统的确切目的是保留该机密性)要么是密钥。根据Kerckhoffs的原则,其他所有内容都应该公开或至少可以公开发布,而不会产生不良影响。现在碰巧将许多密码系统表示为迭代过程,从“初始”开始值”(或“初始化向量”),即“ IV”。可以想象,在这样的系统中,IV是关键。一个人为的例子是带有哈希函数的手工流密码:
状态s被初始化为某个值。
流密码通过以下方式生成伪随机字节:重复对s进行哈希处理:输出的第一个字节是H(s),然后是H(H(s)),依此类推。
这样的流密码就是一个迭代过程,它反复产生下一个散列状态“运行状态”的值。因此,从严格意义上讲,状态的初始值是初始值,并且也是流密码的关键,因此需要保密。
人为的例子。此流密码在许多方面都非常薄弱(请不要使用它!)。在正确设计的密码系统中,当密钥可重用时,我们真的更喜欢它:只能使用一次的密钥往往暗示问题(这是RC4的问题之一)。取而代之的是,我们更喜欢可以多次使用的密钥(例如,对多条消息进行加密),以及可能需要与其他不需要秘密但必须每次更改的值一起使用的密钥。这就是加密系统通常发生的情况:一个可以重复用于多个消息的密钥,以及每个消息必须重新生成的每个消息的“现时”,但不必是秘密的;因此,随机数可以与消息一起发送。大多数加密系统中的“ IV”履行此“即席”角色。
从更概念的角度来看,“ IV”的概念没有得到精确定义。因此,表达“ IV永远不需要保密”这样的绝对注定会激怒某人,在某处,它会以一种略带异国情调的方式使用IV,并发现了一种情况,该情况可以称为“ IV”,但仍需要保密。使用“通常”或“大多数情况下”之类的用语是避免引发激烈辩论的一种简单方法。
评论
$ \ begingroup $
谢谢-上一段完美地说明了歧义可能在何处蔓延。
$ \ endgroup $
– gowenfawr
16年7月11日在20:18
$ \ begingroup $
Markov加密是IV和矩阵一起使用时如何形成复合密钥的一个示例。
$ \ endgroup $
– Noctis Skytower
16年7月12日在21:38
#2 楼
关于HMAC构造的原始论文之一可以找到一个例子,其中一个“ IV”需要保密:Bellare,Mihir,Ran Canetti和Hugo Krawczyk。 1996。“用于消息认证的键控散列函数”。 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.134.8430
引用第4-5页(我的黑体字):
<在基于密码散列函数设计MAC方案时,面临的第一个障碍是后者通常不使用任何加密密钥。daccess-ods.un.org daccess-ods.un.org相反,它们是任何人都可以计算的公共功能,而无需密钥和秘密的参与。这与MAC功能形成鲜明对比,后者使用密钥作为其定义的固有部分。我们解决此问题的方法是通过它们的初始变量(IV)来键控这些哈希函数(有关详细信息,请参见第2节)。也就是说,这些函数定义的通常固定的IV被随机(和秘密)字符串代替,该字符串成为MAC的密钥。
像SHA-2这样的经典哈希函数具有一个“ IV”也是如此,但通常不会作为散列函数用户的参数公开-这是一个内部参数,散列函数的定义将其设置为散列函数实例的固定常数。哈希函数的IV的目的与块密码模式中的IV的目的显然并不相似,但是其用语却是相同的。
因此,本文首先定义了一种有效的“ NMAC”构造通过修改诸如SHA-2之类的哈希函数,以将IV作为用户提供的参数而不是固定值。但是由于许多用户不能或不会这样做,所以他们将现在熟悉的HMAC构造显示为一种变型,可以使用现成的哈希函数(第5节,第13页):
第4节中介绍的NMAC构造要求直接访问压缩功能(而不是整体哈希功能)的代码,以便为IV设置密钥。对于具有结构良好的代码(如MD5)的函数而言,这样的更改是微不足道的(请参见[Ri])。但是,在某些情况下,即使是那些最小的更改,人们仍然希望避免,而是照原样使用代码(或硬件实现)。在这里,我们介绍[HMAC],它是实现此目标的NMAC的改编。
我分开回答的这一部分,因为这是一种意见。
您的问题和我的示例与“ IV”一词的流行与我的抱怨息息相关。这个术语与算法的实现细节(用于初始化算法中使用的某些数据结构的值)有关,而与函数的接口无关(将其视为黑匣子的用户最关心的是什么!)。 )。在描述密码方案的接口时,我认为避免使用术语“ IV”更容易理解,而应使用定义或含义与方案的接口或协定有关的术语。例如:
随机数-用户必须保证的非秘密值,不能在多个调用之间重用。
随机盐-随机盐-用户必须为每个呼叫随机选择承诺。无论如何,当您看到“ IV”一词时,建议您不要假设它暗示着一个非秘密的值,而应该验证这是正确的。我怀疑引起您困惑的文字是因为类似的关注而写的。
评论
好吧,我很确定我是否曾说过这种话,是因为“这只是一种语言上的反复操作而已”,但问一个具体情况实际上是一个很好的问题:)我想不出一个示例,其中IV公开导致密码系统中可利用的弱点。这并不意味着不存在这样的示例,但是如果确实存在,那肯定是密码系统设计不良的病理情况。
一些算法专门将公共“初始值或序列号”和私有“初始值或序列号”作为参数,以消除这种歧义