Как исправить javax.crypto.BadPaddingException: данный последний блок не заполнен должным образомJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить javax.crypto.BadPaddingException: данный последний блок не заполнен должным образом

Сообщение Anonymous »

Я хотел бы реализовать защиту паролей в Java. У меня есть EncryptionModule с двумя методами void encrypt(Stringpassword, StringbaseName) и void decrypt(Stringpassword, StringbaseName). Методы принимают пароль и имя файла, предоставленные пользователем. Должно быть возможно зашифровать/расшифровать файл csv или базу данных mysql.
Когда я выполняю код, я получаю следующее сообщение об ошибке:

Код: Выделить всё

Caused by: javax.crypto.BadPaddingException: Given final block not properly padded.  Such issues can arise if a bad key is used during decryption.
Исключение возникает из метода дешифрования.
Код EncryptionModule:

Код: Выделить всё

package com.example.passwordsafe.data;

import com.example.passwordsafe.core.usecases.EncryptionModuleInterface;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

public class EncryptionModule implements EncryptionModuleInterface {
private static final String PBKDF_ALGORITHM = "PBKDF2WithHmacSHA1";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String ALGORITHM = "AES";

@Override
public void encrypt(String password, String databaseName) {

Path path = Paths.get(databaseName);
if (Files.exists(path)){
File plaintextFile = new File(databaseName);
File encryptedFile = new File(databaseName + ".encrypted");

doCrypto(Cipher.ENCRYPT_MODE, password, plaintextFile, encryptedFile);

} else {
System.out.println("File does not exist");
}

}

@Override
public void decrypt(String password, String databaseName) {

Path path = Paths.get(databaseName);
if (Files.exists(path)){
File encryptedFile = new File(databaseName);
File plaintextFile = new File(databaseName + ".decrypted");

doCrypto(Cipher.DECRYPT_MODE, password, encryptedFile, plaintextFile);

} else {
System.out.println("File does not exist");
}

}

private void doCrypto (int cipherMode, String password, File inputFile, File outputFile) {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);

KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1000000, 256);

try {
SecretKeyFactory factory = SecretKeyFactory.getInstance(PBKDF_ALGORITHM);
byte[] key = factory.generateSecret(spec).getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);

byte[] ivBytes = new byte[16];
random.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);

Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(cipherMode, keySpec, iv);

FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) inputFile.length()];
inputStream.read(inputBytes);

byte[] encValue = cipher.doFinal(inputBytes);
byte[] finalCiphertext = new byte[encValue.length+2*16];
System.arraycopy(ivBytes, 0, finalCiphertext, 0, 16);
System.arraycopy(salt, 0, finalCiphertext, 16, 16);
System.arraycopy(encValue, 0, finalCiphertext, 32,  encValue.length);

FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(finalCiphertext);

inputStream.close();
outputStream.close();

} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
IOException | BadPaddingException | InvalidKeySpecException | InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
}

}
}
Методы вызываются в main:

Код: Выделить всё

package com.example.passwordsafe.presentation.terminal;

import com.example.passwordsafe.core.usecases.*;
import com.example.passwordsafe.data.EncryptionModule;
import com.example.passwordsafe.data.FileAccess;
import com.example.passwordsafe.passwordgenerator.PasswordGenerator;
import java.io.File;

public class MainTerminal {
public static void main(String[] args) {

// Create CSV file
String fileName = "../passwords.csv";
new File(fileName);

// Create objects
OutputInterface output = new TerminalOutput();
DataAccessInterface dataAccessInterface = new FileAccess(fileName);
PasswordGeneratorInterface passwordGenerator = new PasswordGenerator();
EncryptionModuleInterface encryptionModule = new EncryptionModule();
InputInterface inputInterface = new UseCases(output, dataAccessInterface, passwordGenerator, encryptionModule);

UseCasesInterface useCasesInterface = new UseCases(output, dataAccessInterface, passwordGenerator, encryptionModule);

TerminalInput terminalInput = new TerminalInput(inputInterface, useCasesInterface);

// Do Stuff

// Encryption Module Test
String password = "masterpassword";

encryptionModule.encrypt(password,fileName);
encryptionModule.decrypt(password, "../passwords.csv.encrypted");

}

}
Сначала я использовал код из: https://www.codejava.net/coding/file-en ... le-example, но сделал исключение: java.security.InvalidKeyException: неверная длина ключа AES. Затем я попытался включить код от Артёма Б. Ответ здесь: Как исправить неверную длину ключа AES? Теперь у меня есть упомянутое выше исключение.
Что я могу сделать, чтобы исправить это исключение?

Подробнее здесь: https://stackoverflow.com/questions/793 ... perly-padd
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»