2022. 9. 16. 19:13ㆍExploit Concept/Crypto

🌈
고전암호
치환과 전치에 대해 정의한 후, 상징하는 암호 기법에 대해 알아보자.
고전 암호는 현대의 암호와 비교해서 아주 간단하게 이루어져 있다. 그 때문에 쉽게 복호화가 될 수 있는 이들은 실생활에서는 사용되지 않지만, 보안을 공부하기 위해서라면 간단한 만큼 의미가 있다.
1. 아주 간단하게 배울 수 있기에 고전 암호를 공부하며 암호학을 시작하자.
==> 시작이 반이라는 말이 있다. 시작이 그만큼 중요하다는 것인데, 고전 암호는 암호학의 시작을 할 수 있게 해준다. 실제로 직접 key를 통해 암호문을 만드는 프로그램을 제작할 수도 있고, key를 모르는 암호문을 복호화 할 수도 있다. 이러한 방법들이 아주 쉽게 이뤄질 수 있기에, 첫 암호 공부로 고전 암호는 많은 경험들을 제공해줄 것이다.
2. 이 정도는 알아야 한다.
==> 보안을 공부하는 사람으로써 우리는 워게임을 하면서 암호학 문제를 마주칠 수밖에 없다. 고전 암호는 이러한 암호학 문제에서 점수를 주기 위한 문제로 등장한다. 이런 것들은 챙겨야 하지 않을까?
🔅 환경
블로그에서 사용되는 사이트들을 모아놓았다. 사용할 때 언급할 것이지만 사용 전에 올려놓는다.
- 자동 암호화 복호화 사이트 : https://gchq.github.io/CyberChef/

- 파이썬 가상환경 : https://colab.research.google.com/

- 빈도 수 분석 복호화 사이트 : https://quipqiup.com/

🍎
치환
평문의 문자를 다른 문자로 바꾸는 것
치환은 말 그대로 문자를 다른 문자로 바꾸는 것이다. 한 문자가 다른 문자 하나랑 대응되면 단일 문자 치환, 한 문자가 다른 여러 문자들이랑 대응되면 다중 문자 치환이라고 부른다. 각각에 대해 알아보자.
🍏 단일 문자 치환

셜록 암호라고 구글창에 검색하면 여러 사람 그림들이 나온다. 셜록홈즈와 춤추는 사람 그림이라는 이 암호는 사실 각각의 사람들이 알파벳 하나에 대응된 단일 문자 치환 암호이다. 어떤 그림이 어떤 문자와 대응되는지 규칙을 알면 이 암호문을 해독할 수 있다.
== 카이사르 암호(Caesar Cipher) ==
시저 암호라고도 불리는 이 암호는 대표적인 단일 문자 치환 암호이다. 다들 한 번씩 들어봤을 것이다. 알파벳을 일정 수만큼 밀어내서 암호문을 만드는 기법

예를 들어 평문이 "apple"이고 key가 3이라면 a는 밀려나서 d가 되고, p는 s, l은 o, e는 h가 되어 "dssoh"라는 암호문이 탄생하는 것이다. 이 암호문을 받은 사람이 key가 3이라는 것을 알고있다면 거꾸로 돌려 다시 apple이라는 단어를 받아낼 수 있을 것이다. (이 과정을 복호화라고 한다)
CyberChef라는 사이트에서는 이러한 암호화, 복호화를 쉽게 실습할 수 있게 해준다 : https://gchq.github.io/CyberChef/

caesar라고 검색하는 내용들 중, ROT13에서 Amount 값을 바꿈으로써 시저 암호 암호화 복호화가 가능하다. (음수를 넣으면 거꾸로 돌려지기에 복호화가 된다)
ROT13은 카이사르 암호 중 key가 13일 때의 상황을 따로 말하는 이름이다. 알파벳의 수는 총 26개이기 때문에 key가 13인 카이사르 암호로 두 번 암호화하면 원래의 평문으로 돌아온다. 이 특이한 성질 덕에 ROT13이라는 이름이 따로 붙었다. CyberChef에서는 이러한 이름과는 다르게 key가 13이 아닌 경우들도 다루고 있다.
알파벳의 카이사르 암호의 경우 바뀔 수 있는 암호문이 총 25개 밖에 되지 않기 때문에 Brute Force 공격(무작위 대입법)으로 쉽게 파훼가 된다. CyberChef에서 ROT13 Brute Force 부분을 통해 이 점을 실습할 수 있다.

복잡한 암호학의 경우 복호화를 위해 프로그래밍을 해야하는 경우들이 있다. 그러한 경우들을 위해 쉬운 고전 암호에서 프로그래밍 기술들을 익혀둘 필요가 있다. 카이사르 암호 또한 프로그래밍이 가능하다.
https://colab.research.google.com/
파이썬 프로그래밍을 지원하는 colab 사이트를 통해 카이사르 암호문을 프로그래밍 해보자.
# caesar 암호
def caesar(s, n):
res = ''
for i in s:
if i.isupper():
res += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
elif i.islower():
res += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
return res
문자열 s와 key n을 인자로 넣으면 암호화된 결과를 반환해주는 함수이다. ctf나 워게임 등의 상황들에서 필요하면 사실 그냥 복사해서 사용하면 된다. 다만, 여유가 된다면 프로그래밍 실력을 위해 한 번쯤 스스로 코딩해보거나 이 코드를 따라 쳐보는 것을 추천한다. 이 함수를 이용해 반복문을 돌리면 Brute Force 공격도 가능하다.
2020 사이버공격방어대회 (cce)

다음은 ctf crypto 기출문제를 들고 왔다. 시저 암호가 실제로 사용된다는 점을 얘기해주고 싶었다. cce ctf의 Flag형식이 cce2020{~~~~}임을 이용해서 풀 수 있는 문제이다. (풀면 댓글로 알려주세요!!) 이외에도 시저 암호는 나중에 설명할 비제네르 암호와 함께 아주 쉬운 난이도의 문제도 출제되는 형식이다. 예전에 본 문제 중에서는 로마의 암호 어쩌구 하면서 문제를 냈었는데, 구글에 쳐보니 카이사르 암호였던 문제도 있었다.
🍏 다중 문자 치환

다중 문자 치환은 한 문자에 여러 문자가 대응되어 치환되는 암호이다. 이런 정의만 들으면 갸우뚱 할 수 있다. 대표적인 암호에 대해 알아보며 좀 더 이해를 해보자.
== 비제네르 암호(Vigenere Cipher) ==
비제네르 암호는 카이사르 암호에서 다음의 것들이 바뀐다.
- key가 하나가 아니라는 것. 복수개의 key라면 key의 순서대로 알파벳이 밀린다.
- 여러 개의 key를 적기 위해 정수가 아닌 문자열을 사용했다는 것. 0 대신 a, 1 대신 b ...
비제네르 암호는 단어의 위치에 따라 밀리는 정도가 달라질 수 있는 암호이다. 예를 들어, "apple"이라는 평문에서 key가 "adb"라면 a는 0번 밀리고, p는 3번 밀리고, p는 1번 밀리고, l은 0번 밀리고, e는 3번 밀려, "asqlh"가 되는 식이다. 이 예시에서도 알 수 있듯이 key는 순서대로 평문의 알파벳을 밀고, key의 문자열이 끝났을 때는 다시 처음으로 돌아온다.

CyberChef를 이용해 apple를 asqlh로 암호화한 사진이다. CyberChef에서는 Vigenere Encode를 통해 암호화를 Vigenere Decode를 통해 복호화를 할 수 있다. 비제네르 암호는 평문의 문자 하나가 암호문의 문자 하나에 대응되는 치환 암호이므로, key를 모르는 암호문에서 key에 하나하나 넣어가며 평문을 유추해낼 수 있다.
def Vigenere(text, key):
# caesar 암호
def caesar(s, n):
res = ''
for i in s:
if i.isupper():
res += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
elif i.islower():
res += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
return res
#### vigenere 암호
res = ''
for i in range(len(text)):
res += caesar(text[i], ord(key[i % len(key)]) - ord('a'))
return res
print(Vigenere('apple','adb'))
위의 카이사르 암호 코드를 통해 만든 Vigenere 암호의 파이썬 코드이다.

Vigenere 암호의 문제도 기초 crypto 실력을 시험하기 위해 ctf나 워게임에서 출제된다. 위의 문제는 노말틱 유튜버님이 주최한 Hacking Land의 crypto 1번 문제이다. 문제 이름에서부터 vigenere라고 설명해 준 아주 친절한 문제이다. (이것도 댓글로 답 올려주세요!!)
이 이외에도 프랑스의 암호라며 암호문을 제공해줬는데, 구글에 검색하니 비제네르 암호였던 문제도 있었다.
🍏 빈도수 분석 공격

치환 암호하면 빠질 수 없는 것이 빈도수 공격이다. 치환 암호 중에서도 카이사르 암호 같은 단일 치환암호는 평문과 암호문의 알파벳이 일대일 대응이 되기 때문에 평문의 통계적 특성이 유지된다. e가 가장 많이 쓰이고 q나 z가 엄청 적게 쓰이는 이러한 특징. 이를 통해 단일 치환 암호는 빈도수 분석 공격을 노려볼 수 있다.
이 사이트에서는 이러한 빈도수 분석 공격을 통해 단일 치환 암호를 복호화한다.
(평문의 통계적 특성이 중요한 만큼 암호문의 길이가 길 수록 복호화하기가 편하다.)
관련 문제로는 써니나타스 26번 문제가 있다.
🍎
전치
평문 문자들의 위치를 바꾸는 것
치환 암호는 문자 각각을 바꾸는 암호였다면 전치 암호는 문자의 위치를 바꾸는 암호이다.
🍏 스키테일 암호

대표적인 전치 암호로는 스키테일 암호가 있다. 암호문을 주고 받는 서로가 특정한 크기의 나무봉을 주고 받고 이 나무봉에 암호문이 적힌 종이를 돌돌 말아 복호화하는 암호문이다.