Padding

Cryptopals 挑戰 - 不了解填充細節

  • August 1, 2018

我正在處理 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 實際上是帶有問號的框) 我的問題:

  1. 為什麼首先要對填充十六進制進行編碼?為什麼不是黃色潛艇4444?奇怪的是它是部分 ASCII 和部分十六進制
  2. 這個解決方案真的解決了問題嗎?4 的十六進制編碼版本不應該很可能顯示為 4、04、\x04 嗎?

當您嘗試顯示字節 0x04(不是可列印的 ASCII 字元)時,這是預期的行為。

像 pkcs7 這樣的填充方案在字節序列上執行,而不是 ASCII 字元串。一般來說,密碼和填充常式只關心字節序列;特定字節是否對應於可列印的 ASCII 字元並不重要。

該常式使用字節 0x04 而不是 ASCII 字元 4 (0x34),因為它不知道也不關心 ASCII。此外,使用十進制數字 0-9 意味著填充長度最多為 10 個字節。

在 python 中查看字節字元串時,應避免轉換為字元串,而是將其保留為字節數組。對於調試,您可以執行類似的操作

print pad_pkcs7(buffer, 20).__repr__()

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