為什麼要擴展鍵?為什麼不生成更長的密鑰呢?
AES-128 採用 128 位密鑰(四個 32 位字),並將其擴展為 352 位密鑰表(11 個字)。Speck48/72 採用 72 位密鑰(三個 24 位字),並將其擴展為 528 位密鑰表(22 個字)。密鑰擴展是一種非常流行的做法,但我不知道為什麼。
為什麼不使用更長的密鑰而不進行任何處理——一個完整的 352 位、528 位,無論需要什麼,熵?當然,它會更長,更笨拙,但這對我來說似乎不是問題:除了資源最受限的實現中的最輕量密碼之外,差異肯定可以忽略不計,而且更長的密鑰會更安全,並且初始化也應該更快,因為不需要處理。
在典型的基於輪的分組密碼中,我認為輪密鑰不應該有任何特定屬性——我的印像是一個好的密鑰調度函式只是關於擴散,並且肯定完全隨機的輪密鑰甚至比那。
我錯過了什麼嗎?
(這與Block Cipher 中 Key Schedule 的安全重要性略有關係,但這顯然是一個不同的問題。)
這有幾個原因。首先,密碼的目標是使用最小的密鑰大小盡可能安全。AES 密鑰調度雖然簡單,但足以將密鑰擴展為所有必要的輪密鑰。其他分組密碼使用其他密鑰調度。要求相當適中。一些分組密碼使用非常複雜和緩慢的密鑰調度,而另一些使用相對快速但更脆弱的密鑰調度。任何一個都比沒有關鍵時間表要好。
其次,好的分組密碼具有平坦的密鑰空間。這意味著沒有任何位比任何其他位更重要,並且所有密鑰都同樣安全。如果主密鑰只是更長並且按照您的建議分為每個輪密鑰,那麼它將沒有平坦的密鑰空間。某些密鑰的安全性會低於其他密鑰。例如,10 輪的 128 位分組密碼採用 1408 位密鑰(10 輪通常需要 11 輪密鑰)可能容易受到滑動攻擊如果該 1408 位密鑰由重複的 128 位值組成(即每輪使用相同的 128 位值)。您可以通過要求僅使用隨機生成的密鑰對密碼進行加密來解決此問題,但是您對密碼的使用施加了限制,這是一件壞事。您可以使用 PRNG 生成所有密鑰材料並僅僅為其播種,但您只是重新發明了密鑰時間表!
第三,使用更大密鑰的唯一原因是增加總密鑰空間(即可能的密鑰數量)以使暴力攻擊更加困難。256 位密鑰綽綽有餘,根本不需要增加密鑰的大小。如果確實需要增加密鑰大小,那麼在不取消密鑰調度的情況下很容易做到這一點。
最後,一些密碼有大量的輪數。Threefish有多達 80 輪,塊大小高達 1024 位。每四輪添加一次輪密鑰,在第一輪之前添加總共約 21.5 KiB 的密鑰材料,使用這種大小的密鑰是完全不切實際的。使用多輪的密碼之所以這樣做,是因為與需要較少輪但實現相同安全性的密碼相比,每輪較弱且提供的安全性較低。密鑰的大小沒有理由受到使用許多弱輪或少數強輪的設計選擇的影響。