简体   繁体   English

Java - 解密:javax.crypto.BadPaddingException

[英]Java - Decryption : javax.crypto.BadPaddingException

I get this warning:我收到此警告:

javax.crypto.BadPaddingException: Given final block not properly padded. javax.crypto.BadPaddingException:给定的最终块未正确填充。 Such issues can arise if a bad key is used during decryption.如果在解密过程中使用了错误的密钥,则可能会出现此类问题。

Any ideas what causes this?任何想法是什么原因造成的? Here are my encryption and decryption code.这是我的加密和解密代码。 I have looked at a variety of different answers on StackOverflow but I was unable to find one that actually works.我在 StackOverflow 上查看了各种不同的答案,但找不到真正有效的答案。

    private static Cipher ecipher;
private static Cipher dcipher;

private static SecretKey key;

public static void Menu() {
    try {

        // generate secret key using DES algorithm
        key = KeyGenerator.getInstance("DES").generateKey();

        ecipher = Cipher.getInstance("DES");
        dcipher = Cipher.getInstance("DES");

        // initialize the ciphers with the given key
        ecipher.init(Cipher.ENCRYPT_MODE, key);

        dcipher.init(Cipher.DECRYPT_MODE, key);

    } catch (NoSuchAlgorithmException e) {
        System.out.println("No Such Algorithm:" + e.getMessage());
        return;
    } catch (NoSuchPaddingException e) {
        System.out.println("No Such Padding:" + e.getMessage());
        return;
    } catch (InvalidKeyException e) {
        System.out.println("Invalid Key:" + e.getMessage());
        return;
    }
}

public static String encrypt(String WordToEncrypt) {

    Menu();
    try {

        // encode the string into a sequence of bytes using the named charset
        // storing the result into a new byte array. 
        byte[] utf8 = WordToEncrypt.getBytes("UTF8");

        byte[] enc = ecipher.doFinal(utf8);

        // encode to base64
        enc = BASE64EncoderStream.encode(enc);
        System.out.println(new String(enc));

        return new String(enc);

    } catch (Exception e) {

        e.printStackTrace();

    }
    return null;
}

public static String decrypt(String WordToDecrypt) {
    Menu();
    try {
        // decode with base64 to get bytes
        byte[] dec = BASE64DecoderStream.decode(WordToDecrypt.getBytes());
        byte[] utf8 = dcipher.doFinal(dec);
        return new String(utf8, "UTF8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}

} }

You call Menu once in the encryption code and once in the decryption code.您在加密代码中调用Menu一次,在解密代码中调用一次。 Since you generate the key randomly for both encryption and decryption, the key will differ and your code will fail.由于您为加密和解密随机生成密钥,因此密钥会有所不同并且您的代码将失败。

Don't keep Cipher instances around, preferably not even in fields, but certainly not in class fields.不要保留Cipher实例,最好不要放在字段中,但绝对不要放在类字段中。 DES is old; DES 是旧的; too old.旧了。 Use AES - using DES isn't any easier than AES.使用 AES - 使用 DES 并不比 AES 容易。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM