[Редактировать: не пытайтесь понять все это и не тратьте свое время на чтение всего моего вопроса - просто имейте в виду, что расшифровка дошла до определенной позиции ... и прочитайте мой ответ это объясняет почему!]
У меня возникла досадная проблема, я понятия не имею, как ее решить ...
Система записывает зашифрованные данные в файлы, некоторые являются сериализованными объектами, другие - текстовыми (XML) файлами. Базовый класс, который выполняет расшифровку при необходимости, инициализирует шифр с шифрованием AES, подготавливает ключ (считывается из файла) и имеет способы доступа к данным:
Способ получить InputStream:
public InputStream getInputStream(File pFile) throws IOException {
return
new CipherInputStream(
new BufferedInputStream(new FileInputStream(pFile)),
getCipher(Cipher.DECRYPT_MODE)
);
}
и метод для чтения объекта, который просто оборачивает ObjectInputStream вокруг InputStream, полученного из этого метода, и читает объект, используя ObjectInputStream.readObject()
.
Теперь. В системе программного обеспечения все работает таким образом.
Я хотел написать инструмент командной строки, помогающий расшифровать файлы для поддержки. Итак, я использовал точно такие же методы для получения моего шифра, я даже использовал идентичный класс и встроенный там InputStream.
Но: что бы я ни делал: дешифруются только первые 208 (!) Байтов, остальные остаются зашифрованными!
Я пытался просто «скопировать» данные из этого InputStream в новый OutputStream, используя байтовый буфер, но я также попытался просто получить строку из данных, чтобы увидеть, что происходит в отладчике. => Эффект всегда одинаков. До этой «границы» в 208 байт я вижу чистый текст, за которым следует мусор.
Понятия не имею, что здесь может пойти не так! Любые подсказки ??
Шифр создается так:
public Cipher getCipher(int opMode) throws IOException {
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
throw new MdmFatalInternalErrorException("Getting instance of cipher failed. Should never happen. BUG ", e);
} catch (NoSuchPaddingException e) {
throw new MdmFatalInternalErrorException("Getting instance of cipher failed. Should never happen. BUG ", e);
}
try {
cipher.init(opMode, readKey());
} catch (InvalidKeyException e) {
throw new MdmInvalidKeyException();
} catch (ClassNotFoundException e) {
throw new MdmInvalidKeyException();
} catch (NumberFormatException e) {
throw new MdmInvalidKeyException();
}
return cipher;
}
Итак, вот код, который фактически использует InputStream IN в программной системе:
String s = readStream(reader.getInputStream(file));
где readStream реализован так:
public String readStream(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} finally {
reader.close();
}
return sb.toString();
}
Все это работает (в программном обеспечении)!
Но моя попытка прочитать его таким же образом не удалась: строка содержит ровно 208 расшифрованных символов, за которыми следует мусор !!
Написание XML-файлов выполняется с точностью до наоборот, но здесь это действительно не имеет значения, потому что показанный код работает внутри системы, а не в моей простой программе копирования! Я использую там точно такой же класс!
Зачем вообще расшифровывать всего 208 символов ??
Спасибо!
Редактировать: Теперь ясно, что эффект расшифровки только определенного количества байтов зависит от ОС и машины! В моей ОС Windows с 32-битным Java 1.6 Update 20 не удается расшифровать - на компьютере с Linux с 64-битным Java 1.6 Update 18 это работает !!
Итак, вот проблема: кто-нибудь знает, как это влияет на вывод ??? 1042 *