javax.crypto.BadPaddingException:给定最终块未正确填充...尝试使用 getbytes( "UTF" )



我尝试添加getbytes("UTF")或getbytes("UTF-8"),因为它在类似的问题中被建议。它说我们需要在将字节转换为字符串时尝试 UTF,反之亦然。但它仍然不适用于我的代码...请帮忙

public class Password1 {
    private static final String ALGO = "AES";
    private static byte[] keyValue = new byte[]{'t','h','y','u','e','f','z','s','y','k','f','l','d','a','b','m'};
    public static void main(String[] args) {
        //Password1 p = new Password1();
        Scanner sc = new Scanner(System.in);
        String i = sc.nextLine();
        System.out.println("Password = "+i);
        try {
            String en = encrypt(i);
            System.out.println(en);
            String dec = decrypt(en);
            System.out.println("Encrypted = " + en);
            System.out.println("Decrypted = " + dec);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes("UTF-8"));
        String encrypted = new BASE64Encoder().encode(encVal);
        return encrypted;
    }
    public static String decrypt(String encrypted) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        //Byte bencrypted = Byte.valueOf(encrypted);
        byte[] decoded = new BASE64Decoder().decodeBuffer(encrypted);
        byte[] decValue = c.doFinal(decoded);
        String decrypted = new String(decValue);
        return decrypted;
    }
    private static Key generateKey() throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        keyValue = sha.digest(keyValue);
        keyValue = Arrays.copyOf(keyValue, 16);
        SecretKeySpec key = new SecretKeySpec(keyValue, ALGO);
        return key;
    }
}

调用encrypt()时,将密码替换为其哈希,然后将哈希用作密钥。

然后调用 decrypt() 并重新哈希,并使用哈希哈希作为键。因此,您没有使用相同的密钥进行加密和解密。

main()生成一次密钥,并将其作为参数传递给encrypt()decrypt()。让keyValue成为最终的。或者更好的是,使其成为 main 的局部变量。

Cipher.getInstance(ALGO) ALGO变量"AES/CBC/PKCS5Padding"(或要使用的任何其他模式和填充)的行上。这应该可以解决您可能遇到的任何填充问题,例如您现在的问题。

如果你不以这种方式这样做,我相信你必须自己处理所有的填充逻辑。

JB Nizet 关于如何生成密钥的回答是问题的另一半。

相关内容

  • 没有找到相关文章

最新更新