使用多個密鑰的 AES 加密
我想使用多個密鑰的組合來加密一些數據。將有兩個密鑰:將為每個客戶端生成的客戶端密鑰和每個人都使用的單個伺服器/應用程序密鑰。這個想法是只有在我們擁有兩個密鑰的情況下才能加密/解密數據。所以伺服器和客戶端都不能單獨解密數據。
我知道我可以簡單地使用客戶端密鑰加密數據,然後使用伺服器密鑰加密數據,但我想知道是否可以組合密鑰以創建通用解密密鑰,因為我不喜歡多重加密……我已經研究了秘密共享,但是從我對加密++庫的實驗來看,我只能從一條消息中生成n 個密鑰(在我的情況下,該消息將是合併的密鑰)。我寧願生成一個客戶端密鑰,然後將此客戶端密鑰與一個固定的伺服器密鑰合併,以生成用於加密的最終密鑰。
將密鑰異或在一起是一個好的解決方案嗎?(我相信如果他們兩個在同一個位置有相同的字元,它會降低最終密鑰的加密強度……)
另外,在這種情況下,我只能對兩個鍵使用一個 IV 嗎?IV 當然會為每個客戶隨機生成。
你在上面問了幾個問題。我將具體解決一個對我來說很突出的問題,那就是您關於將密鑰異或在一起的問題。您說它們可能在同一位置具有相同字元會產生空字節的說法令人不安:密碼通常不直接用作加密密鑰。
從數學上講,一串八個零位不會降低 AES 的強度,因為 AES 沒有任何已知的弱密鑰。但是,如果攻擊者知道您將直接使用 ASCII 字元作為密鑰材料,那麼他的攻擊工作就會變得容易得多,因為他了解這種限制所施加的限制。
如果您使用 ASCII 字元作為密鑰,則需要告訴您的客戶他們必須使用 16 個字元的密碼,這將限制他們的創造力(大大減少他們可能選擇的密碼池。)ASCII 嚴重限制了位數可以在給定字節中更改:很少有人可以在鍵盤上輸入超出常用字母、數字和符號範圍的字元。通過限制鍵字節以排除 0x00-0x1F 和 0x80-0xFF 範圍內的值,您人為地將鍵限制為 $ 96^{16} $ 代替 $ 256^{16} $ . 這會危險地削弱您的實施。
考慮使用密鑰派生函式將密碼轉換為加密密鑰。這種算法結合了輸入的所有位並產生所需長度的密鑰。通過使用密鑰派生函式,您可能需要一個最少 64 個字元的密碼,並結合所有這些材料來生成一個更強大的密鑰 - $ 96^{64} $ 明顯強於 $ 96^{16} $ .