2024. 4. 3. 16:28ㆍ대학교/정보보안
카이사르 암호 만들기에 이어, 단일 치환 암호(랜덤) 을 만들어보겠다.
내가 만들고자 하는것은 전에 설명했던 하나의 문자가 랜덤한 문자에 1 : 1 대응하는것!..
26! 가지의 경우의 수가 있는 암호를 만들어보자!!
일단 암호는 예측 불가능해야지 진정한 암호라고 할 수 있다. 그러기 위해서는 난수라는 것이 존재해야한다.
난수를 이용한 Shuffle이다 나는 fisher yates shuffle 방식을 이용할것이다..(fisher yates라는 사람이 고안해낸 알고리즘이라고 한다.)
간단하게 말하자면.. Shuffle을 할 대상의 끝지점부터 끝지점까지 돌면서 랜덤한 수를 뽑아 서로 위치를 뒤바꾸는 것!
랜덤한 수의 범위는 내 위치부터 끝까지임. 범위를 좁히는것이 특징이다.
원본 문자와 복사본을 준비하고.
fisher yates shuffle을 이용해서 무작위로 섞는다.
앗 하지만 오류가 발생하였다.
파이썬에서 문자열은 불변 객체라고 한다. 변경할 수 없다는 것.
변수에 다른 값을 담을 수 있으니 그것이 변하는 것 아닌가? 라고 생각할 수도 있지만 내부적으로는 새로운 값이 들어오면 새로운 공간에 저장. 그 공간에 저장된 값을 임의로 변경할 수 없는것을 불변객체 라고 함.
암튼..그래서 리스트가 필요한 것 같다.
list함수로 변경한 후, 다시 shuffle을 진행한다.
테이블을 출력해보면 아주 잘 나오는것을 확인할 수 있다.
이게 왜 1 : 1 관계냐! 위치값을 서로 공유하기 때문에 그렇다고 할 수 있다. 암튼 이제 테이블이 완성이 되었으니 암호화를 진행하면 된다.
이렇게 암호화를 진행할 수 있다.
암호문이 이렇게 뿅! 나왔는데, 여기서 주의깊게 평문과 암호문을 들여다보자.
그렇다... hello에서 l이 두번 연속되니 uakkv 라는 암호문도 kk가 두번 연속된다. 1 : 1 대응 관계이기 때문에 어쩔 수 없이 암호문에서 연속되는것을 찾을 수 있다.
그렇게 되니 어떤 생각을 하는가...? brute force 공격 대신에 이 빈도를 분석해서 암호문을 해석하자는 생각이 나온것이다.
실제로 사용하는 영어 문자 빈도수와 암호문에서 나오는 문자의 빈도수를 비교해서 넣어보는것이다.
영어 할 때 the,there,that,are,is 등등 필수로 나오잖는가. 여기서 많이 나온것이 무엇인가... t와e 아닌가? 이런식으로 찾는것이다.
빈도를 분석하기 전, 우리는 저 암호문의 수치를 수기로 기록하기란 너무 힘들고 오차가 발생할 확률이 크다.
그렇다 이것도 프로그램으로 돌리면 그만!
matplotlib라이브러리를 이용해 그래프를 그려보자.
이렇게 문자가 나온 수만큼 값을 증가시키면 된다.
X축은 알파벳, Y축은 그에 해당하는 값으로 구성되어 있다. 한번 테스트를 진행해보자.
abbcccddddeeeef를 넣었고, 암호문으로 xrrsssbbbbvvvvvt 가 나왔다. 즉 v가 5번 b가 4번 s가 3번이 나왔다 이를 분석한 그래프를 그려본다면
다음과 같은 그래프가 나왔다. 정상적으로 나온것을 볼 수 있다.
이제 진짜 영어 문자의 빈도 수를 알아볼 차례이다.
- E
- T
- A
- O
- I
- N
- S
- H
- R
- D
- L
- C
- U
- M
- W
- F
- G
- Y
- P
- B
- V
- K
- J
- X
- Q
- Z
라고 한다. 즉 여기서 제일 높은 수치 E와 암호문 빈도 분석을 통해 제일 높은 수치가 나온 V 두개가 있으니...
암호문의 V는 E가 아닐까라는 추측으로부터 시작하는것이다.
지금은 aaabbbccc이런 이상한 문자를 써서 그렇지 제대로 된 글이면 맞출 확률이 높다.
이런식으로 해서 알맞는 문자를 맞춰나가는 과정이다. 귀찮아서 그것은 패스하겠다.
'대학교 > 정보보안' 카테고리의 다른 글
비즈네르 암호 - Vigenere Cipher (0) | 2024.04.08 |
---|---|
단일 치환 암호 (0) | 2024.04.02 |
카이사르 암호 (0) | 2024.04.02 |