Encryption 使用错误密码解密,最后一个块未正确填充

Encryption 使用错误密码解密,最后一个块未正确填充,encryption,aes,password-encryption,Encryption,Aes,Password Encryption,我有以下代码来定义一个密码类 import java.util.*; import javax.crypto.Cipher; import java.security.SecureRandom; import java.security.NoSuchAlgorithmException; import java.security.AlgorithmParameters; import javax.crypto.*; import javax.crypto.SecretKeyFactory; im

我有以下代码来定义一个密码类

import java.util.*;
import javax.crypto.Cipher;
import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;
import java.security.AlgorithmParameters;
import javax.crypto.*;
import javax.crypto.SecretKeyFactory;
import javax.crypto.SecretKey;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;

public class Cipher{
    private SecureRandom rand;
    private SecretKeyFactory kFact;
    private Cipher AESCipher;
    private SecretKey key;

    public Cipher(char[] mpw, byte[] salt){
            try{
                    kFact = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
                    rand = SecureRandom.getInstance("SHA1PRNG");
                    AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                    PBEKeySpec spec = new PBEKeySpec(mpw, salt, 1024, 256);
                    key = new SecretKeySpec(kFact.generateSecret(spec).getEncoded(),"AES");
            }catch(Exception e){
                    System.out.println("no such algorithm");
            }
    }
    /*Henc[k,m] will return c such that Hdec[k,HEnc[k,m]] = m
     */
    public ArrayList<byte[]> HEnc(byte[] message) throws Exception{
            ArrayList<byte[]> res = new ArrayList<byte[]>(2);
            AESCipher.init(Cipher.ENCRYPT_MODE ,key);
            AlgorithmParameters params = AESCipher.getParameters();
            byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
            byte[] ctxt = AESCipher.doFinal(message);
            res.add(0,iv);
            res.add(1,ctxt);
            return res;
    }
    public byte[] HDec(byte[] iv, byte[] cipher) throws Exception{
            AESCipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv) );
            System.out.println("decrypting");
            return AESCipher.doFinal(cipher);
    }
    /*public abstract byte[] HDec(SecretKey k, byte[] cipher);
    */

我猜这和我的静脉注射有关,但我不知道如何修复它。有人有什么建议吗?

AES是一种以16字节为单位加密的分组密码。填充用于填充加密前的最后一个块,因此它适合偶数个块

您正在使用以下命令指定PKCS5Padding

   AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
填充的创建方式使其能够在解密过程中被识别和删除。如果使用错误的密钥进行解密,密码将无法识别有效的pad,因此会出现
BadPaddingException

如果您在没有填充的情况下实例化decrypt
Cipher
(并因此自行承担该责任),您可以避免此异常

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:420)
at javax.crypto.Cipher.doFinal(Cipher.java:1966)
at HCipher.HDec(HCipher.java:54)
at testCipher.main(testCipher.java:52)
   AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");