在密碼學的領域裡，**初始向量**（英語：，縮寫為IV），或譯初向量，又稱**初始變數**（，縮寫為SV），是一個固定長度的輸入值。一般的使用上會要求它是亂數或偽亂數（pseudorandom）。使用亂數產生的初始向量才能達到語義安全（訊息驗證碼也可能用到初始向量），並讓攻擊者難以對原文一致且使用同一把金鑰生成的密文進行破解。在區塊加密中，使用了初始向量的加密模式被稱為區塊加密模式。

有些密碼運算只要求初始向量不要重覆，並只要求它用是內部求出的亂數值（這類亂數實際上不夠亂）。在這類應用下，初始向量通常被稱為nonce（臨時使用的數值），是可控制的（stateful）而不是亂數。這種作法是因為初始向量不會被寄送到密文的接收方，而是收發兩方透過事前約定的機制自行計算出對應的初始向量（不過，實作上還是經常會把nonce送過去以便檢查訊息的遺漏）。計數器模式中使用序列的方式來作為初始向量，它就是一種可控制之初始向量的加密模式。

初始向量的長度依密碼運算的所需決定。在區塊加密中，初始向量的長度通常就等於一個區塊的大小。值得一提的是，對加密而言，一組難以預期並且與金鑰等長的初始向量能夠避免遭受TMD破譯法（簡單的說，是花**時間**（Time）觀察被攻擊者的密文，並將可能的密文預先算出來放在**記憶體**（Memory）中與之比對，然後推導出被攻擊者的**明文或金鑰資料**（Data）；這種破譯法比起用每一把金鑰試誤還來得快；不過只要密文的產生中伴隨機的因子就可以避免此類攻擊）。使用亂數作為初始向量時，還必須考量碰撞的問題以避免生日攻擊法（簡單來說，就是一群人中兩個人生日相同的機率要高於50%只需要23個人，這意味著成功猜出這些人生日的次數可以被降的很低；同樣的狀況也發生在密碼學中，會影響密文的強度）。對於傳統、不支援初始向量的資料流加密法，實作上是將原金鑰與初始向量先運算後，計算出新的金鑰。然而有些實作已被認為不安全；比如有線等效加密（WEP）協議就遭受到關連式鑰匙攻擊（英语：）。

動機
--

参见：块密码的工作模式
由電子密碼書模式（ECB）下加密的結果並不安全，即使未經破解我們仍幾乎可以看得出原圖的輪廓。
區塊加密在密碼學的領域裡是最基本的加密運算方式之一。然而它的限制是只能對一個預先定義、固定大小資料進行加密。比如在高級加密標準（AES）裡，若使用長度為128位元的金鑰，加密的過程就是將整個明文切割成多個128位元長度的子明文，然後依前後順序用同一把金鑰轉換成對應的多個128位元長度的子密文，這些子密文依產生的順序連接起來便是完整的密文。這種作法其實就是把甲資料轉換成固定的乙資料，這樣的對應關係是絕對的，因此攻擊者在收集足夠的明文與密文的組合後可以輕易的比對並推導出明文或金鑰。

為了要隱藏明文與密文的組合被攻擊者收集，並且不重新建立金鑰來混淆輸入的明文，在1980年由美國國家標準與技術中心提出了四種區塊加密模式。第一種稱為電子密碼書模式（ECB mode），描述了最基本的運作模式（前述較有疑慮的運算方式）。為了要避免ECB模式的問題，文中提出了密碼塊連結模式（CBC mode）。CBC模式的作法是對第一塊明文投入隨機的初始向量，然後將明文與向量運算的結果加密，加密的結果再作為下一塊明文的向量。這種做法的最終目的是要達到語義上的安全，讓攻擊者無法從密文中獲取能助其破譯的相關線索，避免遭受選擇明文攻擊法。

取值
--

初始向量的值依密碼演算法而不同。最基本的要求是「唯一性」，也就是說同一把金鑰不重覆使用同一個初始向量。這個特性無論在區塊加密或串流加密中都非常重要。

***範例：*** 對明文*P*做串流加密，轉換成密文*C*。所使用的是串流金鑰*K*，它來自金鑰與初始向量。我們可以得到等式：*C* = *P* xor *K*。假如攻擊者得知密文*C*1與*C*2來自同一把金鑰與初始向量。那麼攻擊者就能透過底下公式得到明文*P*1與*P*2：
*C*1 xor *C*2 = (*P*1 xor K) xor (*P*2 xor K) = *P*1 xor *P*2.
許多要求初始向量必須讓攻擊者無法預測。這種要求一般使用亂數或擬亂數來達到。在這種應用中，重覆的初始向量是可以被忽略的，但是生日攻擊的問題依然得列入考量，因為若向量可以被預測，會讓攻擊者找到復原明文的線索。

