암호학 Stage2
고전암호
고전 암호는 컴퓨터와 같은 고성능 연산 장치가 발명되기 전에, 비교적 간단한 기계와 손 등으로 암복호화를 수행하던 암호를 말합니다. 고전 암호는 일반적으로 치환(Substitution)과 전치(Transposition)의 방법으로 설계됩니다.
치환 암호는 단일 문자 치환 암호(Monoalphabetic Substitution Cipher)와 다중 문자 치환 암호(Polyalphabetic Substitution Cipher)로 나누어집니다.

단일 문자 치환 암호(Monoalphabetic Substitution Cipher)
평문의 각 문자를 약속된 다른 문자로 치환하는 암호입니다. 복호화를 위해 치환의 대응 관계는 일대일 대응이다.
[카이사르 암호]
평문의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 방식이다. 이를 복호화할 때는 암호문의 각 문자를 다시 원래 위치로 밀어서 평문을 구한다. 송신자와 수신자가 몇 칸을 밀 것인지를 사전에 합의해야 통신이 이뤄질 수 있다. 하지만 알파벳을 밀어서 암호화하는 특성상, 키 공간의 크기가 작기 때문에 컴퓨터를 사용하면 쉽게 복호화가 된다는 단점이 있다.
+춤추는 인형, 코드북 암호
다중 문자 치환 암호(Polyalphabetic Substitution Cipher)
평문의 한 문자가 암호문에서 여러 종류의 문자로 치환될수 있습니다.
[비제네르 암호(Vigenere Cipher)]

[전치 암호(Transposition Cipher)]
평문을 구성하는 문자들의 순서를 재배열하여 암호문을 만든다. 평문을 정해진 길이의 블록들로 나누고, 규칙을 적용하여 블록 안의 문자들을 재배치한다.
전치 암호의 대표적인 예시로는 기원전 450년에 고대 그리스인들이 발견한 스키테일 암호(Scytale Cipher)가 있다.
고전 암호 공격
고전 암호 공격에는 전수 키 탐색 공격(Exhaustive Key Search Attack)과 빈도수 분석(Frequency Analysis)이 있다.
1. 전수 키 탐색 공격(Exhaustive Key Search Attack)
전수 키 탐색 공격은 평문과 암호문을 알 때, 키 공간을 전부 탐색하며 주어진 암호문과 같은 암호문을 생성하는 키를 찾는 방법이다. 굉장히 단순한 공격 방법이지만 키 공간의 크기가 작다면 빠른 시간안에 키를 찾고, 암호를 해독할 수 있다.
*카이사르는 이 공격 방법에 취약하다.
2. 빈도수 공격
추측을 바탕으로 암호문을 복구하는 방식이다.
다중 치환 암호는 통계적 특성이 사라지기 때문에, 빈도수 공격으로부터 비교적 안전하다고 알려져 있다.
Q1, Q2

Q1. 다중치환 암호는 한 문자가 암호문에서 여러 문자로 치환되기 때문에 전사적 공격으로 암호문을 복호하하기 어렵다.
Q2. 단일 치환 암호는 통계적 특성이 있기 때문에 빈도수 공격이 가능하다.
현대암호
- 혼돈(Confusion): 암호문으로부터 평문의 정보를 유추하지 못하게 하는 성질
- 확산(Diffusion): 평문의 작은 변화가 암호문의 큰 변화로 나타나게 하는 성질
대칭키 암호 시스템(Symmetric Key Cryptosystem)
대칭키 암호 시스템은 암호화와 복호화에 같은 키를 사용하는 암호 시스템이다. 크게 블록 암호와 스트림 암호로 구분한다.
대칭키 암호 시스템은 속도가 빠르다는 장점이 있다. 하지만 송신자와 수신자가 사전에 키를 교환해야 한다는 제약이 있고 새로운 상대와 통신할 때마다 계속 키를 생성해야 한다는 불편함이 있다.
1. 블록 암호
블록 암호(Block Cipher)는 평문을 정해진 크기의 블록 단위로 암호화하는 방식이다. 예를 들어 블록의 크기가 4바이트라면 평문을 4바이트의 블록으로 쪼개어 각 블록마다 암호화를 진행한다.
만약 평문의 크기가 블록 크기의 배수가 아니어서 블록으로 균등하게 쪼갤 수 없다면, 평문뒤에 데이터를 추가하는 패딩(Padding)을 먼저 수행한다. 패딩은 평문이 블록 크기의 배수가 될 때까지 데이터를 추가한다. 블록 암호의 대표적인 예시로는 DES와 AES가 있다.
2. 스트림 암호
수신자와 송신자가 공유하는 스트림을 이용하여 데이터를 암호화하는 방식이다. 단순한 연산으로만 구현되므로 속도는 빠르지만, 블록 암호보다 안전하지 않다고 알려져 있다. 일반적으로 성능이 부족한 임베디드 장비나 빠른 속도가 필요한 제한적 환경에서 사용된다.
평문을 P, 암호문을 C, 스트림을 X라고 할 때, 암호문 C는 C=P⊕X로 생성된다.
X⊕X=0이므로 수신자는 C⊕X=P⊕X⊕X=P로 암호문을 복호화할 수 있다.
송신자와 수신자는 스트림을 공유하는 대신, 시드(Seed)라 불리는 작은 값을 공유하고, 이를 사전에 합의된 함수의 인자로 넣어 스트림을 각자 생성합니다.

공개키 암호 시스템(Public key Cryptosystem)
송신자는 수신자의 공개키로 데이터를 암호화하여 수신자에게 전송하고, 수신자는 자신의 비밀키로 이를 복호화합니다.
공개키 암호 시스템에서는 그룹 내의 사람들이 각자의 공개키와 비밀키를 만든 후 공개키만 공개하면 되므로 N명의 사람이 있을 때 2N개의 키만 필요합니다. 이는 N(N-1)/2개의 키가 필요했던 대칭키 암호 시스템보다 훨씬 적습니다. 또한 한 번 키를 생성하고 나면, 새로운 상대와 통신하더라도 자신이 키를 다시 만들어야할 필요가 없습니다.
하지만 속도가 느리고 안전성을 제공하려면 긴 키를 사용해야 한다는 단점이 있다. 대칭키 암호 시스템인 AES는 192 비트 이상의 키를 사용하면 충분히 안전하지만, 공개키 암호 시스템인 RSA는 2048 비트 이상의 키를 사용할 것이 권장됩니다.
암호의 기능
- 기밀성(Confidentiality)
- 무결성(Integrity)
- 인증(Authentication)
- 부인 방지(Non-repudiation)
Q1.

위 문제를 보면 MINDBBLUE와 MINTBLUE의 암호화 된 암호가 비슷한 것을 볼 수 있다. 이것은 평문의 작은 변화가 암호문의 큰 변화로 나타나게 하는 성질인 확산 성질을 만족하지 못한 것이다.
Q2.

공개키 암호 시스템에서 비밀키는 타인이 알아낼 수 없기 때문에 틀렸다.
Q3.
