如何确保加密数据被正确解密?

时间:2016-06-18 15:48:05

标签: java encryption

我需要通过REST发送一些加密数据。我的crypter / decrypter类如下:

public class AesCrypter {
    static String IV = "AAAAAAAAAAAAAAAA";
    static String aesKey = "0123456789abcdef";

    public static byte[] encrypt(String unecryptedText) throws Exception {
        Cipher encrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
        SecretKeySpec key = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
        encrypt.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        return encrypt.doFinal(unecryptedText.getBytes("UTF-8"));
    }

    public static String decrypt(String cryptedText) throws Exception{
        byte[] bytes = cryptedText.getBytes(StandardCharsets.UTF_8);
        Cipher decrypt = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
        SecretKeySpec key = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
        decrypt.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        return new String(decrypt.doFinal(bytes),"UTF-8"); // this line
    }
}

但是我在解密方法上获得javax.crypto.BadPaddingException: Given final block not properly padded,控制台指出错误在我用// this line评论的行上。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

Actual Scenerio of PKCS5-Padding causes javax.crypto.BadPaddingException

如果你试图用错误的密钥解密PKCS5填充的数据,然后取消它(它由Cipher类自动完成),你很可能会得到BadPaddingException(可能略低于255/256,大约99.61%),因为填充有一个特殊的结构,在unpad期间验证,很少的键会产生有效的填充。

所以,如果你得到这个例外,抓住它并将其视为"错误的密钥"。

当您提供错误的密码时,也会发生这种情况,然后密码用于从密钥库获取密钥,或者使用密钥生成功能将密钥转换为密钥。

当然,如果您的数据在传输中被破坏,也可能发生填充错误。

所以你可以关注Base64:

import org.apache.commons.codec.binary.Base64;


 public static String base64Encode(String token) {
    byte[] encodedBytes = Base64.encode(token.getBytes());
    return new String(encodedBytes, Charset.forName("UTF-8"));
}


public static String base64Decode(String token) {
    byte[] decodedBytes = Base64.decode(token.getBytes());
    return new String(decodedBytes, Charset.forName("UTF-8"));
}

资源链接:

  1. Base64 Encoding in Java