Chacha

ChaCha20 僅使用一個或兩個測試向量是否足以驗證編碼算法?

  • July 19, 2021

為了驗證用 VB.NET 編寫的 ChaCha20 加密/解密算法,我正在尋找更多基於 ChaCha20 最終規範的 ChaCha20 測試向量,可以在此處找到。請參閱第 2.3.2 小節中的測試向量。這個測試向量驗證了我的程式碼,它提供了測試向量中指定的確切結果。(文件後面有一個幾乎相同的向量,兩個具有不同計數器的塊,也可以完美地驗證)。

我在 ChaCha20 規範草案中找到的測試向量沒有給出與這些草案規範測試向量中指定的完全相同的結果。與最終規範(草案 64 位,最終 96 位)相比,它們使用了不同大小的隨機數,並且未指定計數器的狀態(我假設它為 0)。

當然,問題是如果只有一兩個測試向量就足以驗證加密算法是如何編碼的,我的直覺是更多是非常可取的,但作為一個真正的密碼學業餘愛好者。

最好有更多基於最終 ChaCha20 規範的測試向量,以確保程式碼提供所需的準確結果。謝謝!

   2.3.2.  Test Vector for the ChaCha20 Block Function

  For a test vector, we will use the following inputs to the ChaCha20
  block function:

  o  Key = 00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:
     14:15:16:17:18:19:1a:1b:1c:1d:1e:1f.  The key is a sequence of
     octets with no particular structure before we copy it into the
     ChaCha state.

  o  Nonce = (00:00:00:09:00:00:00:4a:00:00:00:00)

  o  Block Count = 1.

  After setting up the ChaCha state, it looks like this:

  ChaCha state with the key setup.

      61707865  3320646e  79622d32  6b206574
      03020100  07060504  0b0a0908  0f0e0d0c
      13121110  17161514  1b1a1918  1f1e1d1c
      00000001  09000000  4a000000  00000000

  After running 20 rounds (10 column rounds interleaved with 10
  "diagonal rounds"), the ChaCha state looks like this:

  ChaCha state after 20 rounds

      837778ab  e238d763  a67ae21e  5950bb2f
      c4f2d0c7  fc62bb2f  8fa018fc  3f5ec7b7
      335271c2  f29489f3  eabda8fc  82e46ebd
      d19c12b4  b04e16de  9e83d0cb  4e3c50a2

  Finally, we add the original state to the result (simple vector or
  matrix addition), giving this:

  ChaCha state at the end of the ChaCha20 operation

      e4e7f110  15593bd1  1fdd0f50  c47120a3
      c7f4d1c7  0368c033  9aaa2204  4e6cd4c3
      466482d2  09aa9f07  05d7c214  a2028bd9
      d19c12b5  b94e16de  e883d0cb  4e3c50a2

我會說部分情況是這樣。由於輪次,即使是單個塊操作也會被多次操作。一個塊也不需要任何特殊的輸入:你有一個塊映射到一個輸出塊。

然而,這還不是完整的故事。首先,回合中的一些計算可能需要比平時更多的魔法。如果存在任何可能的邊緣情況,那麼這些情況可能不會由單個塊操作觸發。那些你應該單獨測試的。

更重要的是:雖然上面測試了塊操作,但它沒有測試流操作。這更有可能導致問題。問題是編碼/解碼(例如字節到字)和緩衝並不像許多人預期的那麼簡單。因此,例如,測試各種明文大小並確保update函式正確執行是有意義的。這與測試非加密函式沒有太大區別;例如,您會期望編碼/解碼操作和 I/O 也會出現同樣的問題。

我多次看到的一個問題是測試團隊忽略了實現本身。可以根據官方測試規范進行測試,但是如果做出了特定於實現的設計選擇,那麼這些也應該進行測試。舉個例子:即使所有官方測試都正常執行,一個實現也可能存在緩衝區溢出。我不會在這裡重複任何恐怖故事,但是…

最後,因為這是一個密碼學網站:如果您聲稱可以防止側通道攻擊,那麼您可能也應該測試這些。當然,您在這裡有點幸運,因為 Bernstein 在設計密碼時通常會假設這種攻擊 - 但實現可能仍然容易受到攻擊。


綜上所述,在更廣泛的集合上執行你的實現永遠不會有壞處。只需使用任何現有的庫(或兩個獨立的庫)並自己生成大量向量。再次,關注邊緣情況;做一些模糊測試也永遠不會受到傷害。

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