無法理解分組密碼範例
我學習了現代分組密碼並看到了這個例子。
如果使用 8 位 ASCII 進行編碼並且塊密碼接受 64 位塊,則必須向 100 個字元的消息添加多少填充位?
有一個解決方案,但我完全不明白。
解決方案
使用 8 位 ASCII 編碼 100 個字元會產生 800 位消息。明文必須能被 64 整除。如果 |M| 和 |墊| 是消息的長度和填充的長度。
| 男 | + | 墊 | = 0 mod 64 -> | 墊 | = - 800 模 64 -> 32 模 64
我很好奇的是以下問題..
- 為什麼使用 8 位 ASCII 編碼 8 個字元會產生 800 位消息?
- 填充是什麼意思?
- 最後一句是什麼意思?(難以理解)
ASCII是一種將一些字元(26個大寫和小寫的非重讀拉丁字母、10 個阿拉伯數字、空格、32 個符號、33 個其他通常不可列印的字元,總共 128 個)編碼為 7 個塊的方法位(這是足夠的,因為 $ 2^7=128 $ ).
通常按 8 個(而不是 7 個)位的塊(稱為octets或bytes )對位進行分組。在現代電腦科學中,字節往往與八位字節相同。在 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) $