2016-05-25 145 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

如果在加密实现中将字符串与十六进制或二进制组合在一起,转换将失败是很有可能的。