Theory/Cipher protocol
Known Plaintext Attack(기지 평문 공격) 구현
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] 시연
▶ 찾은 알파벳은 암호대신 사용해서 출력해서 해독할 수 있다.
▶ 알려진 평문을 많이 얻을수록 해독률이 높아진다.
'Theory > Cipher protocol' 카테고리의 다른 글
kerberos 버전별 구현[소스] (0) | 2019.06.30 |
---|---|
Ciphertext Only Attack(암호문 단독 공격) 구현 (0) | 2019.05.31 |
RSA를 이용한 전자서명(디지털서명) 구현 (0) | 2019.05.31 |
RSA공개키를 이용한 암호화 구현 (0) | 2019.05.30 |
3DES를 이용한 암호화 (0) | 2019.04.11 |
댓글