Encryption

Salsa20系列流密碼中“擴展32字節k”-magic number的安全考慮?

  • September 22, 2021

我目前正在檢查Daniel J. Bernstein 編寫的 NaCl 庫,我注意到該庫對 sigma 進行了硬編碼:

static const unsigned char sigma[16] = "expand 32-byte k";

在所有薩爾薩流實現中:

crypto_stream_xsalsa20
crypto_stream_salsa20
crypto_stream_salsa2012
crypto_stream_salsa208

crypto_box庫包裝器:

static const unsigned char sigma[16] = "expand 32-byte k";
static const unsigned char n[16] = {0};

int crypto_box_beforenm(
 unsigned char *k,
 const unsigned char *pk,
 const unsigned char *sk
)
{
 unsigned char s[32];
 crypto_scalarmult_curve25519(s,sk,pk);
 return crypto_core_hsalsa20(k,n,s,sigma);
}

據我從論文中了解到,該常量用於擴展 Stream Cipher。

現在:

  • 為什麼這個變數在庫中被硬編碼?
  • 將這個魔術字元串更改為不同的值是否有意義?
  • 編輯:使用庫中提供的 sigma 的安全注意事項是什麼?

可以在文件中找到實現:

crypto_box/curve25519xsalsa20poly1305/ref/before.c
crypto_stream/salsa2012/ref/xor.c
crypto_stream/salsa2012/ref/stream.c
crypto_stream/salsa20/ref/xor.c
crypto_stream/salsa20/ref/stream.c
crypto_stream/salsa208/ref/xor.c
crypto_stream/salsa208/ref/stream.c
crypto_stream/xsalsa20/ref/xor.c
crypto_stream/xsalsa20/ref/stream.c

編輯:我在上面引用為“Salsa20”常量的論文中找到了對這個常量的引用:

(x0; x5; x10; x15) = (0x61707865; 0x3320646e; 0x79622d32; 0x6b206574); 換句話說,(x0; x5; x10; x15) 是 Salsa20 常數。

考慮到字節序,這是“擴展 32 字節 k”。

Salsa20 具有很強的旋轉對稱性。這些常數的要點是它們在旋轉下不是不變的,從而引入了不對稱性。精確值不是很重要,只要它足夠不對稱即可。

伯恩斯坦 - Salsa20 安全說:

關於對角線常數的註釋

每個 Salsa20 列回合以相同的方式從對角線開始影響每一列。每個 Salsa20 行輪從對角線開始以相同的方式影響每一行。因此,沿對角線移動整個 Salsa20 散列函式輸入數組對輸出具有完全相同的效果。

Salsa20 擴展函式通過限制攻擊者對雜湊函式輸入的控制來消除這種移位結構。特別是,輸入對角線始終為 0x61707865、0x3320646e、0x79622d32、0x6b206574,這與它的所有非平凡移位不同。換句話說,具有該對角線的兩個不同陣列總是在移位群下的不同軌道上。

類似地,Salsa20 散列函式操作幾乎與每個輸入字旋轉 10 位兼容。旋轉改變了跨越旋轉邊界的進位的效果,但它與所有其他進位一致,並且與除加法之外的 Salsa20 操作一致。

Salsa20 擴展功能也消除了這種旋轉結構。輸入對角線不同於其所有非平凡移位及其所有非平凡旋轉及其非平凡旋轉的所有非平凡移位。換句話說,具有此對角線的兩個不同陣列始終位於移位/旋轉組下的不同軌道中。

另一個相關文件是對“關於 Salsa20 核心功能”的有點粗魯的回應

SipHash 與 Salsa20 共享一些設計原則,並具有類似的常數。SipHash論文解釋了值的選擇:

常數的選擇。

初始狀態常量對應於大端編碼的 ASCII 字元串“somepseudorandomlygeneratedbytes”。這個值沒有什麼特別之處;唯一的要求是一些不對稱,以便初始 $ v_0 $ 和 $ v_1 $ 與……不同 $ v_2 $ 和 $ v_3 $ .

這個常數可以設置為“個性化字元串”,但我們還沒有評估它是否可以安全地選擇為“調整”。請注意,初始化常量的兩個非零字與四個字一樣安全。


將這個魔術字元串更改為不同的值是否有意義?

保持不變。可能在一些罕見的情況下自定義常量很有用,但通常您不應該這樣做。

在回答 CurveCP 郵件列表上的一個問題時,伯恩斯坦寫道

> > 是否有針對每個應用程序自定義 sigma 的建議? > > >

不。

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