Anonymous
Javax.crypto.badpaddingException: ошибка дешифрования - не в состоянии расшифровать несколько блоков из файла
Сообщение
Anonymous » 21 сен 2025, 13:53
Надеюсь, кто -то сможет указать мне в правильном направлении здесь.
Я не особенно знаком с шифрованием (в Java или иной), но я сказал, что я помогу кому -то с задачей, которую они определяют, используя RSA Encrypt/Decrypt. />
генерирует 6 случайных чисел и помещает их в спятую строку < /li>
Зашифрует последовательность чисел < /li>
Добавления < /strong>. Последовательность шифров Файл - должен получить все последовательности , которые были написаны
Decrypt каждая последовательность и распечатайте сборники, разделенные запятыми
Это отлично работает с первой попытки - то есть, когда первая последовательность написана в пустую файл - и изначальная номера возвращает. Чем одна зашифрованная последовательность, это приводит к тому, что процедура Decrypt сбой с помощью BadPaddingException . В этот момент я сделал шаг, и каждый из байта [] < /code> (представляющий зашифрованную последовательность), который будет расшифрован 128 байтов, так что это не похоже на нерегулярное количество байтов, я не знаю, что я тоже не знаю, что я тоже. Есть множество вопросов, связанных с RSA и BadPaddingException, но я не сталкивался с тем, что касается этой проблемы.
Код: Выделить всё
public class EncryptDecrypt {
private static Cipher cipher;
private static KeyPair keyPair;
public static void main(String[] args)
{
String[] numbers = getNumbers();
String numbersStr = String.join(", ", numbers);
System.out.println("Generated: " + numbersStr + ", NumBytes: " + numbersStr.getBytes().length);
byte[] encryptedNumbers = encrypt(numbersStr);
System.out.println("Encrypted: " + encryptedNumbers.toString() + ", NumBytes: " + encryptedNumbers.length);
writeToFile(encryptedNumbers);
System.out.println("Encrypted numbers written to data.txt");
ArrayList encryptedData = readFromFile();
System.out.println("Encrypted numbers read from data.txt, NumSequences: " + encryptedData.size());
ArrayList decryptedSequences = decrypt(encryptedData);
for (int i = 0; i < decryptedSequences.size(); i++)
{
String sequence = decryptedSequences.get(i);
System.out.println("Sequence " + i + ": " + sequence);
}
}
private static String[] getNumbers()
{
String[] numbers = new String[6];
int min = 1;
int max = 60;
for (int i = 0; i < numbers.length; i++)
{
double number = (Math.random() * (max - min) + min);
numbers[i] = number >= 10 ? Integer.toString((int) number) : "0" + Integer.toString((int) number);
}
return numbers;
}
private static byte[] encrypt(String data)
{
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.update(data.getBytes());
byte[] encrypted = cipher.doFinal();
return encrypted;
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
private static void writeToFile(byte[] data)
{
FileOutputStream fileOut = null;
try {
File file = new File("data.txt");
file.createNewFile();
fileOut = new FileOutputStream(file, true);
fileOut.write(data);
fileOut.flush();
fileOut.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
fileOut.close();
} catch (IOException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private static ArrayList readFromFile()
{
File file = new File("data.txt");
if (file.exists())
{
try {
ArrayList encryptedSequences = new ArrayList();
FileInputStream fileIn = new FileInputStream(file);
int blockSize = 128;
int numBlocks = fileIn.available() / blockSize;
for (int i = 0; i < numBlocks; i++)
{
byte[] encryptedSequence = new byte[blockSize];
fileIn.read(encryptedSequence);
encryptedSequences.add(encryptedSequence);
}
fileIn.close();
return encryptedSequences;
} catch (FileNotFoundException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
}
}
return null;
}
private static ArrayList decrypt(ArrayList data)
{
try {
cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
PrivateKey privateKey = keyPair.getPrivate();
cipher.init(Cipher.DECRYPT_MODE, privateKey);
ArrayList decryptedStrings = new ArrayList();
for (byte[] sequence : data)
{
byte[] decryptedBytes = cipher.doFinal(sequence);
String decryptedString = new String(decryptedBytes);
decryptedStrings.add(decryptedString);
}
return decryptedStrings;
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) {
Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}
Если кто -то может заметить, что не так, с этим, я бы очень признателен!
Спасибо
Подробнее здесь:
https://stackoverflow.com/questions/650 ... pt-multipl
1758452023
Anonymous
Надеюсь, кто -то сможет указать мне в правильном направлении здесь. Я не особенно знаком с шифрованием (в Java или иной), но я сказал, что я помогу кому -то с задачей, которую они определяют, используя RSA Encrypt/Decrypt. /> [list] [*] генерирует 6 случайных чисел и помещает их в спятую строку < /li> Зашифрует последовательность чисел < /li> [b] Добавления < /strong>. Последовательность шифров Файл - должен получить все последовательности [/b], которые были написаны [*] Decrypt каждая последовательность и распечатайте сборники, разделенные запятыми [/list] Это отлично работает с первой попытки - то есть, когда первая последовательность написана в пустую файл - и изначальная номера возвращает. Чем одна зашифрованная последовательность, это приводит к тому, что процедура Decrypt сбой с помощью BadPaddingException . В этот момент я сделал шаг, и каждый из байта [] < /code> (представляющий зашифрованную последовательность), который будет расшифрован 128 байтов, так что это не похоже на нерегулярное количество байтов, я не знаю, что я тоже не знаю, что я тоже. Есть множество вопросов, связанных с RSA и BadPaddingException, но я не сталкивался с тем, что касается этой проблемы.[code]public class EncryptDecrypt { private static Cipher cipher; private static KeyPair keyPair; public static void main(String[] args) { String[] numbers = getNumbers(); String numbersStr = String.join(", ", numbers); System.out.println("Generated: " + numbersStr + ", NumBytes: " + numbersStr.getBytes().length); byte[] encryptedNumbers = encrypt(numbersStr); System.out.println("Encrypted: " + encryptedNumbers.toString() + ", NumBytes: " + encryptedNumbers.length); writeToFile(encryptedNumbers); System.out.println("Encrypted numbers written to data.txt"); ArrayList encryptedData = readFromFile(); System.out.println("Encrypted numbers read from data.txt, NumSequences: " + encryptedData.size()); ArrayList decryptedSequences = decrypt(encryptedData); for (int i = 0; i < decryptedSequences.size(); i++) { String sequence = decryptedSequences.get(i); System.out.println("Sequence " + i + ": " + sequence); } } private static String[] getNumbers() { String[] numbers = new String[6]; int min = 1; int max = 60; for (int i = 0; i < numbers.length; i++) { double number = (Math.random() * (max - min) + min); numbers[i] = number >= 10 ? Integer.toString((int) number) : "0" + Integer.toString((int) number); } return numbers; } private static byte[] encrypt(String data) { try { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); cipher.update(data.getBytes()); byte[] encrypted = cipher.doFinal(); return encrypted; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } return null; } private static void writeToFile(byte[] data) { FileOutputStream fileOut = null; try { File file = new File("data.txt"); file.createNewFile(); fileOut = new FileOutputStream(file, true); fileOut.write(data); fileOut.flush(); fileOut.close(); } catch (FileNotFoundException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } finally { try { fileOut.close(); } catch (IOException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } } } private static ArrayList readFromFile() { File file = new File("data.txt"); if (file.exists()) { try { ArrayList encryptedSequences = new ArrayList(); FileInputStream fileIn = new FileInputStream(file); int blockSize = 128; int numBlocks = fileIn.available() / blockSize; for (int i = 0; i < numBlocks; i++) { byte[] encryptedSequence = new byte[blockSize]; fileIn.read(encryptedSequence); encryptedSequences.add(encryptedSequence); } fileIn.close(); return encryptedSequences; } catch (FileNotFoundException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } } return null; } private static ArrayList decrypt(ArrayList data) { try { cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); PrivateKey privateKey = keyPair.getPrivate(); cipher.init(Cipher.DECRYPT_MODE, privateKey); ArrayList decryptedStrings = new ArrayList(); for (byte[] sequence : data) { byte[] decryptedBytes = cipher.doFinal(sequence); String decryptedString = new String(decryptedBytes); decryptedStrings.add(decryptedString); } return decryptedStrings; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) { Logger.getLogger(EncryptDecrypt.class.getName()).log(Level.SEVERE, null, ex); } return null; } } [/code] Если кто -то может заметить, что не так, с этим, я бы очень признателен! Спасибо Подробнее здесь: [url]https://stackoverflow.com/questions/65003382/javax-crypto-badpaddingexception-decryption-error-not-able-to-decrypt-multipl[/url]