【问题标题】:java aes javax.crypto.BadPaddingException: Given final block not properly paddedjava aes javax.crypto.BadPaddingException:给定最终块未正确填充
【发布时间】:2014-10-23 14:04:12
【问题描述】:
public class AES {

    public String getEncrypt(String pass){
        String password = encrypt(pass);
        return password;
    }

    public String getDecrypt(String pass){
        String key = "AesSEcREtkeyABCD";
        byte[] passwordByte = decrypt(key,pass);
        String password = new String(passwordByte);
        return password;
    }

    private byte[] decrypt(String key, String encrypted) {
        try {
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(skeySpec.getEncoded(), "AES"));
            //getting error here
            byte[] original = cipher.doFinal(encrypted.getBytes());
            return original;
        } catch (IllegalBlockSizeException ex) {
            ex.printStackTrace();
        } catch (BadPaddingException ex) {
            ex.printStackTrace();
        } catch (InvalidKeyException ex) {
            ex.printStackTrace();
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } catch (NoSuchPaddingException ex) {
            ex.printStackTrace();
        }
        return null;
    } 

    private String encrypt(String value) {
        try {
            byte[] raw = new byte[]{'A', 'e', 's', 'S', 'E', 'c', 'R', 'E', 't', 'k', 'e', 'y','A','B','C','D'};
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            byte[] encrypted = cipher.doFinal(value.getBytes());
            System.out.println("encrypted string:" + (new String(encrypted)));
            return new String(encrypted);
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } catch (IllegalBlockSizeException ex) {
            ex.printStackTrace();       
        } catch (BadPaddingException ex) {
            ex.printStackTrace();
        } catch (InvalidKeyException ex) {
            ex.printStackTrace();
        } catch (NoSuchPaddingException ex) {
            ex.printStackTrace();
        }
        return null;
    }

** 每当我解密时,我都有一个空指针。有时它给了我正确的解密密码,但有时它给了我一个空指针。猜不出问题出在哪里**

【问题讨论】:

    标签: java encryption nullpointerexception aes


    【解决方案1】:

    您正在混合字符串和字节数组。这并不总是一件好事。至少指定用于字节到字符转换的字符集。即便如此,它也不是 100% 安全的。最好将字符串视为字符串,将字节数组视为字节数组。

    如果这不能解决问题,那么有很多事情会导致“Bad Padding”错误。基本上任何导致最后一个块的结尾与预期的填充不匹配的东西都会引发错误。可能的原因包括:不正确的填充设置、不正确的密钥、损坏的密文等。

    要尝试诊断问题,请将解密端设置为 NoPadding。这将接受任何内容,并允许您检查输出:

    • 完全垃圾:您可能在密钥或不同模式设置中有错误。

    • 第一块垃圾:你可能有键错误或IV错误。

    • 最后一个块垃圾:可能是密文文件的损坏端。

    • 一个正确的解密,最后有一些奇怪的字节:奇怪的字节是填充。

    如果它真的只是填充,那么将解密函数设置为期望那种填充。否则,请检查密钥/IV/密文是否逐字节在加密和解密时都相同。

    诊断后设置填充模式是重要NoPadding 不安全。

    【讨论】:

    • "NoPadding" 仅对 RSA 不安全。 "NoPadding" 比对称密码的填充稍微安全,因为填充预言不再可能。当然,像 CBC 这样的模式在没有填充的情况下功能会少很多。
    • NoPadding 对于某些形式的传输损坏也不安全。如果预期某种形式的填充,最后一个块中的任何传输错误或传播到最后一个块的任何传输错误都将触发BadPaddingExceptionNoPadding 将忽略所有此类异常。您付钱,然后做出选择。
    • 我想我们会在这里保持分歧。但是我已经投了赞成票,其余的答案似乎确实让艾伦满意,所以没关系:)
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2018-08-17
    相关资源
    最近更新 更多