如果初始化向量已知,AES-GCM 會被破壞嗎?
我們在 GCM 塊模式下使用 AES 加密,以便加密移動設備 - Android 上的多種不同類型的靜態數據。
用於加密的密鑰儲存在 Android 提供的受保護密鑰庫中,因此我假設它的儲存非常可靠。但是,我們使用相同的 nonce/IV 來加密不同的數據。nonce/IV 儲存在共享首選項中,沒有任何加密。所以我假設它是不安全的,因為 root android 設備上的惡意應用程序可以進入共享首選項或其他應用程序。
我想了解的是 - 如果有人確實掌握了純文字隨機數/IV 和許多不同的加密消息(使用相同的密鑰加密),他們能否成功解密這些消息?
我們建議通過使用不同的隨機數來加密每條消息來改善這一點。但是,我不確定這是否仍會阻止某人在獲得純文字隨機數時解密該消息,即使只有一條消息用該隨機數加密。
這是相關的程式碼
public synchronized String encrypt(String input) throws SecurityException { try { Cipher c = getCipher(Cipher.ENCRYPT_MODE); byte[] encodedBytes = c.doFinal(input.getBytes("UTF-8")); return Base64.encodeToString(encodedBytes, Base64.DEFAULT); } catch (Exception e) { throw new SecurityException(e); } } public synchronized String decrypt(String encrypted) throws SecurityException { try { Cipher c = getCipher(Cipher.DECRYPT_MODE); byte[] decodedValue = Base64.decode(encrypted.getBytes("UTF-8"), Base64.DEFAULT); byte[] decryptedVal = c.doFinal(decodedValue); return new String(decryptedVal); } catch (Exception e) { throw new SecurityException(e);
} }
但是,我們使用相同的 nonce/IV 來加密不同的數據。
不,不要那樣做
如果有人確實掌握了純文字 nonce/IV 和許多不同的加密消息(使用相同的密鑰加密),他們能否成功解密消息?
實際上,他們是否知道 nonce 並不重要。如果他們用相同的隨機數加密了兩條消息,那麼他們可以計算兩個明文的異或。根據明文的性質,攻擊者通常足以推斷出原始明文的內容。鑑於攻擊者有兩個以上來自同一個 nonce 的消息,好吧,這對他來說更容易。
此外,知道兩個具有相同隨機數的消息,則可以推斷出內部值 $ H $ 到 GCM;這將允許他生成自己的加密消息,這些消息將通過驗證(因此 GCM 的身份驗證部分消失了)。
我們建議通過使用不同的隨機數來加密每條消息來改善這一點。但是,我不確定這是否仍會阻止某人在獲得純文字隨機數時解密該消息,即使只有一條消息用該隨機數加密。
那絕對更好。攻擊者是否知道隨機數無關緊要。這種知識不允許他推斷出任何關於明文的東西。在實踐中,我們通常只是在密文前面加上隨機數,因為這是將隨機數傳遞給解密器的最簡單方法。重要的是你永遠不會使用相同的 nonce 兩次*。*