Skip to content

Instantly share code, notes, and snippets.

@CreateRemoteThread
Created December 18, 2016 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CreateRemoteThread/39eeb7192c8861940614a284ef83f4be to your computer and use it in GitHub Desktop.
Save CreateRemoteThread/39eeb7192c8861940614a284ef83f4be to your computer and use it in GitHub Desktop.
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