[英]Java How to check value is already AES encrypted;
我創建了一個使用AES加密來加密表數據的工具。
加密方法
public String encrypt(String plainText) throws Exception {
byte[] cipherBytes = null;
log.info("Started encryption...");
System.out.println("value before encryption :" + plainText);
log.info("value before encryption :" + plainText);
if (plainText != null && !plainText.isEmpty()) {
if (cipher != null && key != null) {
byte[] ivByte = new byte[cipher.getBlockSize()];
IvParameterSpec ivParamsSpec = new IvParameterSpec(ivByte);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParamsSpec);
cipherBytes = cipher.doFinal(plainText.getBytes());
log.info("Completed encryption.");
log.info("Encrypted data : " + new String(cipherBytes, "UTF8"));
System.out.println("value after encryption" + Hex.encodeHexString(cipherBytes));
log.info("value after encryption" + Hex.encodeHexString(cipherBytes));
return Hex.encodeHexString(cipherBytes);
} else {
log.info("Encryption failed, cipher, key is null.");
throw new RuntimeException(
"Encryption failed, cipher, key is null.");
}
}
return plainText;
}
我想避免雙重加密我的表數據。 我想檢查現有記錄是否已加密。 有沒有辦法檢查這個?
加密后,添加一些前綴,如AES:
. 解密時,檢查是否存在前綴(並明顯刪除它)。
大量的密碼實現做類似的事情,其中前幾個字節識別算法。
與任何良好的加密方案一樣,只有密鑰必須是秘密的。 該算法可以公開而不會影響安全性。
唯一的邊緣情況是真正的明文以前綴開頭。 如果您認為這值得考慮,那么您可以通過選擇不太可能的前綴(可能利用明文知識)來降低風險。 為了進一步保證,您可以查看輸入的長度,因為真密文的長度保證是塊大小的倍數。
我同意邁克爾的觀點,最好在密文前加上一些標記。 但是如果你不能這樣做,還有一種概率方法:
您無法100%確定地識別原始加密數據。 但根據您的明文,您可以確定它是否未加密。 例如,MSB可以識別ASCII文本。 由於密文應該與隨機噪聲無法區分,因此加密數據不太可能具有相同的模式。
如果10個連續字節的MSB設置為零,則它成為密文的幾率僅為2 -10 ,即小於0.1%。
但畢竟您將密文編碼為十六進制字符串,因此您需要在分析期間將其反轉。
如果您的明文恰好是壓縮數據,那么可能性不大,因為熵幾乎與加密甚至隨機數據一樣高。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.