Почему шифрование в одном классе Java и дешифрование в другом вызывает BadPaddingError? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть тестовая функция, которая возвращает байт [] в одном классе Java, FirstClass:

public static byte[] testA(){
        CipherClass crypto = new CipherClass();
        byte[] a = crypto.encrypt("helloWorld");
        return a;
    }

Где CipherClass содержит мои java.crypto.Cipher методы для шифрования и дешифрования входных данных.

В другом классе Java, SecondClass, я создаю экземпляр моего предыдущего FirstClass и вызываю его метод testA (), который сохраняю в переменную byte[], а затем пытаюсь расшифровать его:

FirstClass fc = new FirstClass();
byte[] b = fc.testA();
System.out.println(crypto.decrypt(b)); //Outputs BadPaddingError

Почему шифрование строки в одном файле Java и последующая передача результирующего байта [] в другой файл Java для его расшифровки приводит к ошибке BadPaddingError?

Что можно сделать, чтобы обойти это?

Почему только Шифр ​​ работает , если и шифрование и дешифрование находятся в одном классе следующим образом?

CipherClass crypto = new CipherClass();
byte[] a = crypto.encrypt("helloWorld"); //Outputs [B@5474c6c
byte[] b = a;
System.out.println(crypto.decrypt(b));  //Outputs "helloWorld"

РЕДАКТИРОВАТЬ: Мой CipherClass код, как требуется ниже.

SecretKey и IVParameterSpec генератор:

public List<KeyGenerator> getKeyGenerator(){

        List<KeyGenerator> list = new ArrayList<KeyGenerator>();
        KeyGenerator keyGenerator;
        int keyBitSize = 128;

        try 
        {
            SecureRandom secureRandom = new SecureRandom();
            keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(keyBitSize, secureRandom);

            list.add(keyGenerator);

            return list;
        } 
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }

        return list;
    }

    public List<SecretKey> getSecretKey(List<KeyGenerator> keygen) {

        List<SecretKey> list = new ArrayList<SecretKey>();
        KeyGenerator keyGenerator;
        SecretKey secretKey;

        keyGenerator = keygen.get(0);
        secretKey = keyGenerator.generateKey();

        list.add(secretKey);

        return list;
    }

    public List<IvParameterSpec> getIvSpec(List<SecretKey> secretKey) {

        List<IvParameterSpec> list = new ArrayList<IvParameterSpec>();
        Cipher cipher;

        byte[] iv;

        try 
        {
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            iv = new byte[cipher.getBlockSize()];           
            IvParameterSpec ivSpec = new IvParameterSpec(iv);

            list.add(ivSpec);
        } 

        catch (NoSuchAlgorithmException e) 
        {       
            e.printStackTrace();
        } 

        catch (NoSuchPaddingException e) 
        {
            e.printStackTrace();
        }

        return list;
    }

    List<KeyGenerator> kgList = getKeyGenerator();
    List<SecretKey> skList = getSecretKey(kgList); //skList.get(0) is the SecretKey
    List<IvParameterSpec> ivList = getIvSpec(skList); //ivList.get(0) is the IVParameterSpec

Мой encrypt() метод:

    public byte[] encrypt(String inputStr) {

            Cipher cipher;

            SecretKey secretKey = skList.get(0);
            IvParameterSpec ivSpec = ivList.get(0);

            byte[] plainText;
            byte[] cipherText = new byte[]{};       

            try 
            {
                cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

                try 
                {
                    secretKey = skList.get(0);
                    ivSpec = ivList.get(0);
                    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);                

                    try 
                    {
                        plainText = inputStr.getBytes("UTF-8");

                        cipherText = cipher.doFinal(plainText);

                        return cipherText;
                    }

                    catch (IllegalBlockSizeException e) 
                    {
                        e.printStackTrace();
                    } 

                    catch (BadPaddingException e) 
                    {
                        e.printStackTrace();
                    }

                    catch (UnsupportedEncodingException e) 
                    {
                        e.printStackTrace();
                    }                
                } 

                catch (InvalidKeyException e) 
                {
                    e.printStackTrace();
                }

                catch (InvalidAlgorithmParameterException e1) 
                {
                    e1.printStackTrace();
                }
            } 

            catch (NoSuchAlgorithmException e) 
            {       
                e.printStackTrace();
            } 

            catch (NoSuchPaddingException e) 
            {
                e.printStackTrace();
            }

            return cipherText;
        }

Мой decrypt() метод:

public String decrypt(byte[] cipherText){
        Cipher cipherDe;

        SecretKey secretKey = skList.get(0);
        IvParameterSpec ivSpec = ivList.get(0);

        byte[] deciByte;

        String decryptText = "";

        try 
        {
            cipherDe = Cipher.getInstance("AES/CBC/PKCS5Padding");

            try 
            {           
                secretKey = skList.get(0);
                ivSpec = ivList.get(0);
                cipherDe.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);              

                try 
                {               
                    //De-cryption
                    deciByte = cipherDe.doFinal(cipherText);

                    decryptText = new String(deciByte);

                    return decryptText;
                }

                catch (IllegalBlockSizeException e) 
                {
                    e.printStackTrace();
                } 

                catch (BadPaddingException e) 
                {
                    e.printStackTrace();
                } 
            } 

            catch (InvalidKeyException e) 
            {
                e.printStackTrace();
            }

            //De-cryption
            catch (InvalidAlgorithmParameterException e1) 
            {
                e1.printStackTrace();
            }
        } 

        catch (NoSuchAlgorithmException e) 
        {       
            e.printStackTrace();
        } 

        catch (NoSuchPaddingException e) 
        {
            e.printStackTrace();
        }

        return decryptText;
    }
...