Theory/Cipher protocol
Ciphertext Only Attack(암호문 단독 공격) 구현
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) 시연
'Theory > Cipher protocol' 카테고리의 다른 글
kerberos 버전별 구현[소스] (0) | 2019.06.30 |
---|---|
Known Plaintext Attack(기지 평문 공격) 구현 (0) | 2019.05.31 |
RSA를 이용한 전자서명(디지털서명) 구현 (0) | 2019.05.31 |
RSA공개키를 이용한 암호화 구현 (0) | 2019.05.30 |
3DES를 이용한 암호화 (0) | 2019.04.11 |
댓글