***範例：*** 比如A使用CBC模式加密訊息，而有一位攻擊者E能截看所有密文並指定特定的明文給A，讓A進行加密（即，E有辦法執行*選擇明文攻擊*）。接著，我們假設A用明文*PAlice*與初始向量*IV*1做出密文*CAlice*。然後E設計了明文*PEve*，並能控制或得知初始向量*IV*2的出現。那麼E就可以反覆測試，直到E設計的明文被加密後等於密文*CAlice*。自此，E用以下公式得知自己設計的明文*PEve*等於明文*PAlice*
*CAlice* = *E*(*IV*1 xor *PAlice*) = *E*(*IV*2 xor (*IV*2 xor *IV*1 xor *PAlice*)).
初始向量的值主要還是取決於密碼演算法。其做法不外乎就是隨機或指定（stateful）。使用隨機的方式則取值由發送方計算，並要將向量值送交給接收方。指定的方式則是讓收發兩方分享初始向量所能指定的所有值（state），這些值收發雙方必須預先就定義好。

區塊加密
----

區塊加密常被用做身份驗證的加密。之後亦有所謂的身份驗證加密模式（authenticated encryption modes）。在這種模式中會使用到初始向量。這類應用中一般求出的結果都是固定值，因此使用固定結果的方式（deterministic algorithms）進行驗證，所以初始向量亦使用固定值或是全部填零。

串流加密
----

串流加密中的初始向量被計入那些被用來加密的金鑰的資訊（secret state）裡，然後每次算出後的密文再滾入下一輪（round）的密文計算之中。由於效能的要求，串流加密的設計都希望輪的總數能愈小愈好；但實際的應用上，要定義出總數是十分困難的（not a trivial task）。再著，我們也必須考量其他議題，如：傳輸過程中損失的資訊量、密文的獨一性、初始向量的相關性以及造成串流加密許多安全議題的相關初始向量攻擊法。這類攻擊議題對串流加密的安全性造成嚴重的隱憂，並且有許多持續進行的研究。

WEP的初始向量
--------

在無線傳輸規格802.11的有線等效加密演算法中使用24位元的初始向量來與同一把金鑰做加密運算，這使得密文容易被破譯。使用封包插入的方式可以在數秒內將WEP破解。這個嚴重的缺陷使得此演算法不被推薦使用。

參見
--

* Nonce
* 隨機數
* 盐 (密码学)
* 塊密碼的工作模式
* RC4

參考文獻
----

1. ↑  ISO/IEC 10116:2006 *Information technology — Security techniques — Modes of operation for an* n*-bit block cipher*
2. ↑  Alex Biryukov.. IACR Eprint archive. 2005  [2014-04-28]. （原始内容存档于2013-07-28）.
3. ↑  Jin Hong; Palash Sarkar.. IACR Eprint archive. 2005  [2014-04-28]. （原始内容存档于2014-06-01）.
4. ↑  Alex Biryukov; Sourav Mukhopadhyay; Palash Sarkar.. LNCS (Springer). 2007, (3897): 110–127.
5. ↑  Christophe De Cannière; Joseph Lano; Bart Preneel.  (PDF) (技术报告). ECRYPT Stream Cipher Project. 2005  [2014-04-28]. 40. （原始内容 (PDF)存档于2015-07-06）.
6. ↑  CWE-329: Not Using a Random IV with CBC Mode  （页面存档备份，存于）
7. ↑  Nikita Borisov, Ian Goldberg, David A. Wagner.  (PDF).  [2006-09-12]. （原始内容存档 (PDF)于2019-03-03）.

延伸
--

* Schneier, B.  2nd. New York: Wiley. 1996. ISBN 0-471-12845-7.
* Ferguson, N.; Schneier, B.. New York: Wiley. 2003. ISBN 0-471-22894-X.

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
分组密码 |
| --- |
|  |
| 常见加密算法 | 
* AES
* Blowfish
* DES（内部细节 · 3DES）
* Serpent
* Twofish

 |
|  |
| 次常见加密算法 | 
* Camellia
* CAST-128（英语：）
* IDEA
* RC2（英语：）
* RC5
* SEED（英语：）
* Skipjack（英语：）
* TEA
* XTEA

 |
