Обработка ключа для дешифрования изображений в приложении AWT

112
20

У меня есть следующий код для дешифрования зашифрованного изображения. Моя проблема в том, что если я делаю шифрование изображения и уменьшаю изображение, он делает это без проблем. Но если я зашифрую изображение и подожду какое-то время, и попытаюсь расшифровать изображение, оно выдаст мне это исключение.

javax.crypto.BadPaddingException: данный конечный блок неправильно заполнен

Ниже мой код для decrpting

public void decrypt(String srcPath, String destPath) {  
File encryptedFile = new File(srcPath);
File decryptedFile = new File(destPath);
InputStream inStream = null;
OutputStream outStream = null;
try {
inStream = new FileInputStream(encryptedFile);
outStream = new FileOutputStream(decryptedFile);
byte[] buffer = new byte[1024];
int len;
while ((len = inStream.read(buffer)) > 0) {
outStream.write(cipher.update(buffer, 0, len));
outStream.flush();
}
outStream.write(cipher.doFinal()); //I guess this line throws the error
inStream.close();
outStream.close();
} catch (IllegalBlockSizeException ex) {
System.out.println(ex);
} catch (BadPaddingException ex) {
System.out.println(ex);
} catch (InvalidKeyException ex) {
System.out.println(ex);
} catch (FileNotFoundException ex) {
System.out.println(ex);
} catch (IOException ex) {
System.out.println(ex);
}
}

Код шифрования

 public FunctionClass() {  
try {
keyGenerator = KeyGenerator.getInstance("Blowfish");
secretKey = keyGenerator.generateKey();
cipher = Cipher.getInstance("Blowfish");
} catch (NoSuchPaddingException ex) {
System.out.println(ex);
} catch (NoSuchAlgorithmException ex) {
System.out.println(ex);
}
}

public void encrypt(String srcPath, String destPath) {
File rawFile = new File(srcPath);
File encryptedFile = new File(destPath);
InputStream inStream = null;
OutputStream outStream = null;
try {
/**
* Initialize the cipher for encryption
*/
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
/**
* Initialize input and output streams
*/
inStream = new FileInputStream(rawFile);
outStream = new FileOutputStream(encryptedFile);
byte[] buffer = new byte[1024];
int len;
while ((len = inStream.read(buffer)) > 0) {
outStream.write(cipher.update(buffer, 0, len));
outStream.flush();
}
outStream.write(cipher.doFinal());
inStream.close();
outStream.close();
} catch (IllegalBlockSizeException ex) {
System.out.println(ex);
} catch (BadPaddingException ex) {
System.out.println(ex);
} catch (InvalidKeyException ex) {
System.out.println(ex);
} catch (FileNotFoundException ex) {
System.out.println(ex);
} catch (IOException ex) {
System.out.println(ex);
}
}

Код кнопки

 private void btnEncryptActionPerformed(java.awt.event.ActionEvent evt) {                                           
int o=jFileChooser1.showOpenDialog(this);
if(o==JFileChooser.APPROVE_OPTION)
{
File f=jFileChooser1.getSelectedFile();
String path=f.getAbsolutePath();

FunctionClass Encrypt= new FunctionClass();
String directoryPath = "C:/Users/Desktop/";
String encryptedFile = "encryptedFile.jpg";
Encrypt.encrypt(path, directoryPath+encryptedFile);
}
}

private void btnDecryptActionPerformed(java.awt.event.ActionEvent evt) {
int o=jFileChooser1.showOpenDialog(this);
if(o==JFileChooser.APPROVE_OPTION)
{
File f=jFileChooser1.getSelectedFile();
String path=f.getAbsolutePath();

FunctionClass Encrypt= new FunctionClass();
String directoryPath = "C:/Users/Desktop/";
String decryptedFile = "decryptedFile.jpg";
Encrypt.decrypt(path, directoryPath+decryptedFile);
}
}

спросил(а) 2021-01-19T17:14:56+03:00 6 месяцев, 1 неделя назад
1
Решение
63

Проблема в том, что вы генерируете ключ в конструкторе FunctionClass, но вы btnEncryptActionPerformed объект как в btnEncryptActionPerformed и в btnDecryptActionPerformed. Поскольку вы решили сгенерировать ключ в конструкторе, у вас должен быть только один экземпляр FunctionClass в вашем классе.

Вы можете сделать FunctionClass Encrypt= new FunctionClass(); статическая переменная класса.

Однако есть проблема. Вероятно, вам придется расшифровать что-то в другом сеансе, чем когда вы зашифровали файл. С приведенным выше советом вы не сможете расшифровать файл после закрытия и повторного открытия приложения. Вам нужен какой-то слой сопротивления, в который вы вставляете ключ. Этот слой, вероятно, необходимо будет зашифровать с помощью главного ключа.

ответил(а) 2021-01-19T17:14:56+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема