Encryption

無法理解分組密碼範例

  • September 3, 2018

我學習了現代分組密碼並看到了這個例子。

如果使用 8 位 ASCII 進行編碼並且塊密碼接受 64 位塊,則必須向 100 個字元的消息添加多少填充位?

有一個解決方案,但我完全不明白。

解決方案

使用 8 位 ASCII 編碼 100 個字元會產生 800 位消息。明文必須能被 64 整除。如果 |M| 和 |墊| 是消息的長度和填充的長度。

| 男 | + | 墊 | = 0 mod 64 -> | 墊 | = - 800 模 64 -> 32 模 64

我很好奇的是以下問題..

  1. 為什麼使用 8 位 ASCII 編碼 8 個字元會產生 800 位消息?
  2. 填充是什麼意思?
  3. 最後一句是什麼意思?(難以理解)

ASCII是一種將一些字元(26個大寫和小寫的非重讀拉丁字母、10 個阿拉伯數字、空格、32 個符號、33 個其他通常不可列印的字元,總共 128 個)編碼為 7 個塊的方法(這是足夠的,因為 $ 2^7=128 $ ).

通常按 8 個(而不是 7 個)位的塊(稱為octetsbytes )對位進行分組。在現代電腦科學中,字節往往與八位字節相同。在 8 位 ASCII 中,補充位設置為固定值 0。

因此,使用 8 位 ASCII 編碼 100 個字元會產生一條消息 $ m=8\times100=800 $ 位。

在一些常見的操作模式(CBC、CTR、CFB、OFB…)中使用分組密碼進行加密時,有必要按分組密碼可以處理的塊對比特進行分組。一個 64 位塊可以容納每個 8 位 ASCII 的 8 個字元。800 不是 64 的倍數,因此 800 位不能直接加密。

填充來拯救:它增加了 $ p $ 額外的位(填充位,形成填充),使總位數 $ m+p $ 待加密成為塊大小的倍數 $ b $ 並且可以通過塊密碼器的操作模式進行處理。填充方法各不相同,但最常見的方法有 $ k\le p<k+b $ 對於一些常數 $ k $ ,最常見的方法有:

  • $ k=0 $ 用於“零”或“無”填充
  • $ k=1 $ 用於“位”填充
  • $ k=8 $ 對於“字節”填充​​的各種變體

為了 $ m=800 $ , $ b=64 $ , 和所有三個值 $ k $ ,我們會得到 $ p=32 $ , 因為 $ 800+32=832 $ 位適合 13 個 64 位塊。

推理得出:

$ |M|+|\text{Pad}|\equiv0\pmod{64}\implies|\text{Pad}|=-800\bmod64=32\bmod64 $

假設 $ k=0 $ . 它說消息的組合 $ M $ 的 $ |M|=m $ 位和 $ \text{Pad} $ 的 $ |\text{Pad}|=p $ 位是的倍數 $ b=64 $ . 所以 $ m+p\equiv0\pmod b $ . 所以 $ p\equiv-m\pmod b $ . 因為 $ 0\le p<b $ (這是哪裡 $ k=0 $ 發揮作用),這意味著 $ p=-m\bmod b $ .

更一般地,填充的長度是 $ p=k+b-1-((k+m-1)\bmod b) $ 位。如果問題考慮了 96 個字元的消息 ( $ m=768 $ ), $ p $ 將會 $ 0 $ 為了 $ k=0 $ , 和 $ 64 $ 為了 $ 1\le k<8 $ .


模算術中的符號:對於正整數 $ n $ 和任何整數 $ x $ 和 $ y $

  • 符號 $ y\equiv x\pmod n $ 意思是 $ x-y $ 是的倍數 $ n $

這被讀作y 等價於 x, modulo n

  • 符號 $ y=x\bmod n $ 另外意味著 $ 0\le y<n $

這被讀作y 等於: x modulo n。這裡, $ \bmod $ 是一個運算符。這是可以區分的 $ \bmod $ 左邊沒有左括號;另外,沒有 $ \equiv $ 符號。

  • 相當於前面的語句, $ x\bmod n $ 是定義為的整數

    • 對於非負 $ x $ ,歐幾里得除法的餘數 $ x $ 經過 $ n $
    • 為負 $ x $ , 整數 $ n-1-((1-x)\bmod n) $

引用自:https://crypto.stackexchange.com/questions/61991