1. 程式人生 > >NIST分組密碼儲存加密模式XTS筆記

NIST分組密碼儲存加密模式XTS筆記

 

5. 儲存加密模式XTS

1. 儲存加密

磁碟加密通常使用特殊目的、專門設計的模式。可以調節的小資料塊加密模式(LRWXEXXTS)和大資料塊的模式(CMCEME)是設計用於加密磁碟區塊的。

另外幾種工作模式可能會在後面介紹。

在對磁碟的加密中,通常一個扇區大小為512 Byte。加密時將要寫入扇區的明文資料進行加密,然後儲存到扇區上。解密時,希望能直接讀取到一個扇區上的資訊進行解密

我的理解是,儲存加密的基本要求是:(1) 磁碟加密希望密文不能有擴張,即不能有IV資訊等額外的儲存資訊。(2) 便於隨機訪問。

詳情參見http://en.wikipedia.org/wiki/Disk_encryption_theory

XTS屬於可調密碼。可調密碼和通常的密碼相比,輸入多了一個可以公開的tweak value。在具體操作中,tweak value與明文tweak後(比如做異或)將所得結果送入加密模組,加密後得到的密文再次與tweak value做一次 tweak後才得到輸出密文(也可能沒有加密後的tweak)。為什麼需要此tweak value呢?主要原因在於:(1) tweak可以增加密文的多變性,不改變金鑰只改變此值就可以改變密文;(2) 改變金鑰的代價比改變tweak value大的多;(3) tweak value是公開的,不擔心洩露。

XTS能滿足磁碟加密儲存的要求。在XTS中,tweak value通常是data unit所在位置,所以就不需要額外的空間儲存tweak value。data unit內部類似CTR模式,data unit之間則是相互獨立的,因此便於隨機訪問。

在XTS工作模式中對資料做了以下劃分:各術語由大到小解釋如下:

  1. KeyScope:金鑰的有效範圍,在一個KeyScope裡面包含了N多個DataUnit。同一個KeyScope內,所有DataUnit使用相同的金鑰,且每個DataUnit的長度都是一樣的(不同的KeyScope之間的DataUnit的長度可以不一樣),每個DataUnit擁有各自的tweak value(比如使用其所在地址作為tweak value)。比如有如下KeyScope的例:<KeyScope>: KeyScopeStart =0, DataUnitSize = 4096, KeyScopeLength = 1083。這表示KeyScope從位置0開始,其中共有1083個DataUnit,每個DataUnit的大小都是4096位元組,即這個KeyScope的長度為4096*1083 =4435968位元組
  2. DataUnit:由N個128-bit Block組成。
  3. 128-bit Block:是AES的分組大小。每個128-bit Block都有自己的這個DataUnit內部的編號(從0開始)。每個128-bit Block在進行AES加密前後都會與TweakValue的衍生值做一次XOR。

2. 有限域GF(2^128)

標準中使用的有限域為GF(2^128),本原元alpha,生成多項式 f(x) = x^128 + x^7 + x^2 + x^1 + 1, 數 135就是 x^7 + x^2 + x^1 + 1.。有限域上的乘法參見有限域介紹。此標準中任意元與alpha的乘法就是一個線性反饋移位暫存器。

B * alpha = ( B << 1 )  XOR   ( B_127 > 0 ) ? 135:0

3. 128-bit Block加密

C ← XTS-AES-blockEnc(Key, P, i, j)

  1. Key 是256或512 bit金鑰,長度是普通AES金鑰長度的2倍,因為key會被等分為兩個AES金鑰 key = key1||key2
  2. P 128bit明文
  3. i 128-bit tweak value
  4. j 當前128-bit block在DataUnit內的序號
  5. C 128bit密文

步驟如下:

1. T ← AES-enc(Key2 , i) × alphaj(注:× alphaj可以看作是一個線性反饋移位暫存器)

2. PP ← P  XOR  T

3. CC ← AES-enc(Key1 , PP)

4. C ← CC  XOR  T

XTS-AES blockEnc

4. DataUnit加密

C ← XTS-AES-Enc (Key, P, i)

  1. Key 是256或512 bit金鑰,長度是普通AES金鑰長度的2倍,因為key會被等分為兩個AES金鑰 key = key1||key2
  2. P 明文
  3. i 128-bit tweak value
  4. C 密文

步驟如下:

將明文按128bit劃分 P = P0 |… |Pm−1|Pm,最後一個塊為0——127bit

1.   for ( q = 0; q <= m-2; q++ )//前面的塊直接做塊加密

{

1.1        Cq ← XTS-AES-blockEnc(Key, Pj, i, q);

}

2     b ← bit-size of Pm;//最後兩個塊的加密要特殊點

3     if ( b == 0 )

{

3.1        Cm-1 ← XTS-AES-blockEnc(Key, Pm-1, i, m-1)

3.2        Cm ← empty

}

4     else

{

4.1        CC ← XTS-AES-blockEnc(Key, Pm-1, i, m-1);

4.2        Cm ← first b bits of CC;

4.3        CP ← last (128-b) bits of CC;

4.4        PP ← Pm | CP;

4.5        Cm-1 ← XTS-AES-blockEnc(Key, PP, i, m);

}

2.    C ← C0|… |Cm-1|Cm;

 

最後一個分組不完整時的處理方案

5. KeyScope的加密

使用同一個金鑰,對各個DataUnit分別進行加密即可。各DataUnit間無相關性。

6. 解密

解密與加密類似。在XTS中需要AES解密模組,用在128-bit Block的解密中。