암호문 단독공격

위키원
ksj4572 (토론 | 기여)님의 2019년 7월 31일 (수) 13:31 판 (시연)
이동: 둘러보기, 검색

암호문 단독공격 (Ciphertext Only Attack; COA)이란 Eve(도청자)는 알고리즘을 알고 있고, 암호문을 가로챌 수 있다는 가정하에 Eve가 어떤 암호문을 얻어서 대응되는 평문과 키를 찾는 것으로,Eve는 암호문을 가지고 통계적 성질, 문장의 특성 등을 추정하여 해독하기 때문에,가장 쉽게 적용될 수 있는 공격이다.

예를 들자면, 영어로 된 평문을 암호화시킨 암호문을 암호문 단독 공격으로 얻어냈을 때 영어에서 가장 많이 쓰이는 글자가 e이기 때문에 가장 많이 나오는 글자는 e일 것이라고 예측을 하는 것이다.

개요

공격자가 가장 적은 정보를 가지고 공격하는 것을 암호문 단독 공격이라 한다. 이 공격에서 공격자는 같은 암호키를 사용하여 같은 알고리즘으로 암호화된 유한 암호문 집합만을 가지고 있다. 따라서 공격자의 목표는 대응되는 평문을 찾거나 사용된 암호키를 찾거나 암호 키를 찾지 못하였지만 암호키 없이 암호문을 복호화할 수 있는 새로운 알고리즘을 발견하는 것이다. 기지 평문 공격에서 공격자는 암호문뿐만 아니라 대응되는 평문도 가지고 있다. 하지만 가지고 있는 암호문/평문 쌍을 공격자가 선택할 수 없다. 이 공격에서 공격자의 목표는 사용된 암호키를 찾거나 암호키를 찾지 못하였지만 암호키 없이 암호문을 복호화할 수 있는 새로운 알고리즘을 발견하는 것이다.[1]

구현

소스

msg = '53%%#305))6*;4826)4%=\')4%);806*;48#8@60\'))85;1%(;:-%*8#83(88)5*#;46(;88*96*?;8)*%(;
#메세지 내에서 어떤 문자가 몇 개 나왔는지....
#빈도수를 체크하는 프로그램
#구조는 딕셔너리[키(문자)에  대한 값(개수)]으로 구성
#암호문만 알고 있을 때 사용가능!!!
#빈도수 많은 걸로 맞춰가는것 외에 방법이 없음
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]

시연

d4tai1.@ubuntu ~/crypto/10week python3 COA.py
'5' = 12       '3' = 12       '%' = 16
'#' = 8        '0' = 6        ')' = 16
'6' = 11       '*' = 13       ';' = 26
'4' = 19       '8' = 33       '2' = 5
'=' = 1        '‘' = 3        '@' = 2
'1' = 8        '(' 10         '?' = 3
'c = 1
(class 'list') >> 내림차순 출력
'8' = 33        ';' = 26      '4' = 19
'%' = 16        ')' = 16      '*' = 13
'5' = 12        '6' = 11      '(' = 10
'#' = 8         '1' = 8       '0' = 6
'2' = 5         '9' = 5       '3' = 4
':' = 4         '‘' = 3       '?' = 3
'@' = 2         '-' = 2       '=' = 1
'c' = 1
53@@a305))6*the26)h%=')h%)te06*theae@60'))e5t1%(t:-%*eae3(ee)5*ath6(tee*96*?t
e)*%(the5)t5*a2:*%(th956*2(t*ch)e@e*th0692e5)t)6ae)h%%t1(%9the0e1te:e%1thheae5
th')-he5a52ee06*e1(%9thet(eeth(%?3hthe)h%t161t:1eet%?t[3]


각주

  1. index-of, 〈제 1 장 암호알고리즘 개요〉, 《개인 웹 사이트》
  2. D4tai1, 〈Ciphertext Only Attack(암호문 단독공격) 구현〉, 《티스토리》
  3. 인용 오류: <ref> 태그가 잘못되었습니다; .EC.B0.BE.EC.9D.84.EA.B1.B0라는 이름을 가진 주석에 제공한 텍스트가 없습니다

참고자료