"암호문 단독공격"의 두 판 사이의 차이
3번째 줄: | 3번째 줄: | ||
예를 들자면, 영어로 된 평문을 암호화시킨 암호문을 암호문 단독 공격으로 얻어냈을 때 영어에서 가장 많이 쓰이는 글자가 e이기 때문에 가장 많이 나오는 글자는 e일 것이라고 예측을 하는 것이다. | 예를 들자면, 영어로 된 평문을 암호화시킨 암호문을 암호문 단독 공격으로 얻어냈을 때 영어에서 가장 많이 쓰이는 글자가 e이기 때문에 가장 많이 나오는 글자는 e일 것이라고 예측을 하는 것이다. | ||
+ | |||
+ | == 개요 == | ||
+ | 공격자가 가장 적은 정보를 가지고 공격하는 것을 암호문 단독 공격이라 한다. 이 공격에서 공격자는 같은 암호키를 사용하여 같은 알고리즘으로 암호화된 유한 암호문 집합만을 가지고 있다. 따라서 공격자의 목표는 대응되는 평문을 찾거나 사용된 암호키를 찾거나 암호 | ||
+ | 키를 찾지 못하였지만 암호키 없이 암호문을 복호화할 수 있는 새로운 알고리즘을 발견하는 것이다. 기지 평문 공격에서 공격자는 암호문뿐만 아니라 대응되는 평문도 가지고 있다. 하지만 가지고 있는 암호문/평문 쌍을 공격자가 선택할 수 없다. 이 공격에서 공격자의 목표는 사용된 암호키를 찾거나 암호키를 찾지 못하였지만 암호키 없이 암호문을 복호화할 수 있는 새로운 알고리즘을 발견하는 것이다.<ref> index-of, 〈[http://index-of.co.uk/Cryptology/01.pdf 제 1 장 암호알고리즘 개요]〉, 《개인 웹 사이트》</ref> | ||
+ | |||
+ | == 구현 == | ||
+ | ===소스=== | ||
+ | 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() |
2019년 7월 31일 (수) 13:03 판
암호문 단독공격 (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__'
- ↑ index-of, 〈제 1 장 암호알고리즘 개요〉, 《개인 웹 사이트》