2015-01-24 6 views
0

Я написал программу, которая шифрует данный файл jar. Совершенно прямо. Теперь я нахожусь в процессе написания второй программы, которая расшифровывает файл путем принудительной работы. (Они оба являются автономными)Как обойти ограничение размера строки?

После шифрования данного файла я получаю байт [], содержащий зашифрованные данные файла. Я преобразовал этот байт [] в String и сделал вывод на консоль, чтобы я мог легко скопировать и вставить данные.

Затем я инициализирую новую строку в «decrypter» и вставил эти данные в зашифрованный файл. Для небольших файлов это работает, но для больших файлов это не работает из-за ограничения размера строки. Как я могу перекодировать эти данные в decrypter?

Быстрый псевдокод

Encrypter:

public byte[] encrypt(){ 
} 
String encryptedData = Arrays.toString(encrypt(data)); 

Decrypter:

String encryptedData = "[-3, -66, -89, -14, 5, -72, 12, 5, ........ 
// note that I actually copy paste - hardcode the string 
decrypt(stringToByteArray(encryptedData)); 

Я не могу использовать временный файл для чтения/записи между обеими программами.

+0

Что струнный предел буквального размера? Я никогда не слышал о таком пределе. –

+0

@MarkoTopolnik [этот предел] (http://stackoverflow.com/a/8323747/2071828) Я полагаю. Это ограничение на длину литералов 'String', а не' String'. –

+0

@boris Я бы рискнул, что это предел для строки String * constant *, а не string * literal *. В противном случае было бы легко обойти, объединив несколько литералов. –

ответ

2
  1. Разбейте закодированный текст и положить части вместе, как это:

    Строка EncryptedData = "blahblahblah" + "moreblahblah" + "и так далее";

  2. Запишите зашифрованные данные в текстовый файл и прочитайте его там, используя f.e. BufferedWriter/FileWriter и BufferedReader/FileReader.

+0

Шаг 1 был достаточно :) Спасибо. – ManyQuestions

1

Возможно, вы должны использовать InputStream, а не hardcode строковый литерал в свой класс?

+1

или не преобразовать в строку, и с помощью байтового массива напрямую ... – Deduplicator

+0

@Deduplicator И как бы я жестко задал массив байтов? – ManyQuestions

0

Я предлагаю использовать файл для временного хранения, но если вам действительно нужно, чтобы преобразовать данные в строку, которая не должна быть испорченной кодировок, лучше всего было бы Base64.
Вы можете использовать javax.xml.bind.DatatypeConverter для преобразования байтовых массивов в строки и наоборот (см. parseBase64Binary и printBase64Binary).

2

Не используйте форму массива toString для сериализации данных.

Лучшее решение - записать его в файл, а затем прочитать его из файла. Это можно сделать очень легко, используя служебный класс Files.

Чтобы написать:

final byte[] encrypted = ... 
final Path output = Paths.get(".", "encrypted.bin"); 
Files.write(output, encrypted); 

И снова читать:

final Path input = Paths.get(".", "encrypted.bin"); 
final byte[] encrypted = Files.readAllBytes(input); 

Чтобы решить непосредственную проблему, вы можете Base64 кодировать двоичные данные. Это значительно уменьшит размер представления String. Вы можете использовать класс Base64, доступный в JDK.

Для кодирования:

final byte[] encrypted = ... 
final Base64.Encoder encoder = Base64.getEncoder(); 
System.out.println(encoder.encodeToString(encrypted)); 

Для декодирования:

final String encoded = ... 
final Base64.Decoder decoder = Base64.getDecoder(); 
final byte[] encrypted = decoder.decode(encoded); 
+0

Я буду использовать Base64, спасибо за это. Мне не разрешено читать из файла, но это не так. – ManyQuestions