初始向量
在密码学的领域里,初始向量(initialization vector,缩写为IV),或译初向量,又称初始变数(starting variable,缩写为SV),是一个固定长度的输入值。一般的使用上会要求它是乱数或拟乱数(pseudorandom)。使用乱数产生的初始向量才能达到语义安全(讯息验证码也可能用到初始向量),并让攻击者难以对原文一致且使用同一把金钥生成的密文进行破解。在区块加密中,使用了初始向量的加密模式被称为区块加密模式。
有些密码运算只要求初始向量不要重复,并只要求它用是内部求出的乱数值(这类乱数实际上不够乱)。在这类应用下,初始向量通常被称为nonce(临时使用的数值),是可控制的(stateful)而不是乱数。这种作法是因为初始向量不会被寄送到密文的接收方,而是收发两方透过事前约定的机制自行计算出对应的初始向量(不过,实作上还是经常会把nonce送过去以便检查讯息的遗漏)。计数器模式中使用序列的方式来作为初始向量,它就是一种可控制之初始向量的加密模式。
初始向量的长度依密码运算的所需决定。在区块加密中,初始向量的长度通常就等于一个区块的大小。值得一提的是,对加密而言,一组难以预期并且与金钥等长的初始向量能够避免遭受TMD破译法(简单的说,是花时间(Time)观察被攻击者的密文,并将可能的密文预先算出来放在记忆体(Memory)中与之比对,然后推导出被攻击者的明文或金钥资料(Data);这种破译法比起用每一把金钥试误还来得快;不过只要密文的产生中伴随机的因子就可以避免此类攻击)。使用乱数作为初始向量时,还必须考量碰撞的问题以避免生日攻击法(简单的说,就是当样本空间够大的时候,要找到两个生日同一天者并非难事;同样的状况也发生在密码学中,会影响密文的强度)。对于传统、不支援初始向量的资料流加密法,实作上是将原金钥与初始向量先运算后,计算出新的金钥。然而有些实作已被认为不安全;比如有线等效加密[1] (WEP)协议就遭受到related-IV attack|关连式钥匙攻击。
目录
取值
初始向量的值依密码演算法而不同。最基本的要求是“唯一性”,也就是说同一把金钥不重复使用同一个初始向量。这个特性无论在区块加密或串流加密中都非常重要。
- 范例: 对明文P做串流加密,转换成密文C。所使用的是串流金钥K,它来自金钥与初始向量。我们可以得到等式:C = P xor K。假如攻击者得知密文C1与C2来自同一把金钥与初始向量。那么攻击者就能透过底下公式得到明文P1与P2:
- C1 xor C2 = (P1xor K) xor (P2 xor K) = P1 xor P2.
许多要求初始向量必须让攻击者无法预测。这种要求一般使用乱数或拟乱数来达到。在这种应用中,重复的初始向量是可以被忽略的,但是生日攻击的问题依然得列入考量,因为若向量可以被预测,会让攻击者找到复原明文的线索。
- 范例: 比如A使用CBC模式加密讯息,而有一位攻击者E能截看所有密文并指定特定的明文给A,让A进行加密(即,E有办法执行选择明文攻击)。接著,我们假设A用明文PAlice与初始向量IV1做出密文CAlice。然后E设计了明文PEve,并能控制或得知初始向量IV2的出现。那么E就可以反复测试,直到E设计的明文被加密后等于密文CAlice。自此,E用以下公式得知自己设计的明文PEve等于明文PAlice
- CAlice = E(IV1 xor PAlice) = E(IV2 xor (IV2 xor IV1 xor PAlice)).
初始向量的值主要还是取决于密码演算法。其做法不外乎就是随机或指定(stateful)。使用随机的方式则取值由发送方计算,并要将向量值送交给接收方。指定的方式则是让收发两方分享初始向量所能指定的所有值(state),这些值收发双方必须预先就定义好。
区块加密
区块加密常被用做身份验证的加密。之后亦有所谓的身份验证加密模式(authenticated encryption modes)。在这种模式中会使用到初始向量。这类应用中一般求出的结果都是固定值,因此使用固定结果的方式(deterministic algorithms)进行验证,所以初始向量亦使用固定值或是全部填零。
串流加密
串流加密中的初始向量被计入那些被用来加密的金钥的资讯(secret state)里,然后每次算出后的密文再滚入下一轮(round)的密文计算之中。由于效能的要求,串流加密的设计都希望轮的总数能愈小愈好;但实际的应用上,要定义出总数是十分困难的(not a trivial task)。再著,我们也必须考量其他议题,如:传输过程中损失的资讯量、密文的独一性、初始向量的相关性以及造成串流加密许多安全议题的相关初始向量攻击法。这类攻击议题对串流加密的安全性造成严重的隐忧,并且有许多持续进行的研究。
WEP的初始向量
在无线传输规格802.11的有线等效加密演算法中使用24位元的初始向量来与同一把金钥做加密运算,这使得密文容易被破译。使用封包插入的方式可以在数秒内将WEP破解。这个严重的缺限使得此演算法不被推荐使用。
动机
由电子密码书模式(ECB)下加密的结果并不安全,即使未经破解我们仍几乎可以看得出原图的轮廓。 区块加密在密码学的领域里是最基本的加密运算方式之一。然而它的限制是只能对一个预先定义、固定大小资料进行加密。比如在高级加密标准(AES)里,若使用长度为128位元的金钥,加密的过程就是将整个明文切割成多个128位元长度的子明文,然后依前后顺序用同一把金钥转换成对应的多个128位元长度的子密文,这些子密文依产生的顺序连接起来便是完整的密文。这种作法其实就是把甲资料转换成固定的乙资料,这样的对应关系是绝对的,因此攻击者在收集足够的明文与密文的组合后可以轻易的比对并推导出明文或金钥。
为了要隐藏明文与密文的组合被攻击者收集,并且不重新建立金钥来混淆输入的明文,在1980年由美国国家标准与技术中心提出了四种区块加密模式。第一种称为电子密码书模式(ECB mode),描述了最基本的运作模式(前述较有疑虑的运算方式)。为了要避免ECB模式的问题,文中提出了密码块连结模式(CBC mode)。CBC模式的作法是对第一块明文投入随机的初始向量,然后将明文与向量运算的结果加密,加密的结果再作为下一块明文的向量。这种做法的最终目的是要达到语义上的安全,让攻击者无法从密文中获取能助其破译的相关线索,避免遭受选择明文攻击法。