Chacha

帶有 128 位密鑰的 Salsa20 / ChaCha

  • January 24, 2019

根據維基百科,Salsa20 和 ChaCha 都支持 128 位和 256 位密鑰。

每個初始狀態有 8 個密鑰字,其中每個字為 32 位。32*8 = 256。我的問題是……應該如何擴展一個 128 位密鑰來填充初始狀態所需的 256 位?

最明顯的方法是將 128 位密鑰附加到自身,但在某些密碼中,例如 RC2 或 RC4 或 Blowfish,或者密鑰經過密鑰擴展步驟以將密鑰擴展為最終需要的任何大小 - 密鑰擴展不是簡單地將原始密鑰附加到自身的步驟。

正如 Luis Casillas 在他的評論中所說,Salsa 的規格很短且解釋清楚。即,如果您對擴展功能感興趣,可以找到兩個範例的說明(一個是 32 字節密鑰,一個是 16 字節密鑰)。

**簡短回答:**處理 16 字節密鑰時,您只需更改一個常量並將密鑰附加到自身。

更多細節如下。


Salsa 密鑰流生成器,注意 $ Salsa20_k(n) $ 一把鑰匙 $ k $ 和一個隨機數 $ n $ , 基於雜湊函式: $ hSalsa20 $ (稱為 $ Salsa20 $ 在規範中)。這個雜湊函式的工作原理如下:如果 $ x $ 是一個 64 字節的序列, $ hSalsa20(x) $ 是一個 64 字節的序列。

現在,讓我們看看密鑰的作用以及它是如何管理的。無論您使用的是 32 字節密鑰還是 16 字節密鑰,都沒有像 Blowfish 那樣真正的密鑰擴展。相反,關鍵 $ k $ 分為兩個 16 字節的子密鑰 $ k_0 $ 和 $ k_1 $ (如果 $ k $ 長度為 16 個字節, $ k_1 = k_0 $ )。然後,將一個 16 字節的常量添加到狀態中,這就是存在差異的地方:根據密鑰大小,值不一樣:

  • 對於 16 字節密鑰,此常量為“擴展 16 字節 k”
  • 對於 32 字節密鑰,此常量為“擴展 32 字節 k”

這個常數被分成4等份,我們稱它們為 $ \sigma_0,\sigma_1,\sigma_2 $ 和 $ \sigma_3 $ , 每個 4 字節。

密鑰流產生如下: $$ Salsa20_k(n) = hSalsa20(\sigma_0\ ||\ k_0\ ||\ \sigma_1\ ||\ n\ ||\ \sigma_2\ ||\ k_1 || \sigma_3) $$ 在哪裡 $ || $ 表示串聯。

請注意,在這兩種情況下, $ hSalsa20 $ 是 64 字節,因此產生了 64 字節的密鑰流。您只需增加隨機數,然後重新開始生成更多密鑰流。

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