我怎樣才能發揮 DES 的全部潛力?
我最近編寫了 DES 算法。現在它只適用於 <0;255> 範圍內的整數(或者更好地說是字元)。我怎樣才能利用它的全部潛力——只使用 ASCII 是一種浪費(有很多我永遠不會使用的字元)。
編寫自己的 DES 通常是一個壞主意(除非作為更好地理解算法的練習),但沒關係。根據定義,該算法適用於由 8 個字節組成的數據塊(即 0..255 範圍內的整數),密鑰是這些字節中的 7 個(或 8 個未使用的奇偶校驗位)。
數據的含義(文本或二進製文件,如 Office 文件或 zip 文件)等無關緊要。我不明白你所說的“全部潛力”是什麼意思。您可以將其用於 ASCII 文本。字節在什麼範圍內並不重要。數據的編碼取決於您(您可以將較低的 ASCII 數據打包成 7 位字元,然後像 SMS 那樣溢出到下一個字節),而不是DES 或任何加密算法的一部分。字節就是字節。DES 處理字節。
DES 是一種舊的(本身不安全的)分組密碼。分組密碼適用於位塊。然而,由於現代電腦的性質,密碼的輸入和輸出通常限於 8 位字節或八位字節。一個字節可能有 7 位或 9 位的時代已經一去不復返了。
同樣,由於計算的性質,電腦內部的所有內容都以比特編碼,在更高的水平上以字節編碼。這些數據(無論它代表什麼)都可以使用塊密碼*操作模式(*例如 CBC)進行加密。如果你有一個
char*
,你有一個字節的直接表示;C 語言中的achar
實際上只是一個字節,而不是字元。使用更高級別的語言或結構(例如 Java),您可能無法直接訪問內部編碼。也可能是內部編碼沒有指定或標準化。在這種情況下,您需要自己執行編碼和解碼。因此,您首先編碼為字節數組(
char[]
在 C 中),然後加密結果。將整個對象編碼為字節流稱為“序列化”。如果你認為你在浪費比特,那麼你有兩個選擇:要麼使用更小的編碼來加密數據(例如 UTF-8 而不是 UTF-16 或 7 位 ASCII 而不是 8 位 ASCII),或者你可以壓縮加密前的結果(例如壓縮它)。請注意,密文的長度取決於明文的長度。這意味著攻擊者可能能夠從密文的大小中提取資訊。
有時您需要加密結果與輸入的格式相同。在這種情況下,您需要使用 Format Preserving Encryption 進行加密。這是密碼學的一個特殊分支,需要相當多的知識,可能最適合該主題的專家和學者使用。
如前所述,DES 是不安全的,如果只是因為它的小密鑰大小。如果您想使用它成功地保護數據的機密性,您應該只將它用作(3 鍵)TDES(也稱為三重 DES、TDEA、3DES、DES-EDE 等)的建構塊。