Theory/Cipher protocol

Ciphertext Only Attack(암호문 단독 공격) 구현

D4tai1 2019. 5. 31.

1. Ciphertext Only Attack(암호문 단독 공격)

▶ 공격자가 암호문만 알고 있을 때 사용할 수 있는 암호해독 기법이다.

▶ 암호공격 시 오직 암호문만 가지고 평문이나 키를 찾아야 하기 때문에 공격자 입장에서는 가장 어려운 공격방식이다.

▶ 대부분의 사람이 암호를 깬다고 얘기하는 말은 암호문 단독공격에 해당한다.

▶ 뭐.. 이유는 무차별공격, 빈도수분석 등의 공격이기 때문이다.

▶ 이용하는 방법은 평문의 통계적 성질 및 문장의 특성을 추측해서 해독을 시도한다.

 

(1) 소스

msg = '53%%#305))6*;4826)4%=\')4%);806*;48#8@60\'))85;1%(;:-%*8#83(88)5*#;46(;88*96*?;8)*%(;485);5*#2:*%(;4956*2(5*c4)8@8*;4069285);)6#8)4%%;1(%9;48081;8:8%1;48#85;4\')-485#528806*81(%9;48;(88;4(%?34;48)4%;161;:188;%?;'  # 메세지 내에서 어떤 문자가 몇 개 나왔는지.... # 빈도수를 체크하는 프로그램 # 구조는 딕셔너리[키(문자)에 대한 값(개수)]으로 구성  # 암호문만 알고 있을때 사용 가능!!! # 빈도수 많은 걸로 맞춰가는 것 외에 방법이 없음  def check(msg):     fa = {}     for c in msg:         if c in fa:              fa[c] += 1         else:              fa[c] = 1       return fa     def dec(msg):     pmsg = ''     for c in msg:         # 통계적 기법을 이용하여         # 재일 많이 나온 순서대로 영문자 출현빈도수와 비교해서 치환         if c == '8':             c = 'e'          elif c == ';':             c = 't'          elif c =='4':             c = 'h'          elif c =='#':             c = 'a'           pmsg = pmsg + c          # 치환한 문자로 문자열 생성      return pmsg  def main():     fa = check(msg)     cnt = 0     # 한 줄에 3개씩 출력      # 딕셔너리의 키와 값을 출력     for k, v in fa.items():         cnt += 1         if cnt % 3 == 0:             print("'{}' = {} \t".format(k, v))         else:             print("'{}' = {} \t".format(k, v), end = '')     print()      # 딕셔너리를 리스트로 내림차순 정렬     fal = sorted(fa.items(), key = lambda x:x[1], reverse=True)     # fa.items()의 딕셔너리의 키와 값의 세트가 끝날때까지      # + x에 넣어주고 :을 기준으로 앞이 파라미터, 뒤가 리턴값     # x의 1번째 인덱스 즉 개수를 가지고 내림차순정렬      print(type(fal), '>> 내림차순 출력')     # 이때 sorted함수는 리스트 내의 튜플이 들어간 형태로 반환      cnt = 0     for index in fal:         set(index)  # 튜플을 집합형 데이터로 변경         cnt += 1         if cnt % 3 == 0:             #print(" {} \t".format(i))             print("'{}' = {} \t".format(index[0], index[1]))         else:             print("'{}' = {} \t".format(index[0], index[1]), end='')     print()      pmsg = dec(msg)     print(pmsg)  if __name__ == '__main__':     main()

 

  ▶ 통계적 성질을 이용해서 영어 문장에서 출현빈도가 높은 순서대로 [e, t, a, o, i..]이다.

  ▶ 이러한 부분이 확률이기 때문에 정확하지 않으므로 빈도 수가 비슷할 경우 바꿔서도 공격코드를 작성해보아야 한다.

  ▶ 이 공격은 암호문이 길수록 유리하다. 

 

(2) 시연

 

 

댓글