2013-03-08 85 views
0

我的問題是 - 如何確定輸出密文的長度?分組密碼輸出長度拼圖

我隱約知道輸出長度必須是正在使用的密碼的塊大小的倍數。但這是否意味着:

  1. 如果輸入數據的長度是密碼塊大小的倍數,那麼輸出長度將與輸入長度相同?
  2. 如果輸入數據的長度不是密碼塊大小的倍數,那麼輸出長度將是輸入長度+一個塊大小?

謝謝!

+0

更適合http://crypto.stackexchange.com/ – jbtule 2013-03-08 13:27:47

回答

1

輸出密文的長度取決於塊長度,密碼模式以及是否使用填充。

像CTS這樣的密碼模式可以創建與輸入相等的密碼輸出長度,即使是分組密碼也是如此。

關於1: 如果輸入數據的長度是密碼塊大小的倍數並且使用了填充,則輸出長度將增加一個塊,因爲您至少需要一個字節來指定填充長度。

關於2:輸出長度必須是塊長度的整數倍,因此它是輸入長+(輸入長度​​MOD塊長度)

+1

否,#2不正確。輸出長度將與下一個塊邊界對齊。只需將塊大小添加到明文大小(通常可以快速計算緩衝區大小)就會導致數字太高。 – 2013-03-08 12:17:15

+0

@owlstead你是完全正確的,我糾正了我的答案。 – Robert 2013-03-08 12:36:05

2

羅伯特是正確關於取決於密文大小密碼模式和填充以及可能的塊模式。

如果您在流模式下使用密碼(例如CTR),則密文大小與明文大小相同。如果您使用的是經過身份驗證的模式(如GCM),那麼您必須至少使用身份驗證標記來增加此模式。您也可以使用CBC模式以密文竊取(CTS)來消除填充開銷,但只適用於兩個或更多塊。

現在讓我們假設CBC模式的PKCS#5/7兼容填充,這是目前最常用的模式。在這種情況下,您的明文至少填充一個填充字節(否則,無填充無法區分例如用單個填充字節填充的純文本和可由塊大小劃分的純文本 - 以01值字節結尾)。這意味着如果明文已經被塊對齊,那麼整個塊被添加。

當然,如果明文不是塊對齊的,那麼PKCS#7填充只需要填充最後一個塊。所以在這種情況下,添加1到block size字節。因此計算變成:

大號密文 =(L 明文/L )*(L + 1)

其中L 明文/L 是圓形(像往常一樣,在大多數編程語言中進行整數計算)。

現在讓我們假設AES,它總是具有16個字節的塊大小:

0 bytes -> 16 bytes 
    1 byte -> 16 bytes 
    2 bytes -> 16 bytes 
... 
15 bytes -> 16 bytes 
16 bytes -> 32 bytes 
17 bytes -> 32 bytes 
... 

注意,有相當一些實現使用非標準化的填充。一個例子是PHP中的mcrypt庫(你可以使用mcrypt作爲密碼學中任何不良練習的基礎)。這使用零填充,因此只需填充00值字節,直到明文塊對齊。在這種情況下所得到的大小可以這樣計算:

大號密文 =(L 明文/L - 1)*(L + 1)

顯然運行在任何不期望非標準化零填充的實現中使用它,或者當明文可能以一個或多個00值字節結尾時,會導致麻煩。最後說明:一些語言(例如,Java Cipher)具有從加密實現中檢索塊大小和甚至得到的密文的方法。在你開始實施自己的事情之前,它絕不會傷害到檢查API。

在編寫本文時,維基百科對padding modes有一個很好的解釋。