Santa has noticed some strange behaviour around the workshop recently. The elves seem to be avoiding him more that usual. When Santa goes to use the computer he notices some emails that he can’t open because they are encrypted. Help him decrypt the emails to find out what’s going on.
The elves are very savvy and when they heard about ChaCha20 encryption they just had to go and make a spin off for their own in-house North Pole approved encryption. It is very similar to ChaCha20, but it only uses a 64bit key and has simplified scrambling functions.
They call it HoHoHo4. Here’s how it works (it’s actually quite remarkebly similar to ChaCha20 so go check that out, here’s a relatively low lines of code implementation: ChaCha20.h):
stir
ring the values aroundmix
ed the values onceYou will need to initialize the state once each time you want to encrypt or decrypt a file. To initialze the state you need to have two pieces of information, the fixed constant and the cipher key. Initialize the state as follows:
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | H | o | | H |
4 | o | | H | o |
8 | k0 | k1 | k2 | k3 |
12 | k4 | k5 | k6 | k7 |
The constant is the 8 bytes: Ho Ho Ho
. The first 8 bytes of the state are this constant. The next 8 bytes are the cipher key.
Great! Now that you have the state initialized you will need to stir
it up. In order to stir
, you will take 4 of the values and jumble them up. If you take any 4 indices (let’s call them A, B, C, and D) this is what you need to do:
Since that only jumbles 4 values, we need to mix
it more by stir
ring 4 times with different values each time. We will be stir
ring each of the 4 columns in the state. In order to mix
you will need to do the following (pay attention to the order! These are in A, B, C, D order):
stir
the values at positions 0, 4, 8, 12stir
the values at positions 1, 5, 9, 13stir
the values at positions 2, 6, 10, 14stir
the values at positions 3, 7, 11, 15Excellent! Now we know how to do a mix
operation. Let’s dig into the cipher
operation, which is the same for both encryption and decryption. You will take an input buffer and return an output buffen that has gone through the cipher
process.
mix
operations, this is HoHoHo4 after allmix
es each timeCongratulation! You have now either encrypted or decrypted your input.
Now of course the elves are smart and know that since this is such a simple cipher there is no way to know if it fails for a given key. It’s just math after all, there is always an answer at the end, but it’s not always useful. For that, they came up with their own HMAC called HoMAC that used the HoHash function.
The HoHash function is very simple:
The HoMAC function is also simple:
There is still one problem though. You don’t know the key! Luckily you know the elves would have a pretty simple key. You know they use only words from a wordlist, but they could be either capitalized like in the wordlist file already or all lowercase. The key has to be exactly 8 characters long since it is part of the internal state of the cipher. Try mixing and matching the words in the wordlist until you find something that works.
Here is an example input. The first line is the HoMAC of the key and the ciphertext. You can run the HoMAC function youself with the key XmasXmas
and the ciphertext on the next line as the message and compare it to see if you have it working.
As mentioned, the ciphertext (encrypted) is on the second line as bytes separated by commas.
475498776
228,110,253,23,183,57,193,12,36,27,109,73,105,184,28,158,203,7,50,193,68,174,36,131,156,59
Problem: Decrypt the files secret0.txt, secret1.txt, secret2.txt, secret3.txt, secret4.txt, secret5.txt, secret6.txt to figure out what the elves have been emailing about so you can get to the bottom of their odd behaviour.