2016-06-08 77 views
-2

我有String s="abc"; 加密字符串顯示爲:ðá£ÅÉûË¿~?‰+×µÚ 並解密了相同的值。如何解密java中的加密字符串

但現在我有和ðá£ÅÉûË¿~?‰+×µÚ一樣的加密字符串,我可以得到/解密它嗎?下面的代碼我正在使用。

String key = "Bar12345Bar12345"; // 128 bit key 
// Create key and cipher 
Key aesKey = new SecretKeySpec(key.getBytes(), "AES"); 
Cipher cipher = Cipher.getInstance("AES"); 
// encrypt the text 
cipher.init(Cipher.ENCRYPT_MODE, aesKey); 
byte[] encrypted = cipher.doFinal(text.getBytes()); 
String e=new String(encrypted); 
byte[] encrypted1 = cipher.doFinal(e.getBytes()); 
System.out.println(encrypted.length+" "+encrypted1.length); 
System.out.println(e); 
// decrypt the text 
cipher.init(Cipher.DECRYPT_MODE, aesKey); 
String decrypted = new String(cipher.doFinal(encrypted)); 
System.out.println(decrypted); 
+4

您的第一個錯誤是使用'Stri ng'作爲二進制數據的容器。事實並非如此。你應該在'byte []'中保存密文。 – EJP

+0

爲什麼你已經加密了兩次文本?一旦加密是好的 –

+0

[它適用於我](http://ideone.com/9FFpnC)。由於您沒有使用第二階段加密結果,因此您實際上不需要雙重加密。此外,字符串不能保存二進制數據。您需要將密文byte []'編碼爲Hex或Base64以使其可打印。 –

回答

4

您不應該嘗試從隨機的字節流中創建一個字符串。

如果您需要字符串表示形式的加密文本 - 使用一些二進制安全編碼,如java.util.Base64。

因此,沒有固定文本的加密部分(由別人評論),你必須做的是:

  1. 爲了編碼:

    String text = "abc"; 
    String key = "Bar12345Bar12345"; 
    Key aesKey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, aesKey); 
    byte[] encrypted = cipher.doFinal(text.getBytes()); 
    Base64.Encoder encoder = Base64.getEncoder(); 
    String encryptedString = encoder.encodeToString(encrypted); 
    System.out.println(encryptedString); 
    
  2. 爲了解碼:

    Base64.Decoder decoder = Base64.getDecoder(); 
    cipher.init(Cipher.DECRYPT_MODE, aesKey); 
    String decrypted = new String(cipher.doFinal(decoder.decode(encryptedString))); 
    System.out.println(decrypted); 
    
+0

thankx Oleg接受了答案。但是我使用Java7,所以Base64有問題。對於Base64,我發現sun.misc解決了這個問題。 – Joe