2013-02-18 167 views
6

我從http://www.ravenblast.com/index.php/blog/android-password-text-encryption/得到了這段代碼,儘管它有效,但我越來越懷疑它不夠安全。根據其他來源,似乎沒有任何初始化向量。這種AES加密是否足夠安全?

public static String encrypt(String toEncrypt, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes()); 
    String encrypted = Base64.encodeBytes(encryptedBytes); 
    return encrypted; 
} 

public static String decrypt(String encryptedText, byte[ ] key) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
    byte[] toDecrypt = Base64.decode(encryptedText); 
    byte[] encrypted = cipher.doFinal(toDecrypt); 
    return new String(encrypted); 
} 
+2

你需要一個IV和MAC。在面對主動攻擊者時,在加密 - 然後MAC方案中使用MAC或使用專門的身份驗證加密非常重要。否則攻擊者可能會誘騙你爲他解密一條消息。填充神諭是一種實際的攻擊。如果這是歐洲央行(我對API的瞭解不夠熟悉),您還需要切換到更好的模式。 – CodesInChaos 2013-02-18 13:46:23

+2

使用'getBytes()'也不好,因爲它使用平臺/文化相關的編碼。改用UTF-8。 – CodesInChaos 2013-02-18 13:47:29

回答

9

是的,它不是很安全。沒有IV,因爲沒有塊鏈接

AES算法只能加密128個字節的塊,不管密鑰的大小(它是不相關的)。如何將這些街區鏈接在一起是另一個問題。最簡單的方法是將每個塊與其他塊分開加密(ECB mode),就像它們是單獨的消息一樣。我鏈接的維基百科文章告訴你何時和爲什麼這是不安全的,其他方法(即CBC mode)是首選。

當你做Cipher cipher = Cipher.getInstance("AES");你給了一個在ECB mode的AES密碼。沒有即時危險,但如果你的消息具有重複模式,這可能導致像以下幾種情況:

原文:enter image description here加密:encrypted