Couple days ago, a video, ad hoc named 11B-X-1371 , containing some hidden puzzles, went viral. See original source or Reddit thread for more information on that. Most of these puzzles aren’t very sophisticated (some seems to be), but never mind. Some of them were hidden within an audio track and that’s pretty neat. It could be done better though. And it’s something I’d like to cover here.

Using sound for storing miscellaneous data isn’t of course something new, for example take a look at old analog modems or ZX Spectrum filesystem, but this technology have seen better days. However, a whole new field of applications might has been opened by the steganography.

I’ve written a python script for encoding images to sound files whose spectrograms look like these input images. Let’s take the eye picture from the header of this page and encode it into a wav file. Let me just convert it into a proper format: Windows 24-bit bmp file . I also reduced its size and added some secret message.

Spectrograms below were generated from files that were made with this perl script. I’ve created a new script for doing that, see repository.

$ ./imageEncode -i eye.bmp -o eye.wav Input: eye.bmp Output: eye.wav Pixel per second: 15 Max amplitude per sample: 300 Image Width: 200 Height: 106 Frequency Interval: 186.792452830189 Samples per Pixel: 2940 Generating wave file

Let’s take a look at file’s spectrogram (I use Sonic Visualiser for that):

It works just fine, but wav is pretty big. What about 256kbps mp3 ?

Nice. And 128kbps mp3 ?

Definitely usable and only 200KB in size. Let’s listen to it:

Your browser does not support the audio element.

It’s hard to stand it actually. Can we make it more bearable? Can we hide it within a song so people won’t know we did?

Doing that may a bit tricky and involves much experimenting, but in some cases may be done. Listen to that piece of music (warning: it’s not about its artistic values (sic!)).

Your browser does not support the audio element.

Let’s brutally merge our secret message with that music (320kbps):

Your browser does not support the audio element.

Maybe it would fit with some experimental electro song, but in this case it sounds just awful. It’s easy to notice that we lost some valuable data at the bottom of the spectrum. Still, it’s readable. Now, to hide our message better, let’s sacrifice the bottom. What about -36dB on the message track?

Your browser does not support the audio element.

More losses, but in higher frequencies data still may be successfully stored. And it’s harder to notice that there’s something wrong with that audio file (it just sounds like a low quality recording). But hey, do you remember we got two channels to use? We can for example move our song 50% left , message 100% right and then analyze just the right channel with our software. I also applied -10dB to the message track:

Your browser does not support the audio element.

On speakers it sounds great, but on headphones you can probably still hear something strange with your right ear.

Another try, I lowered gain to the level I can’t hear anything on my headphones when I’m playing only the message’s channel (with reasonable volume level, both channels centered). Let’s take a look:

Your browser does not support the audio element.

And still, much data have survived. By the way, MP3 cuts frequencies range at about 20k Hz . If proper codec is used, much data can be stored in ranges that you won’t even hear. This article covers however most popular ones.

This one is -60dB at the message, 100% left music , 100% right message . This spectrogram is made only from the second channel.

Your browser does not support the audio element.

No audio in the second channel? That’s suspicious. Let’s try with -60dB at the message, 90% left music , 100% right message .

Your browser does not support the audio element.

Same audio settings, but output file saved to ogg format.

And this is probably the best one I created but experimenting just has begun.

This secret message is 13 seconds length as an audio. Let’s say we got 2 hour movie. We can store a lot unnoticeable, (yet unimportant, since there are too many problems with methods described to use it for serious purposes) data there. And that’s fun.

Update (23:15, 31 Oct 2015)

I’ve rewritten the encoder script, it’s available here: https://github.com/solusipse/spectrology. Now it’s possible to select range of frequencies to be used and all popular image codecs are supported.

All spectrograms above can be produced from files made with spectrology . Take a look at spectrogram below. It was produced from audio file made this way:

python spectrology.py test.bmp -b 13000 -t 19000

Your browser does not support the audio element.