diff --git a/crypto/new_caesar/code.txt b/crypto/new_caesar/code.txt new file mode 100644 index 0000000..21b639f --- /dev/null +++ b/crypto/new_caesar/code.txt @@ -0,0 +1 @@ +mlnklfnknljflfjljnjijjmmjkmljnjhmhjgjnjjjmmkjjmijhmkjhjpmkmkmljkjijnjpmhmjjgjj diff --git a/crypto/new_caesar/new_caesar.py b/crypto/new_caesar/new_caesar.py new file mode 100644 index 0000000..c966418 --- /dev/null +++ b/crypto/new_caesar/new_caesar.py @@ -0,0 +1,28 @@ +import string + +LOWERCASE_OFFSET = ord("a") +ALPHABET = string.ascii_lowercase[:16] + +def b16_encode(plain): + enc = "" + for c in plain: + binary = "{0:08b}".format(ord(c)) + enc += ALPHABET[int(binary[:4], 2)] + enc += ALPHABET[int(binary[4:], 2)] + return enc + +def shift(c, k): + t1 = ord(c) - LOWERCASE_OFFSET + t2 = ord(k) - LOWERCASE_OFFSET + return ALPHABET[(t1 + t2) % len(ALPHABET)] + +flag = "redacted" +key = "redacted" +assert all([k in ALPHABET for k in key]) +assert len(key) == 1 + +b16 = b16_encode(flag) +enc = "" +for i, c in enumerate(b16): + enc += shift(c, key[i % len(key)]) +print(enc) diff --git a/crypto/new_caesar/solve.py b/crypto/new_caesar/solve.py new file mode 100755 index 0000000..6845d5a --- /dev/null +++ b/crypto/new_caesar/solve.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +import string + +LOWERCASE_OFFSET = ord("a") +ALPHABET = string.ascii_lowercase[:16] + +flag = "mlnklfnknljflfjljnjijjmmjkmljnjhmhjgjnjjjmmkjjmijhmkjhjpmkmkmljkjijnjpmhmjjgjj" + +def b16_decode(enc): + dec = "" + for i in range(0, len(enc), 2): + first = "{0:04b}".format(ALPHABET.index(enc[i])) + second = "{0:04b}".format(ALPHABET.index(enc[i + 1])) + dec += chr(int(first + second, 2)) + return dec + +def unshift(c, k): + t1 = ord(c) - LOWERCASE_OFFSET + t2 = ord(k) - LOWERCASE_OFFSET + return ALPHABET[(t1 - t2) % len(ALPHABET)] + + +def main(): + for key in ALPHABET: + unenc = "" + for i, c in enumerate(flag): + unenc += unshift(c, key[i % len(key)]) + unshifted = ''.join(unshift(c, key) for c in flag) + + # NOTE: key is 'g', "et tu?" is a caesar reference. + # Remove the if statement to see all outpus for all keys + if key == 'g': + print(f'picoCTF{{{b16_decode(unenc)}}}') + +if __name__ == "__main__": + main() \ No newline at end of file