Theory/Cipher protocol

Known Plaintext Attack(기지 평문 공격) 구현

D4tai1 2019. 5. 31.

1. Known Plaintext 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;%?;'  # 알려진 평문이 있을 경우 사용 가능  # 이 암호문 중에 goodglass, mainbranch 단어가 있는 것을 알 때  # 패턴을 비교해야 함..  # 즉, 문자열을 선형으로 넘버링해서 비교(선형화 -> 선형공격) # 실제 정규표현식 내부가 이런 식으로 구성됨  def make(hint):     tmp = {}    # 순서를 저장     res = ''     index = 0      for c in hint:         if c in tmp:             res += tmp[c]         else:             # 없으면             tmp[c] = str(index)             # 단어에 대한 인덱스를 딕셔너리에 넣기              res += str(index)             # 리스트에 단어에 대칭하는 인덱스를 추가              index += 1      return res     #return ':'.join(res)   # 리스트를 :로 구분지어 문자열로 반환  def find_pattern(msg, hint):     pattern = make(hint)    # 선형화     psize = len(hint)       # 선형화한 문자열의 길이     pos = 0     # 암호문내에서 비교할 시작인덱스      while True:         data = msg[pos:pos+psize]         # 시작점부터 문자열의 길이까지          if len(data) < psize:             # 길면 나가기             break          d_pattern = make(data)         # data에 대한 패턴                if d_pattern == pattern:             return data         pos += 1  def dec(msg, key):     pmsg =''      for c in msg:         if c in key:             c = key[c]          pmsg = pmsg + c      return pmsg  def main():     print('---------------------------- 암호문 ------------------------------')      print(msg)     print()      key = {}      hint1 = 'goodgress'     hint2 = 'mainbranch'      result1 = make(hint1)     print('1) 알려진 평문[goodgress]의 패턴 : {}'.format(result1))      data = find_pattern(msg, hint1)      index = 0     for k in data:         key[k] = hint1[index]         index += 1      print('2) 알려진 평문의 알파벳')     print(' [+] {}\n'.format(key))      result2 = make(hint2)     print('3) 알려진 평문[mainbranch]의 패턴 : {}'.format(result2))      data = find_pattern(msg, hint2)      index = 0     for k in data:         key[k] = hint2[index]         index += 1      print('4) 알려진 평문의 알파벳')     print(' [+] {}'.format(key))      pmsg = dec(msg, key)      print('-------------------- 찾은 알파벳으로 복호화 ----------------------')     print(pmsg)  if __name__ == '__main__':     main()

 

 [2] 시연

▶ 찾은 알파벳은 암호대신 사용해서 출력해서 해독할 수 있다.

▶ 알려진 평문을 많이 얻을수록 해독률이 높아진다.

 

 

댓글