AES加密和解密数据丢失

时间:2016-05-25 16:10:53

标签: java encryption cryptography aes

当我尝试使用AES ECB加密密钥的MD5哈希时, 然后解密它我会得到不同的结果:

之前:>•ly†lrœËGQ2¶€€

之后:0 | t < d)§¥> B,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;
    }
}

2 个答案:

答案 0 :(得分:1)

这不起作用:

String encrypted= new String(encoded);

encoded中的密文字节是伪随机乱码。无论您的平台默认是什么,它们都不太可能形成有效的文本编码。

如果您需要文本表示,请使用base-64编码:

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

这是一个常见的错误,虽然它以不同的方式表现出来,因此“问题”是多种多样的,难以识别为重复。 Here's another answer更详细。

答案 1 :(得分:-1)

如果在加密实现中将字符串与十六进制或二进制文件组合在一起,则转换可能会失败。