1.8 KiB
CHALLENGE DecryptThis
Writeup
To decrypt, we first have to understand how the encryption works. The best way to do this would be to try a long string containing one charachter. If the input string was long enough, the encrypted version will show a clear pattern. This is a sign that a Vignere-Cipher is probably used. More information about vignere can be found here. A second thing we can see is the beginning of the string, here the pattern is broken by random characters, this is the cipher key for Vignere. The last odd thing is the second last character, this is the length of the codeword.
An example:
FFFFFFFFFFFFFFFFFFFF
might be coded to GAHBICGHIGHIGHIGHIGHIGCH
, where GHI
is the pattern, ABC
is the key and C
(=3) is the key length.
As the key-word is generated randomly, a string kan be encrypted to multiple strings. The 3 strings in the given file where 3 different encrypted versions of the flag.
Decryption Tool
A (simple) tool could be written to decrypt a string; here is an example of a decryption tool in PHP:
function getNumberValue($nr) {
return chr((($nr + 94) % 94) + 33);
}
function decodeChar($char, $offset) {
return getNumberValue(getLetterValue($char) - getLetterValue($offset));
}
function decrypt($code) {
$len = ord(substr($code, -2, 1)) - 64;
$code = substr($code, 0, -2) . substr($code, -1);
$codedMessage = "";
$codeword = "";
for ($i = 0; $i < (2 * $len); $i += 2) {
$codedMessage .= substr($code, $i, 1);
$codeword .= substr($code, $i + 1, 1);
}
$codedMessage .= substr($code, 2 * $len);
$decrypted = "";
for ($i = 0; $i < strlen($codedMessage); $i++) {
$decrypted .= decodeChar(substr($codedMessage, $i, 1), substr($codeword, $i % strlen($codeword), 1));
}
return $decrypted;
}