Algorithm-Design

加密軟體中的魔術常數是否有標准或被廣泛接受的約定?

  • April 19, 2017

靈感來自魔術“Nothing Up My Sleeve”數字 - Computerphile - YouTube$$ 5:31 $$. 如果您只需要一個常數來開始您的算法,並且該常數的值並不重要,那麼為什麼不制定一個廣為人知的約定來始終使用 Pi 或 Phi 或其他眾所周知的常數的數字呢?選擇任意數字似乎是不好的,因為它會引起對數字來源的懷疑,這可能導致一些人懷疑它們是因為未公開的弱點而被挑選出來的。

如果您只需要一個常數來開始您的算法,並且該常數的值並不重要,那麼為什麼不制定一個廣為人知的約定來始終使用 Pi 或 Phi 或其他眾所周知的常數的數字呢?

那麼為什麼不使用全零或全一呢?為什麼不使用使用者提供給我們的內容?

有一個笑話:標準的好處是我們有很多可供選擇。

通常有一些值應該具有特定的屬性,例如素數。然後你必須使用帶有該常量的 CSPRNG。為什麼不使用這個 CSPRNG,為什麼不使用那個。這個很簡單,這個更安全,這個更新,這個更完善等等。

簡而言之:因為它們在廣泛不同的環境中使用,我們通常有一些模糊的要求:

  • 有時它必須是任意長度且安全的(DH 安全素數生成)
  • 有時它必須是任意長度並且只是簡單常數 (HMAC)
  • 有時它必須是特定的長度並且具有高熵(AES)
  • 有時它必須完全獨立於我們在其他地方使用的另一個常量

最後一個要求可能是最差的。碰巧使用相同常數的兩種不同算法可能會產生干擾,並且由於您有一個標準,因此您會增加這種可能性。

即使您設法以某種方式實現了這一點,某些值也應該具有高熵,而有些值可以是簡單的任何東西。使它們有意義會降低您的算法的執行速度。

所有這一切,你獲得了 1% 的額外安全性,沒有人在算法中植入錯誤。可悲的是,IMO 這並沒有給我們太多,並且阻止了在保持安全性的同時更快的智能設計。

如果您只需要一個常數來開始您的算法,並且該常數的值並不重要,那麼為什麼不制定一個廣為人知的約定來始終使用 Pi 或 Phi 或其他眾所周知的常數的數字呢?

這是一個奇妙的問題,我覺得應該針對每一個密碼/排列提議。我無法找到一份研究論文來確切地建議應該使用什麼約定,因此人們可能仍在使用他們自己的臨時方法來生成常量。

我不知道官方標準,但一個被廣泛接受的約定似乎是選擇一些無害的數字(即 pi、phi、數字的平方根等),然後在它們上執行某種函式以提取輸出。所討論的功能可能就像選擇所提供數字的某些位一樣簡單。這似乎或多或少是生成常量的事實上的標準方式。

假設一個對稱基元,我個人主張將基元的線性層應用於遞增計數器以生成常數。

原因是因為它消除了生成常量的任何自由度,因為它總是在沒有設計者(即我)的選擇/輸入的情況下完成相同的操作。如果您可以假設線性層旨在生成高度不同的輸出,而不是旨在生成秘密的弱輸出/惡意常數(這可能會削弱設計的其餘部分),則沒有自由度。

此外,它重用了已經可用的資源:它需要更少的數據(沒有常量表),這意味著更低的儲存需求、更少的寄存器交換以及更少的程式碼。

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