2016-05-25 140 views
0

當我嘗試使用AES ECB,加密鑰匙的MD5哈希 ,又重新將其解密,我得到不同勢的結果:AES加密和解密數據丟失

以前:>•LY†lrœËGQ2¶ª€

:0|t < d)§¥>乙W¯¯

我用於加密的代碼和解密是:

public class AES { 
    private String a= "AES/ECB/NoPadding"; 
    private byte[] key; 
    Cipher c; 
    public AES(byte [] key) throws NoSuchAlgorithmException, NoSuchPaddingException{ 
      this.key = key; 
      c = Cipher.getInstance(a); 
     } 
public String encrypt(byte[] Data) throws Exception{ 
     Key k = new SecretKeySpec(key, "AES"); 
     c.init(Cipher.ENCRYPT_MODE, k); 
     byte[] encoded = c.doFinal(Data); 
     String encrypted= new String(encoded); 
     return encrypted; 

    } 
public String decrypt(byte[] v) throws Exception{ 
     Key k = new SecretKeySpec(key, "AES"); 
     if(v.length%16!=0) 
      return null; 
     c.init(Cipher.DECRYPT_MODE, k); 
     byte[] decv = c.doFinal(v); 
     String decrypted = new String(decv); 
     return decrypted; 
    } 
} 
+3

此操作丟失信息:'字符串加密=新字符串(編碼);'。不要試圖將任意二進制數據編碼爲像這樣的文本。使用base64或十六進制。 –

+0

非常感謝!那是導致損失的線路 –

回答

1

這不起作用:

String encrypted= new String(encoded); 

encoded的密文字節是僞隨機亂碼。無論您的平臺默認設置如何,它們都不太可能形成有效的文本編碼。

如果你需要一個文本表示,使用基於64位編碼:

String encrypted = Base64.getEncoder().encodeToString(encoded); 

這是一個常見的錯誤,雖然它以不同的方式體現,因此,「問題」是多種多樣的,很難確定爲重複。 Here's another answer更詳細。

-1

如果在加密實現中將字符串與十六進制或二進制組合在一起,轉換將失敗是很有可能的。