Вот то, что я делаю, что может показаться немного неуклюжим, но любая помощь в решении этой проблемы приветствуется. Я получаю BadPaddingException. Прочитал почти все связанные темы, но не нашел подходящего решения. Я новичок в программировании дешифрования шифрования и мне нужно реализовать его в одном из моих приложений Java.

Спасибо .. вот так код выглядит ....

public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    // TODO Auto-generated method stub
            String FileName="encryptedtext.txt";
            String FileName2="decryptedtext.txt";
            String pad="0"; 

            KeyGenerator KeyGen=KeyGenerator.getInstance("AES");
            KeyGen.init(128);

            SecretKey SecKey=KeyGen.generateKey();

            Cipher AesCipher=Cipher.getInstance("AES");
            AesCipher.init(Cipher.ENCRYPT_MODE,SecKey);

            byte[] byteText="My name is yogesh".getBytes();
            byte[] byteCipherText=AesCipher.doFinal(byteText);
            String cipherText = null;

            try {
                FileWriter fw=new FileWriter(FileName);
                BufferedWriter bw=new BufferedWriter(fw);
                bw.write(byteCipherText.toString());
                bw.close();
            }catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                FileReader fr=new FileReader(FileName);
                BufferedReader br=new BufferedReader(fr);
                cipherText=br.readLine();
                br.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            AesCipher.init(Cipher.DECRYPT_MODE,SecKey);
            while(((cipherText.getBytes().length)%16)!=0)
            {
                cipherText=cipherText+pad;


            }

            byte[] bytePlainText=AesCipher.doFinal(cipherText.getBytes());
            FileWriter fw1;
            try {
                fw1 = new FileWriter(FileName2);
                BufferedWriter bw1=new BufferedWriter(fw1);
                bw1.write(bytePlainText.toString());
                bw1.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }






}
8
Yogesh D 27 Дек 2013 в 10:35

2 ответа

Лучший ответ

Здесь вы должны понимать, что зашифрованный текст может содержать непечатаемые символы. Итак, когда вы используете readLine (), он, скорее всего, не выдаст вам все байты в файле.

Кроме того, byteCipherText.toString() не дает вам того, что вы ожидали получить. В java метод toString() не дает строковое представление содержимого массива.

Добавлять отступы к зашифрованному тексту не нужно. Он уже набит.

import java.nio.file.Files;
import java.nio.file.Paths;
import javax.crypto.*;

public class Main {

    public static void main(String[] args) throws Exception {
        String fileName = "encryptedtext.txt";
        String fileName2 = "decryptedtext.txt";

        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);

        SecretKey secKey = keyGen.generateKey();

        Cipher aesCipher = Cipher.getInstance("AES");


        byte[] byteText = "Your Plain Text Here".getBytes();

        aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
        byte[] byteCipherText = aesCipher.doFinal(byteText);
        Files.write(Paths.get(fileName), byteCipherText);


        byte[] cipherText = Files.readAllBytes(Paths.get(fileName));

        aesCipher.init(Cipher.DECRYPT_MODE, secKey);
        byte[] bytePlainText = aesCipher.doFinal(cipherText);
        Files.write(Paths.get(fileName2), bytePlainText);
    }
}
15
Max 24 Май 2018 в 22:08

Вам необходимо определить, какой алгоритм заполнения вы используете при создании экземпляра Cipher. Лично я использую PKCS5.

Итак, вам следует изменить:

Cipher AesCipher=Cipher.getInstance("AES");

Чтобы :

Cipher AesCipher=Cipher.getInstance("AES/CBC/PKCS5Padding");

CBC означает цепочку блоков шифрования < / em>.

CBC требует IV для передачи. Итак, вы хотите сгенерировать случайный IV и передать его в методе init:

byte[] iv = new byte[16];
SecureRandom random = new SecureRandom();
random.nextBytes(iv);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
AesCipher.init(Cipher.ENCRYPT_MODE, SecKey, ivParameterSpec);

Примечание . Рекомендуется избегать использования магических чисел / строк в своем коде. Я бы предложил извлекать передачи аргументов в Cipher#getInstance в константу.

10
Leri 27 Дек 2013 в 07:24