Encryption
AES-GCM 密碼 - Nonce 與 IV
我正在使用一個名為 PyCryptodome 的 Python 庫,它為 AES-GCM 密碼提供以下 API:
https://pycryptodome.readthedocs.io/en/latest/src/cipher/aes.html
如您所見,IV 不適用於 GCM 密碼。
有一些 C++ 庫希望使用者指定 IV 而不是隨機數。
假設我收到一條使用 16 位 IV 的 C++ 庫加密的消息。稍後,我想使用 Python 庫解碼此消息。鑑於我知道所使用的密鑰和 IV,當我將 nonce 指定為 IV 時,我是否能夠正確破譯消息?
AES-GCM 參數的術語對於任何單個密鑰在消息之間必須是唯一的,有時稱為“nonce”,有時稱為“IV”。
- AES-GCM的安全合約只要求這永遠不會重複,因此將其稱為nonce是合適的,意思是使用一次的數字。
- 相反,例如,對於 AES-CBC,有一個 128 位字元串的參數必須事先對對手是不可預測的,通常稱為初始化向量。
這就是 PyCryptodome 在區分“nonce”和“IV”時所得到的區別——儘管它對 AES-CFB 和 AES-OFB 也說“IV”,而實際上它們只是採用 nonce。但是,在其他一些API 中,相應的參數總是只稱為 IV。為了自信起見,您應該使用兩個不同的庫(例如您想到的 C++ 庫之一)起草一些程式碼,並確保它們可以互操作,並包括具有固定鍵、隨機數和消息的已知答案測試,作為測試案例在你的程式碼中。
警告: AES-GCM最好使用 96 位(12 字節)隨機數順序選擇作為消息序列號。如果您使用 128 位(16 字節)隨機數——正如 PyCryptodome 文件錯誤地建議的那樣——就好像你隨機選擇了一個 96 位隨機數*,*這意味著,由於隨機數衝突的危險,有與順序選擇 96 位隨機數相比,消息數量的限制要小得多。