Rating:

# xkcd.com/2247 v2
> Why pick a weird hill to die on when you could pick a soft hill to lie on?
>
> Note: this challenge has been revised with a new flag. It was previously taken down and all solves for that challenge have been rolled back.
>
> The flag format will be flag{a_bunch_of_words_with_underscores}. The flag is hidden inside the plaintext, and does not include a flag{}.

Opening [HillREVISED.txt](HillREVISED.txt) shows us an encryption key and ciphertext:


Encryption Key:
Coqfvpbbvzohmogzjjquohnonabjqippelaxnorxrvaxdllwubieletjauvfuktrymtkkdyfdtoos...

Ciphertext:
ieyirlxxtfiyfpsyvxcjmcdlpeftagszjhqjblyohgknhszyshfvuopozqwivkzeatqihkhdozkkv...


Based on the [xkcd](https://xkcd.com/2247/), the problem statement, and the name of the file, we guess that this is probably a Hill Cipher (which involves a matrix for decryption). Checking the length of the encryption key gives 10000, which suggests that the encryption matrix is 100 x 100. Additionally, the encryption key and ciphertext consist of only lowercase letters (apart from the capital C), so we are probably working mod 26.

Let's load up sage to calculate the decryption matrix:


sage: enc_str = "coqfvpbbvzohmogzjjquohnonabjqippelaxnorxrvaxdllwubieletjauv..."
sage: enc_arr = [ord(x) - ord('a') for x in enc_str]
sage: enc_mat = Matrix(enc_arr, ring=Integers(26), nrows=100)
sage: dec_mat = enc_mat.inverse()


Now we decrypt the ciphertext by left multiplying it by the decryption matrix:


sage: ciphertext_str = "ieyirlxxtfiyfpsyvxcjmcdlpeftagszjhqjblyohgknhszyshfv..."
sage: ciphertext_arr = [ord(x) - ord('a') for x in ciphertext_str]
sage: ciphertext_mat = Matrix(ciphertext_arr, ring=Integers(26), ncols=100).transpose()
sage: plaintext_mat = (dec_mat * ciphertext_mat).transpose()
sage: plaintext_arr = [int(x) for x in plaintext_mat.list()]
sage: plaintext_str = ''.join([chr(x + ord('a')) for x in plaintext_arr])
sage: plaintext_str
ryjpureelbzjxqrgzlntnyzzkzaukwqcriugpqefejxhiwrvqiwhjyqzdxxohpfwmmwyzdsggvmvs...


At this point we can just skim through the text or try searching for common english words. Then, we get the flag:


sage: plaintext_str[3937:3988]
imaginegivingtheplaintextandnottheciphertextriplmao


> flag{imagine_giving_the_plaintext_and_not_the_ciphertext_rip_lmao}

Original writeup (https://github.com/AMACB/HSCTF-2020-writeups/blob/master/xkcd_2247/xkcd_2247.md).