Encryption
從加密雜湊函式建構流密碼是否可行?
幾年前,我設計了一個對稱密鑰系統,其工作原理如下:
H() = some hashing function h = the number of bits in the result of H() key = bits to be used as a key ^ = the XOR operation + = concatenation len() = the length function (in bits) max = ceiling(len(cipertext) / h) pad = pad_0 + ... + pad_max pad_0 = H(key) ^ H(plaintext) pad_n = H(pad_(n-1)) cipherpart_n = plaintext_n ^ pad_n ciphertext = H(plaintext) + cipherpart_0 + ... cipherpart_max
基本上,它基於消息的散列和密鑰的散列建構一個“填充”,並將消息與它進行異或。
我實際上不是專家,所以我想知道為什麼這樣的方法不是很常見。
使用更正的系統(實際上使用密鑰),我看到了這些弱點:
- 如果攻擊者可以猜到一些
plaintext_n
,他可以從中得出pad_n
以下ciphertext_n
所有pad_i
資訊——這意味著他可以閱讀消息的其餘部分。- 密文以a開頭
H(plaintext)
,這意味著可以猜測明文的攻擊者有辦法驗證這個猜測。為避免這種情況,明文至少應隨機填充。(但是你可以簡單地使用這些隨機字節作為初始化向量而不是明文的雜湊)。- 即使密鑰本身俱有更大的熵,您的實際密鑰流(
pad
)的熵也會減少到位。h
如果您再次將密鑰輸入到雜湊函式以創建高階,這可能會更好pad_n
。- 正如傑克已經說過的那樣,在開始加密之前需要對明文進行雜湊處理意味著您需要對明文進行兩次傳遞,這意味著加密算法不是線上算法(解密是)。
除此之外,您的算法類似於塊密碼的輸出回饋操作模式,具有從消息派生的初始化向量,並且在以下步驟中沒有新的密鑰輸入。
這是一個沒有這些弱點的變體(希望沒有其他弱點):
initvec = random pad_0 = H(key + initvec) pad_n = H(key + pad_(n-1)) ciphertext = initvec + cipherpart_0 + ... + cipherpart_max
(其餘的與您的範例相同。)
這不做完整性保護……為此,您將在最後附加一些密鑰 MAC(因此它可以是線上算法)。
然後我們實際上有了從散列函式派生的奇怪的“僅加密”分組密碼的 OFB 模式。正如傑克已經提到的,唯一的問題是它比普通的分組密碼要慢得多。
免責聲明:
請注意,雖然此構造在隨機預言模型中是安全的(有關類似構造的證明,請參閱此部落格條目,使用計數器而不是先前的 hash ),但證明使用碰撞抗性和原像未隱含的屬性- 雜湊函式的抗性屬性(這是建構雜湊函式的目的)。
因此,雖然這可能有效,但它不必與現實世界的雜湊函式一起使用。