Created
December 18, 2016 13:20
-
-
Save CreateRemoteThread/39eeb7192c8861940614a284ef83f4be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import randint, choice | |
from string import ascii_uppercase | |
from hashlib import md5 | |
# from secret import msg, key | |
# assert (len(key) == 5) and key.isalpha() and key.isupper() | |
# "msg" is a meaningful English sentence. | |
# assert all(x.isalpha() or x.isspace() for x in msg) | |
# assert "SharifCTF" in msg | |
# assert "contest" in msg | |
LIN = 'B' | |
LOUT = 'P' | |
def make_key(key_str): | |
key_str += ascii_uppercase | |
key_str = key_str.replace(' ', '').upper().replace(LIN, LOUT) | |
seen = set() | |
seen_add = seen.add | |
return [x for x in key_str if not (x in seen or seen_add(x))] | |
def get_pos(key, letter): | |
i = key.index(letter) | |
return (i//5, i%5) | |
def get_letter(key, i, j): | |
i %= 5 | |
j %= 5 | |
return key[5*i + j] | |
def make_message(msg): | |
msg = msg.replace(' ', '').upper().replace(LIN, LOUT) | |
outp = '' | |
i = 0 | |
while True: | |
if i+1 >= len(msg): | |
if i == len(msg)-1: | |
outp += msg[i] | |
break | |
if msg[i] == msg[i+1]: | |
outp += msg[i] + 'Y' | |
i += 1 | |
else: | |
outp += msg[i] + msg[i+1] | |
i += 2 | |
if len(outp) % 2 == 1: | |
outp += 'Y' | |
return outp | |
# print make_message("Sharif Contest") | |
def playfair_dec(key,msg): | |
assert len(msg) % 2 == 0 | |
assert len(key) == 25 | |
ptxt = "" | |
for i in range(0,len(msg),2): | |
r0,c0 = get_pos(key,msg[i]) | |
r1,c1 = get_pos(key,msg[i+1]) | |
if r0 == r1: | |
ptxt += get_letter(key,r0-1,c0-1) + get_letter(key,r1-1,c1-1) | |
elif c0 == c1: | |
ptxt += get_letter(key,r0+1,c0+1) + get_letter(key,r1+1,c1+1) | |
else: | |
ptxt += get_letter(key,r0-1,c1+1) + get_letter(key,r1-1,c0+1) | |
return ptxt | |
def playfair_enc(key, msg): | |
assert len(msg) % 2 == 0 | |
assert len(key) == 25 | |
ctxt = '' | |
for i in range(0, len(msg), 2): | |
r0, c0 = get_pos(key, msg[i]) | |
r1, c1 = get_pos(key, msg[i+1]) | |
if r0 == r1: | |
ctxt += get_letter(key, r0+1, c0+1) + get_letter(key, r1+1, c1+1) | |
elif c0 == c1: | |
ctxt += get_letter(key, r0-1, c0-1) + get_letter(key, r1-1, c1-1) | |
else: | |
ctxt += get_letter(key, r0+1, c1-1) + get_letter(key, r1+1, c0-1) | |
return ctxt | |
def make_flag(msg): | |
return 'SharifCTF{%s}' % md5(msg.replace(' ', '').upper().encode('ASCII')).hexdigest() | |
import itertools | |
import sys | |
if __name__ == '__main__': | |
ctxt = "KPDPDGYJXNUSOIGOJDUSUQGFSHJUGIEAXJZUQVDKSCMQKXIR" | |
for i in itertools.permutations("ABCDEFGHIJKLMNOPQRSTUVWXYZ ",5): | |
new_key = "".join(i) | |
key = make_key(new_key) | |
p = playfair_dec(key,ctxt) | |
if "SHARIF" in p and "CONTEST" in p: | |
print " [!] found" | |
print " Key: %s" % new_key | |
print " Decrypt: %s" % p | |
break | |
# Notice that flag is generated using "msg", not "msg2". | |
# After decryption, you get "msg2". | |
# You must manually add spaces and perform other required changes to get "msg". | |
# flag = make_flag(msg) | |
# print(flag) | |
print playfair_dec(make_key("BROWN"),"KPDPDGYJXNUSOIGOJDUSUQGFSHJUGIEAXJZUQVDKSCMQKXIR") | |
key = make_key("BROWN") | |
msg2 = make_message("Currently the seventh SharifCTF contest is being held") | |
ctxt = playfair_enc(key, msg2) | |
print(ctxt) # KPDPDGYJXNUSOIGOJDUSUQGFSHJUGIEAXJZUQVDKSCMQKXIR | |
if ctxt == "KPDPDGYJXNUSOIGOJDUSUQGFSHJUGIEAXJZUQVDKSCMQKXIR": | |
print "win" | |
flag = make_flag("Currently the seventh SharifCTF contest is being held") | |
print flag |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment