ChaCha20 僅使用一個或兩個測試向量是否足以驗證編碼算法?
為了驗證用 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 在設計密碼時通常會假設這種攻擊 - 但實現可能仍然容易受到攻擊。
綜上所述,在更廣泛的集合上執行你的實現永遠不會有壞處。只需使用任何現有的庫(或兩個獨立的庫)並自己生成大量向量。再次,關注邊緣情況;做一些模糊測試也永遠不會受到傷害。