FOD
FOD

Reputation: 323

How would I create my own zip like file?

I want to be able to create a file that'll act like a zip but at the same time it isn't an actual zip.

Let's say I have a program that'll take a bunch of files and directories and store them into a single file with a name and extention of data.rds and you would need the same program to extract them out of it. I've seen in lots of different games that they use file formats such as .arc, .nsa, .mxdl etc which all store many files inside of them, .rar is probably the most commonly known format. The four extentions can't be opened as a normal zip and require a specific program in order to extract the files from them, I want to learn as to how you would encrypt and decrypt many files into a single one without making it readable like it would be in a normal zip file.

Pretty much how would one go about doing this? I know it would be a long process and won't be answered with a few simple lines of code but if someone could point me in a direction towards learning as to how to do such a thing, that would help helpful.

Upvotes: -1

Views: 2419

Answers (4)

Adeeb
Adeeb

Reputation: 1271

I sense that you are more concerned about authenticity, that is, that the archive is not modified. I will further assume that you don't really want to implement your own compression algorithms.

That being said, what you could is the following:

  1. Create a zip with different extension.
  2. Compute the SHA1 hash of the file
  3. Use the SHA1 hash to check if that archive hasn't been changed.

Upvotes: 0

VGR
VGR

Reputation: 44292

No matter what format you invent, someone will figure it out. Anyone can decompile your code and see your algorithm.

I would just use the Zip format and give the file a different extension (which it sounds like you're already doing). An easy way to keep casual observers from opening your file is to put a couple junk bytes at the front of it:

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
        }
    }
}

Upvotes: 1

Diego Martinoia
Diego Martinoia

Reputation: 4652

It depends on your goal.

I'm going to assume you wish to write your own algorithm for fun.

If you just want to pack things together and encrypt them, well, just take the files you need and write their binary content in a sequential manner, prepending at the start of the file something like an index table, that tells you where in the big-file each file starts. Then encrypt everything using your algorithm of choice.

If you want to also compress them, the simplest algorithm I feel suggesting you to implement is Huffman encoding of your binary content. Note that, while simple enough in theory, it can still be quite an ordeal to implement, so think carefully if it's worth it or if you can rely on something off-the-shelf.

Bottom line: if you are doing it to teach yourself something, go for it. If you need it in a bigger project where the end goal isn't learning these things, just take something that already exists.

Upvotes: 0

GhostCat
GhostCat

Reputation: 140407

You could approach it like this:

1) start with an application that does "simply" store the contents of directories, list of files, ... in a single file. Meaning: learn how to collect all these files; and how to push them into a single uncompressed archive (and of course: ensure that you can extract things afterwards again)

2) when that step is working (and properly and extensively tested); then add a "compression" resp. "decompression" step.

Your favorite search engine will give you many results when searching for "compression algorithms".

Upvotes: 0

Related Questions