Вот то, что я делаю, что может показаться немного неуклюжим, но любая помощь в решении этой проблемы приветствуется. Я получаю 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();
}
}
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);
}
}
Вам необходимо определить, какой алгоритм заполнения вы используете при создании экземпляра 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
в константу.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].