Padding
Cryptopals 挑戰 - 不了解填充細節
我正在處理 Crypto 中的一些任務,特別是這個小任務:https ://cryptopals.com/sets/2/challenges/9 ,我的目標是在 Python 中實現。
重點是為一定的字節數添加padding,每個字節的值就是添加的字節數。給出的範例是“黃色潛艇\x04\x04\x04\x04”。
我認為我已經解決了這個任務,但是輸出是不可顯示的。這是我在網上找到的一個乾淨的解決方案
def pad_pkcs7(buffer, block_size): if len(buffer) % block_size: padding = (len(buffer) / block_size + 1) * block_size - len(buffer) else: padding = 0 # Padding size must be less than a byte assert 0 <= padding <= 255 new_buffer = bytearray() new_buffer[:] = buffer new_buffer += bytearray([chr(padding)] * padding) return new_buffer buffer = bytearray("YELLOW SUBMARINEX") print str(pad_pkcs7(buffer, 20))
當我執行它時,我得到了與我自己的解決方案相同的結果: YELLOW SUBMARINE$$ ? $$$$ ? $$$$ ? $$$$ ? $$(這
$$ $$s 實際上是帶有問號的框) 我的問題:
- 為什麼首先要對填充十六進制進行編碼?為什麼不是黃色潛艇4444?奇怪的是它是部分 ASCII 和部分十六進制
- 這個解決方案真的解決了問題嗎?4 的十六進制編碼版本不應該很可能顯示為 4、04、\x04 嗎?
當您嘗試顯示字節 0x04(不是可列印的 ASCII 字元)時,這是預期的行為。
像 pkcs7 這樣的填充方案在字節序列上執行,而不是 ASCII 字元串。一般來說,密碼和填充常式只關心字節序列;特定字節是否對應於可列印的 ASCII 字元並不重要。
該常式使用字節 0x04 而不是 ASCII 字元 4 (0x34),因為它不知道也不關心 ASCII。此外,使用十進制數字 0-9 意味著填充長度最多為 10 個字節。
在 python 中查看字節字元串時,應避免轉換為字元串,而是將其保留為字節數組。對於調試,您可以執行類似的操作
print pad_pkcs7(buffer, 20).__repr__()