Des

將普通字母轉換為 64 位純文字

  • October 25, 2020

如何將普通字母文本(例如hi)轉換為 64 位或 128 位二進制數字輸入以用於 DES?

所問的需要問題中未明確的選擇:

1.字元編碼字節

現在最常見和推薦的約定是UTF-8,它將任何字元編碼為 1 到 4 個字節的序列,包括任何ASCII字元作為 1 個字節。對於這些,UTF-8 與許多其他將每個字元編碼為單個字節的早期約定兼容。根據窮人的ASCII 表,拉丁字母阿拉伯數字是遞增編碼的

    a $ \to $ 0x61     b $ \to $ 0x62 …   z $ \to $ 0x7a

    A $ \to $ 0x41     B $ \to $ 0x42 …   Z $ \to $ 0x4a

    0 $ \to $ 0x30     1 $ \to $ 0x31 …   9 $ \to $ 0x39

    $ \to $ 0x20(空格)

注意:前綴0x在這個答案中引入了十六進制,以及一些常見的電腦語言。

因此,hi根據 UTF-8、ASCII、ISO/IEC 8859-1、Windows-1252 和許多其他約定,這兩個字元被編碼為兩個字節 0x68 0x69。

編碼和解碼內置於許多常見的電腦語言中,例如 Python 中的

bytes('Hi😷', 'UTF-8')equalsb'\x48\x69\xf0\x9f\x98\xb7'

b'\x48\x69\xf0\x9f\x98\xb7'.decode('UTF-8')yield 'Hi😷'

其他約定仍在廣泛使用,例如,對於支持代理對的UTF-16  LE,三字元編碼為 0x48 0x00 0x69 0x00 0x3d 0xd8 0x37 0xde。'Hi😷'

2.填充

這是處理最後一個字節以形成密碼的最後一個(可能只是)塊,在 DES 的上下文中為 64 位或 8 個字節。有幾種約定,最常見的是:

  • 零填充。對於一個分組密碼 $ w $ 字節 ( $ w=8 $ 在 DES 的情況下),它被添加 $ 0 $ 至 $ w-1 $ 0x00 處的字節,根據需要達到的倍數 $ w $ . 這對於分配給字節 0x00無操作結束含義的編碼(包括 UTF-8)很好,但不適用於任意bytestring,因為面對以 0x00 結尾的最後一個塊的解碼器將不知道該字節是否需要被保留或刪除。

hi每個 UTF-8 填充到 0x68 0x69 0x00 0x00 0x00 0x00 0x00 0x00。

  • 各種字節填充,現在最常見的是 PKCS#7 填充。對於一個分組密碼 $ w $ 字節 ( $ w=8 $ 在 DES 的情況下),它被添加 $ 1 $ 至 $ w $ 字節,其共同值是添加的字節數以達到倍數 $ w $ .

hi每個 UTF-8 填充到 0x68 0x69 0x06 0x06 0x06 0x06 0x06 0x06。

注意:處理最後一個塊(如果有)的解碼器應該得到這個值 $ x $ 最後一個字節,刪除該字節,然後刪除 $ (w-1+x)\bmod w $ 在此之前的字節,從而離開 $ 0 $ 至 $ w-1 $ 字節。這與一些常見的 PKCS#7 填充變體(例如 ANSI X9.23)兼容,並將填充預言攻擊的風險降至最低。

  • 位填充。它在MAC 、散列和有時加密的密碼學中很常見(我不知道正式名稱;它是 DES MAC 上下文中的 ISO/IEC 9797-1 填充方法 2)。對於一個分組密碼 $ b $ 位 ( $ b=64 $ 在 DES 的情況下),它被添加一個一位,然後 $ 0 $ 至 $ b-1 $ 位為零,以達到 64 位的倍數。在包括 DES 在內的大多數情況下,按照big-endian約定將位轉換為字節,因此一位的單個位變為字節 0x80。

hi每個 UTF-8 填充到 0x68 0x69 0x80 0x00 0x00 0x00 0x00 0x00。


最後,有一個具體的

符合DES 規範的位編號

在出於教育目的從頭開始實施 DES 時,這一點很重要。8 個字節中的每一個都被轉換為每個big-endian二進製文件的 8 位,從而產生從 1 到 64 編號的 64 位序列。 $ i\in[1,,64] $ 屬於偏移處的字節 $ \lfloor(i-1)/8\rfloor $ 並且可以通過將其右移來提取 $ (64-i)\bmod8 $ 位然後保持低位。

在 C 中:((blockOf8Bytes[(i-1)&7]>>((64-i)&7))&1可以64省略)。

因此hi,每個帶有零填充的 UTF-8 為

0110100001101001000000000000000000000000000000000000

7 位 2、3、5、10、11、13、16 設置(1)和其他 57 位清除(0)。


注意:除了在不安全的ECB 操作模式下,明文將在進入 DES 分組密碼之前與某些內容組合(可能通過異或)。

注意:問題提到“(…)DES 的 128 位二進制數字輸入”,但對於hi.

注意:由於其 56 位密鑰, DES作為設計選擇是不安全的。由於其 64 位塊大小,它至少對於所有形式的批量加密目的都已過時,包括具有 168 位密鑰的 3DES。

首先,您不應該使用 DES,它不安全,並且可以說,由於 56 位的密鑰大小遠低於 128 位,因此從來都不是安全的。分析後的鑰匙的強度甚至比這還要小。

所有分組密碼都對二進制輸入塊進行操作。對於 DES,您將有 64 位/8 字節的輸入/輸出。但是,僅使用 DES 並不安全;您需要使用分組密碼操作模式。如果您使用 ECB 或 CBC,則需要將任何消息填充為 64 位/8 字節的倍數。通常為此使用 PKCS#5 填充。對於 CFB 或 OFB 等其他模式,您可以擁有任意大小(通常以字節為單位)的二進制明文消息。

所以明文是二進制的,你怎麼能從文本到二進制呢?嗯,這很簡單:您可以使用字元編碼,例如 US-ASCII 或兼容的 UTF-8 方案。這也是純文字文件(就像您在記事本中創建的那樣)儲存在電腦硬碟上的方式。畢竟文件儲存也是二進制的。

通常,您的程式環境將允許您使用顯式編碼函式來執行此操作。您還可以自己編寫基本的 ASCII 編碼器,只需將字節設置為 41h(十六進制)+英文字母中字元的從零開始的索引為大寫。對於小寫,你會從 61h 開始做同樣的事情。十進制數字從 30h 開始作為零。

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