[英]How to check if a string is encrypted or not?
我正在使用這種加密方法來加密和解密某個字符串:-
package encryption;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AES {
private static final String ALGO = "AES";
private static final byte[] keyValue =
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
return encryptedValue;
}
public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
它工作正常。
問題是我如何知道要解密的字符串是加密的?
我的意思是我可以將一個長的“未加密”字符串傳遞給解密方法,它仍然可以工作。
有什么建議。
沒有確定的方法可以說明; 你唯一能做的就是查看一個字符串,看看它是否看起來像一些可以理解的東西(粗略地說, file
會返回比“數據”更具體的東西)。 除非您有一些特征可以用來識別“純文本”(可能一切都是 ASCII,或者 $LANGUAGE 的所有 Unicode 代碼點),否則密文和任意二進制數據之間沒有內在的區別。
您可以通過簡單地嘗試解密來確定某些內容是否使用特定的密鑰、算法、模式和填充方案加密。
如果您正在解密數據,您就知道所使用的填充方案,並且您可以在嘗試解密時驗證填充是否正確。 如果您不能可靠地從原始消息中去除填充,您就知道有問題!
CBC 模式的好處之一是幾乎所有包含對稱密碼(如 AES)的廣泛使用的密碼庫都支持該模式,因為每個塊的數據都依賴於前一個塊。 這意味着錯誤會傳播,並且您更有可能無法解密實際上未加密或以某種方式意外損壞的數據。
我相信這可能是您的代碼行測試傳入的數據是否使用特定密鑰、算法、模式和填充方案加密的最佳方法。
編輯
但是,如果您需要高度確定地驗證密鑰是否正確,則需要在密文或明文的末尾添加消息驗證碼 (MAC)。
你可以像這樣形成你的消息:
CIPHERTEXT = ENCRYPT(KEY_1, PADDING, MODE, PLAINTEXT)
MESSAGE = CIPHERTEXT || HMAC(KEY_2, CIPHERTEXT)
CIPHERTEXT
定義為在特定密鑰、填充和操作模式下對明文進行加密的結果
MESSAGE
被定義為CIPHERTEXT
將HMAC
結果二進制連接 ( ||
) 到它的結果。
KEY_1
是獨立於KEY_2
加密安全密鑰,另一個加密安全密鑰。
您想要針對CIPHERTEXT
計算HMAC
的CIPHERTEXT
是因為您不想實際執行解密來驗證消息是否合法。
您必須啟動一個加密會話,然后通過該加密通道交換KEY_2
,這意味着您增加了密鑰管理開銷和代碼復雜性,但您有 1/1^256(至少)看到錯誤消息傳遞的可能性通過HMAC
檢查。
一旦您驗證了HMAC
的結果,您就可以確定消息實際上可能是在KEY_1
下加密的,假設自會話開始或消息的生命周期以來沒有發生泄漏。
這個問題沒有完美的答案,因為沒有 100% 確定的方法來知道某些東西是否被加密。 然而,它應該隨機分布在所有可能的 base64 字符串中,這意味着它應該看起來與純文本有很大不同。 區分 english 和 base64 加密字符串的一種方法是查看有多少空格。
這篇文章有92個空格,但是base64中沒有出現字符空格。 如果你正在處理明文英語以外的東西,它會變得更有趣。
當然可能,假設字符串足夠長。 那些家伙正在檢測內存轉儲中的加密密鑰。 當然,沒有 100% 保證 - 簡單的例子,您可以對編碼的字符串進行編碼,因此您的輸入看起來已經像一個鍵。
通常,加密、編碼或散列的字節序列看起來像隨機序列。 它們具有更高的熵,位的分布更均勻,您無法壓縮它們等。
最好的嘗試是分析位分布的隨機性。 對於 BASE64,您只分析 6 位等。
您似乎正在使用對稱加密/解密方案,其中雙方可以使用相同的密鑰加密和解密消息,只有他們知道。
雙方可以就正確性驗證方法達成一致,例如CRC。
與必須保密的密鑰不同,這種方法可以公開宣布。
只有密鑰的所有者才能生成真實的加密字符串,解密后可以使用此方法對其進行驗證。
發送到解密的任何其他字符串都將無法通過 CRC 測試。
順便說一句,身份驗證方法通常是散列算法,例如 SHA、HMAC 等。由於其性質,CRC 通常更容易受到選擇密文攻擊,其中惡意方生成隨機字符串希望其中一些會被檢測到作為正品。
大多數加密文本包含“ ”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.