2015-03-23 2 views
-1

Я хочу, чтобы создать файл, который будет действовать как zip, но в то же время это не фактический zip.Как мне создать свой собственный почтовый файл?

Предположим, у меня есть программа, которая возьмет кучу файлов и каталогов и сохранит их в один файл с именем и расширением data.rds, и вам понадобится такая же программа, чтобы извлечь их из нее. Я видел во многих разных играх, что они используют форматы файлов, такие как .arc, .nsa, .mxdl и т. Д., Которые хранят в них много файлов, .rar, вероятно, является наиболее распространенным форматом. Четыре расширения не могут быть открыты как обычный почтовый индекс и требуют определенной программы для извлечения из них файлов. Я хочу узнать, как вы зашифруете и дешифруете многие файлы в один, не делая его доступным для чтения будет в обычном zip-файле.

Довольно много, как бы это сделать? Я знаю, что это будет долгий процесс, и на него не ответят несколько простых строк кода, но если кто-то может указать мне направление к обучению тому, как это сделать, это поможет.

+0

«зашифровать и расшифровать»? вы имели в виду сжатие и разжатие? Кроме того, почему бы не сохранить их как zip и изменить расширение после создания файла? – Adeeb

+0

Я думаю, он ясно заявил, что он НЕ хочет, чтобы его новые «архивные» файлы можно было открыть с помощью существующих инструментов ZIP. – GhostCat

+0

@Adeeb Это то, что я делал, но если кто-то узнает, что это обычный почтовый индекс, они могут просто отредактировать его, как им нравится. – FOD

ответ

1

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

Я бы просто использовал формат Zip и дал файлу другое расширение (которое звучит так, как будто вы уже делаете). Легкий способ избежать случайных наблюдателей от открытия файла - поставить пару барахлов перед ним:

private static final byte[] secretSignature = { 10, 20 }; 

void writeData(Path file) 
throws IOException { 
    try (OutputStream out = new BufferedOutputStream(
      Files.newOutputStream(file))) { 
     out.write(secretSignature); 

     ZipOutputStream zip = new ZipOutputStream(out); 
     // Write zip entries 
     zip.finish(); 
    } 
} 

void readData(Path file) 
throws IOException { 
    try (InputStream in = new BufferedInputStream(
      Files.newInputStream(file))) { 
     in.skip(secretSignature.length); 

     ZipInputStream zip = new ZipInputStream(in); 
     ZipEntry entry; 
     while ((entry = zip.getNextEntry()) != null) { 
      // Read entry 
     } 
    } 
} 
+0

Хотя это не то, что я ищу, это просто, и сейчас это работает. – FOD

0

Вы могли бы подойти к нему так:

1) начать с приложением, которое делает «просто» хранить содержимое каталогов, список файлов, ... в одном файле. Значение: узнайте, как собрать все эти файлы; и как их вставлять в один несжатый архив (и, конечно же, убедитесь, что вы снова можете извлекать вещи после этого)

2) когда этот шаг работает (и правильно и тщательно проверен); затем добавьте «сжатие» соответственно. шаг «декомпрессии».

Ваша любимая поисковая система даст вам много результатов при поиске «алгоритмов сжатия».

0

Это зависит от вашей цели.

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

Если вы просто хотите собрать вещи вместе и зашифровать их, ну, просто возьмите нужные вам файлы и напишите их двоичный контент последовательным образом, добавив в начале файла что-то вроде таблицы индексов, которая сообщает вам где в большом файле запускается каждый файл. Затем зашифруйте все, используя ваш алгоритм выбора.

Если вы хотите сжать их, то самый простой алгоритм, который, как мне кажется, предлагает вам реализовать, - это кодирование Хаффмана вашего двоичного содержимого. Обратите внимание, что, хотя это достаточно просто теоретически, это может быть довольно сложным испытанием, поэтому тщательно подумайте, стоит ли это или вы можете положиться на что-то готовое.

Нижняя линия: если вы делаете это, чтобы научить себя чему-то, пойдите для этого. Если вам это нужно в более крупном проекте, где конечная цель не изучает эти вещи, просто возьмите то, что уже существует.

0

Я чувствую, что вас больше беспокоит подлинность, то есть, что архив не изменяется. Я также предполагаю, что вы действительно не хотите реализовывать свои собственные алгоритмы сжатия.

Это, как говорится, что вы могли бы следующий:

  1. Создать почтовый индекс с другим расширением.
  2. Вычислить хэш SHA1 файла
  3. Используйте хэш SHA1, чтобы проверить, не был ли этот архив не изменен.
+0

Я очень заинтересован в создании собственных алгоритмов, и мне нужно иметь возможность редактировать его и внутри программы. – FOD

+0

@FOD Существует множество ресурсов для алгоритмов сжатия. Роллинг ... Я думаю, вы должны сделать шаг назад и выяснить фактическую рентабельность инвестиций, хотя, скорее всего, вы не будете делать лучше, чем люди, которые посвятили годы теме. Вы ищете безопасность через неясность - не беспокойтесь. Используйте существующий алгоритм, зашифруйте результат. –

Смежные вопросы