TLDR;在使用 AES 加密的 Java 中,如何將加密訊息打包在一起以通過單個解密呼叫進行解密?
我在 android 聊天應用程式中使用 AES 加密,當解密多條訊息(使用相同的密鑰)時,程式變得非常慢,以至于我必須使用多執行緒,因此它不會凍結系統。
我知道有一種方法可以將加密訊息打包在一起以一次解密它們,這應該更快,但我在網上找不到任何關于如何在 Java/Kotlin 中執行此操作的資訊。我能想到的唯一方法是將明文與分隔符一起附加并加密它,但我需要更改我的資料庫以存盤包含大文本欄位的單個記錄,并且我的教授明確表示無法進行更改第 4 周之后,現在是第 6 周。有沒有其他方法可以通過已經加密的訊息串列來實作這一點?
編輯 - 這是為每條訊息呼叫的解密函式:
private String decrypt(String strToDecrypt, String secretKey, String username) {
try {
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), username.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec newSecretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, newSecretKey, ivspec);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
} catch (Exception e) {
System.out.println("Error while decrypting: " e.toString());
}
return null;
}
uj5u.com熱心網友回復:
基于密碼的密鑰派生函式被設計為昂貴的(以防止暴力破解),但您在每次解密時都執行該昂貴的函式。
密鑰派生將主導您的運行時間。AES 部分可能很小。由于secretKey并且username很可能對于多條訊息是相同的,因此只要密鑰和用戶名保持不變,您就應該派生一次密鑰并使用快取的密鑰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497585.html
上一篇:使用陣列加速For回圈