|  |
| 其他加密算法 | 
* 3-Way（英语：）
* ABC（英语：）
* Akelarre（英语：）
* Anubis（英语：）
* ARIA（英语：）
* BaseKing（英语：）
* BassOmatic（英语：）
* BATON（英语：）
* BEAR and LION（英语：）
* CAST-256（英语：）
* CIKS-1（英语：）
* CIPHERUNICORN-A（英语：）
* CIPHERUNICORN-E（英语：）
* CLEFIA（英语：）
* CMEA（英语：）
* Cobra（英语：）
* COCONUT98（英语：）
* Crab（英语：）
* Cryptomeria/C2（英语：）
* CRYPTON（英语：）
* CS-Cipher（英语：）
* DEAL（英语：）
* DES-X（英语：）
* DFC（英语：）
* E2（英语：）
* FEAL（英语：）
* FEA-M（英语：）
* FROG（英语：）
* G-DES（英语：）
* GOST（英语：）
* Grand Cru（英语：）
* Hasty Pudding cipher（英语：）
* Hierocrypt（英语：）
* ICE（英语：）
* IDEA NXT（英语：）
* Intel Cascade Cipher（英语：）
* Iraqi（英语：）
* KASUMI（英语：）
* KeeLoq（英语：）
* KHAZAD（英语：）
* Khufu and Khafre（英语：）
* KN-Cipher（英语：）
* Ladder-DES（英语：）
* Libelle（英语：）
* LOKI97（英语：）
* LOKI89/91（英语：）
* Lucifer（英语：）
* M6（英语：）
* M8（英语：）
* MacGuffin（英语：）
* Madryga（英语：）
* MAGENTA（英语：）
* MARS（英语：）
* Mercy（英语：）
* MESH（英语：）
* MISTY1（英语：）
* MMB（英语：）
* MULTI2（英语：）
* MultiSwap（英语：）
* New Data Seal（英语：）
* NewDES（英语：）
* Nimbus（英语：）
* NOEKEON（英语：）
* NUSH（英语：）
* Q（英语：）
* RC6
* REDOC（英语：）
* Red Pike（英语：）
* S-1（英语：）
* SAFER（英语：）
* SAVILLE（英语：）
* SC2000（英语：）
* SHACAL（英语：）
* SHARK
* SM4
* Speck
* Spectr-H64（英语：）
* Square（英语：）
* SXAL/MBAL（英语：）
* Threefish（英语：）
* Treyfer（英语：）
* UES（英语：）
* Xenon（英语：）
* xmx（英语：）
* XXTEA
* Zodiac（英语：）

 |
|  |
| 密码设计 | 
* Feistel网络
* 密钥调度（英语：）
* 乘积密码
* S盒
* P盒
* 代换-置换网络
* 混淆與擴散
* 雪崩效应
* 密钥白化
* 密钥长度
* 块大小

 |
|  |
| 攻击（密码分析） | 
* 穷举攻击/蛮力攻击（EFF DES破解机）
* 中途相遇攻击（Biclique攻击（英语：） · 三子集中途相遇攻击（英语：））
* 线性密码分析（英语：）（堆积引理（英语：））
* 差分密码分析（不可能差分密码分析（英语：））
* 截断差分分析（英语：）
* 高阶差分分析（英语：）
* 差分-线性攻击（英语：）
* 区分攻击（英语：）（已知密钥区分攻击（英语：））
* 积分密码分析（英语：）
* 回力镖攻击（英语：）
* 模*n*密码分析（英语：）
* 相关密钥攻击（英语：）
* 滑动攻击（英语：）
* 回旋密码分析（英语：）
* 計時攻擊（英语：）
* XSL攻击（英语：）
* 插值攻擊
* Partitioning（英语：）
* 戴维斯攻击（英语：）
* 回弹攻击（英语：）
* 弱密钥（英语：）
* 肯德尔等级相关系数（英语：）
* 卡方检验
* 时间、内存、数据取舍攻击（英语：）

 |
|  |
| 密码标准 | 
* 高级加密标准（AES）评选过程
* CRYPTREC（英语：）
* NESSIE（英语：）

 |
|  |
| 工作方式 | 
* 初始向量
* 工作模式
* 填充

 |

 |

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
流密码 |
| --- |
|  |
| 广泛使用的密码 | 
* Crypto-1
* RC4
* ChaCha
* 流模式下的分组密码

 |
|  |
| eSTREAM（英语：）组合 | 

|  |  |
| --- | --- |
| 软件 | 
* HC-256（英语：）
* Rabbit（英语：）
* Salsa20
* SOSEMANUK（英语：）

 |
|  |
| 硬件 | 
* Grain（英语：）
* MICKEY（英语：）
* Trivium

 |

 |
|  |
| 其他密码 | 
* A5/1
* A5/2
* Achterbahn（英语：）
* E0（英语：）
* F-FCSR（英语：）
* FISH（英语：）
* ISAAC（英语：）
* MUGI（英语：）
* Panama（英语：）
* Phelix（英语：）
* Pike（英语：）
* Py（英语：）
* QUAD（英语：）
* Scream（英语：）
* SEAL（英语：）
* SNOW (密码)（英语：）
* SOBER（英语：）
* SOBER-128（英语：）
* VEST（英语：）
* VMPC（英语：）
* WAKE（英语：）
* ZUC

 |
|  |
| 理论 | 
* 移位寄存器
* 线性反馈移位寄存器
* 非线性反馈移位寄存器
* 互缩生成器（英语：）
* T-函数（英语：）
* 初始向量

 |
|  |
| 攻击 | 
* 相关攻击（英语：）
* 相关免疫性（英语：）
* 流密码攻击（英语：）

 |

 |