본문 바로가기
CTF_/suninatas.com

[Suninatas] Forensic 26 풀이 _ Frequency analysis

by 낭람_ 2020. 11. 12.
반응형

 

띄어쓰기와 .을 지웠다고 한다.. 

 

Frequency analysis 를 보니 빈도 분석을 이용하여 치환 암호를 해독하는 문제인거 같다.

 

import collections

string = "szqkagczvcvyabpsyincgozdainvscbnivpnzvbpnyfkqhzmmpcqhzygzgfcxznvvzgdfnvbpnjyifxmpcqhzygbpnoyaimygbzgngbvmpcqhzygcbpinnbzqndicgxhiztozgcfmpcqhzygbpnjyifxeagzyimpcqhzygbpneagzyidicgxhiztozgcfmpcqhzygcgxcoyaibzqnvyabpsyincggcbzygcfmpcqhzygszqzvbpnozivbvyabpsyincgozdainvscbnibyjzgcqnxcfcbcgzvaeagzyiyivngzyidicgxhiztnungbzvampcqhzygvpzhcgxbpnyfkqhzmdcqnvvpnzvbpnozivbonqcfnvscbnibyjzgbpnyfkqhzmdcqnvbpnjyifxmpcqhzygvpzhvbpnoyaimygbzgngbvmpcqhzygvpzhvcgxbpndicgxhiztozgcfvpnzvygnyobpnqyvbpzdpfkinmydgzlnxcbpfnbnvcgxqnxzcozdainvzgvyabpsyinccvyochizfbpzvkncivpnzvicgsnxvnmygxzgbpnjyifxrkbpnzgbnigcbzygcfvscbzgdagzygvpnzvbpnmaiingbinmyixpyfxnioyifcxznvzgbpnvpyibhiydicqbpnoinnvscbzgdcgxbpnmyqrzgnxbybcfagxnibpnzvaeaxdzgdvkvbnqvpnzvcfvybpnozivbonqcfnvscbnibyvaihcvvbpnbjypaxincxhyzgbqcisagxnibpnzvaeaxdzgdvkvbnqvpnpcvgnunirnnghfcmnxyoobpnhyxzaqzgpningbzinmcinni"

string = string.upper()


###################################################################################
# 제일 높은 알파벳 찾기
alpha = collections.Counter(string)
print("###Frequency Alphabet###")
alpha = sorted(alpha.items(), key=lambda item: item[1], reverse=True)
for i, j in alpha :
      print("["+i+" : "+str(j)+"]", end=" ")
print()

# 제일 높은 알파벳을 e로 변경
string = string.replace(alpha[0][0],'e')
###################################################################################


###################################################################################
# the가 될 수 있는 단어 찾기
word_the = collections.defaultdict(int)
for idx, alphabet in enumerate(string) :
      try :
            if alphabet == 'e' :
                  tmp = string[idx-2]+string[idx-1]+string[idx]
                  word_the[tmp] += 1
      except :
            pass

word_the = sorted(word_the.items(), key=lambda item: item[1], reverse=True)
print("\n###Frequency Word(the)###")
for i, j in word_the :
      print("["+i+" : "+str(j)+"]", end=" ")
print()

# 제일 높은 단어를 the로 변경
try :
      string = string.replace(word_the[0][0][0],'t')
      string = string.replace(word_the[0][0][1],'h')
except :
      pass
###################################################################################


###################################################################################
# that이 될 수 있는 단어 찾기
word_that = collections.defaultdict(int)
for idx, alphabet in enumerate(string) :
      try :
            if alphabet == 't' and alphabet[idx-3] == 't' :
                  tmp = string[idx-3]+string[idx-2]+string[idx-1]+string[idx]
                  word_that[tmp] += 1
      except :
            pass

word_that = sorted(word_that.items(), key=lambda item: item[1], reverse=True)
print("\n###Frequency Word(That)###")
for i, j in word_that :
      print("["+i+" : "+str(j)+"]", end=" ")
print()

# 제일 높은 단어를 that으로 변경
try :
      string = string.replace(word_that[0][0][2],'a')
except :
      pass
###################################################################################

print(string)

 

한 번 코딩으로 문제를 풀어보려 했으나.. 띄어쓰기 구분이 안되어 있어 코딩하기가 너무 힘들었다.. 

 

인터넷 검색을 하다보니 빈도 분석과 디코딩 기능까지 있는 사이트를 찾았다..

 

quipqiup.com/

 

quipqiup - cryptoquip and cryptogram solver

 

quipqiup.com

 

 

auto 로 맞춰두고 Solve를 누르면 아래쪽에 원문이 나오게 된다. (띄어쓰기도 해준다.)

 

 

사이트 즐겨찾기를 해둬야겠다. 

 

.. 김연아에 대한 내용이 담겨 있는 글인데.. 이제 무엇을 해야하는지 한참 고민했다.

 

.. 도저히 몰라서 구글링을 해보았다. 정답이 kimyuna다. .. .. .. 어떻게 알았지.. 

 

다른 사람들도 직접 코딩을 하진 않았고 모두 같은 사이트에서 문제를 푼거 같다.

반응형

댓글