The PNG Packer

What is the PNG Packer?

There are many ways to secretly store data, and many ways to send encrypted data to other people. However, many of these methods draw too much attention to the fact that they are encrypted! For example, an encrypted .RAR file asks you for a password before you can open it, which makes it obvious that the file is storing something important. The question the PNG Packer intends to address is: how can we encrypt, store, and send files in a securely yet seemingly innocent way?

Let's take a look at the PNG file format for inspiration. PNG files follow a certain specification involving "chunks". These chunks store various types of information and have various attributes. One of these attributes is whether or not the chunk is "private", which, when set, tells image viewers and processing programs to ignore the chunk but not delete it. This means that, in theory, the contents of one file could be encrypted and stored in a custom, private PNG chunk, and then a new PNG could be generated which would contain the "packed" contents of the file. This process could be reversed, where a PNG with a "packed" file could be scanned for the custom chunk, and the data in that chunk could be "extracted", decrypted and outputted as the original file format.

This is exactly what the PNG Packer does. This method of "packing" and "extracting" a PNG creates a secure yet innocent-looking way of sending secret files contained inside of PNG images.

Try it Out!

First, pick a PNG file that you would like to "pack" files into:

This PNG is protected with a password. Enter the password to unlock its "packed" contents.

Would you like to encrypt your files with a password?

(Leave blank for no password)


Now, choose files to "pack" into your PNG:

Packing Successful!

Your PNG file should have downloaded!

- Everything is done client-side. We don't upload/store any files that you use in this demo!
- This demo works best for small files (less than 10mb).


The PNG Packer, at its core, was conceptualized, created, and ported to JavaScript by Christopher Chamberlain. This webpage was branded and stylized by Kevin Champagne, and published under Karate Fox Studios.

Also, check out our source code on GitHub!