【问题标题】:Given final block not properly padded AES给定最终块未正确填充 AES
【发布时间】:2013-04-08 16:40:16
【问题描述】:

我正在加密一个字符串并将其存储在客户端的 cookie 中。但是当我将确切的加密字符串从 js 发送到 java 代码时,它给了我上述异常。

我用于加密和解密的代码是:

public static final String UNICODE_FORMAT = "UTF8";

public static String encrypt(String Data, SecretKeySpec skeySpec,IvParameterSpec ivspec) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
        byte[] plainBytes = Data.getBytes(UNICODE_FORMAT);
        byte[] encrypted = cipher.doFinal(plainBytes);
        String encryption = bytesToString(encrypted);
        return encryption;
}

public static String decrypt(String encryptedData,SecretKeySpec skeySpec,IvParameterSpec ivspec) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
    byte[] decryptval = hexToBytes(encryptedData);
    byte[] decrypted = cipher.doFinal(decryptval);
    return new String(decrypted);
}

public static String bytesToString(byte[] bytes) {
    HexBinaryAdapter adapter = new HexBinaryAdapter();
    String s = adapter.marshal(bytes);
    return s;
}

public static byte[] hexToBytes(String hexString) {
    HexBinaryAdapter adapter = new HexBinaryAdapter();
    byte[] bytes = adapter.unmarshal(hexString);
    return bytes;
}

你能告诉我可能是什么问题吗?我已经尝试了 stackoverflow.com 上提到的解决方案以及其他一些解决方案,但都没有成功。我收到此错误是因为我将加密字符串发送到 JS 并且它正在更改字符串的填充?

【问题讨论】:

  • 在服务器端同时运行 encypt / decrypt 是否有效?
  • 是的,它确实可以工作......问题只是当我从javascript返回它时
  • new String(decrypted, UNICODE_FORMAT) 但这不可能是错误。

标签: java javascript aes encryption


【解决方案1】:

正如@JoopEggen 提到的 - 从 byte[] 创建 sting 可以破坏它。

你可以只序列化,而不是从中创建字符串吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2015-05-22
    • 2011-12-24
    • 2015-10-07
    • 2011-05-16
    相关资源
    最近更新 更多