송신자가 보내는 원래 형태의 메시지를 평문 또는 원문이라고 한다.
송신자는 평문을 암호화 알고리즘을 사용해서 암호화하며, 암호화된 메시지인 암호문은 다른 침입자가 해석할 수 없다.
이 암호화 알고리즘은 모든이에게 알려져있고, 누구나 쉽게 사용할 수 있다.
즉, 전송한 데이터를 침입자가 복원할 수 없게 해주는 비밀 정보가 필요한데 이것이 바로 키이다.

A(m)을 완성한다.A(m)을 복호화 알고리즘에 입력값으로 넣어 B(A(m)) = m 의 출력을 받는다.앨리스와 밥의 키가 동일하며 이 키는 둘만의 비밀이다.
키 중 하나는 세상 모두에게 알려져있고 다른 키는 앨리스 밥 중 한명만 알고 있다.
영어로된 원문에 대해 평문의 각 철자를 알파벳 순서로 k번째 뒤에 오는 철자로 대치한다. (철자들의 순환을 가정. z의 1번째 뒤에 오는 철자는 a다.)
여기서는 k의 값이 암호화 키가 된다.
하지만 카이사르 암호인 것을 알고 있다면 금방 암호문을 복호화할 수 있을 것이다.
카이사르 암호처럼 일정한 규칙에 따라 대치하는 대신 아무 규칙 없이 각 철자들을 고유한 대응 글자로 변환한다.
26! 정도의 문자 대응쌍이 가능하여 더 안전하다.
그러나 e나 t가 흔하게 나타나거나 3개 혹은 3개의 특정 문자가 함께 나오거나 하는 특성 탓에 암호를 해독하기 쉬워진다.
예를들어 암호문을 사용하는 사람의 이름이 평문에 들어가있다는 것을 안다면 즉시 알파벳 중 몇쌍을 확정 지을 수 있다.
침입자가 갖고 있는 정보에 따른 시나리오
여러 개의 단일 문자 대응법을 가지고 평문 메시지에서의 위치에 따라 서로 다른 단일 문자 대응 암호법을 사용한다.
즉, 같은 문자라도 평문 메시지에서의 위치에 따라 다르게 암호화 된다.
예를 들어, 단일 문자 대응법 첫번째를 C1, 단일 문자 대응법 두번째를 C2라고 해보자.
평문의 첫번째 메시지는 C1, 두번째는 C2, 세번째는 C1 … 식으로 평문 메시지의 위치에 따라 단일 문자 대응법을 달리 한다.
현재 TLS, PGP, IPsec 등에 사용되는 암호화 기법이다.
오늘날 널리 활용되는 블록 암호화 방법에는 AES, DES, 3DES 등이 있다.

블록 암호화에서는 메시지가 k 비트의 블록 단위로 쪼개어져 암호화 된다.
k 비트의 평문은 k 비트 블록의 평문을 k비트 블록의 암호문으로 일대일 사상 시킨다.
위 표와 같이 사상한다면 010110001111은 101000111001 로 암호화 된다.
k 비트에 대해서 총 (2^k)! 로 사상의 수가 천문학적으로 커진다.
그러나 k=64라고하면 송신자와 수신자 모두 2^64개의 입력 테이블에 대한 테이블을 유지해야하는데 이는 실행이 거의 불가능 하고, 키가 바뀌면 큰 테이블을 재생성해야 하기 때문에 실제 사용은 불가능 하다.

대신 블록 암호화 기법은 입출력 블록의 순열 테이블을 임의로 모방 생성하는 함수를 사용한다.
위 그림은 k=64일 때의 예시를 나타낸다.
시나리오
이 블록 암호화 알고리즘의 키는 블록을 뒤섞는 규칙이 알려져있다면 8개의 순열 테이블이다.
네트워크 애플리케이션에서는 일반적으로 긴 메시지를 암호화할 필요가 있는데, 블록 암호화를 이용하면 미묘하지만 중요한 문제가 발생한다.
2개 이상의 평문 블록이 동일하다면 같은 암호문을 생성해내고, 공격자는 동일한 암호문으로 원문을 추측해낼 수 있는 가능성이 생긴다.
여기에 하위 프로토콜에 대한 지식까지 활용하면 전체 메시지를 복호화할 수 있다.
이를 해결하기 위해 같은 평문 블록에 대해 다른 암호문 블록이 생성될 수 있도록 임의성을 추가할 수 있다.
시나리오
K(r(i) xor m(i)) = c(i) 암호문을 만든다.m(i) = K(c(i)) xor r(i) 를 수행한다.그러나 송신자는 2배의 비트를 더 보내야 하고 2배의 대역폭을 필요로 한다.
이 문제를 해결하기 위해 암호 블록 체이닝(Cipher Block Chaining, CBC) 기법을 사용한다.
시나리오
c(1)= K(m(1) xor c(0)) 을 계산한다.c(i)= K(m(i) xor c(i-1)) 암호문 블록을 생성하고 보낸다.
공개키 암호화에서는 송수신자가 각각 키를 갖는다기보다 수신자가 2개의 키를 갖는다.
하나는 세상 모두에게 알려진 공개키이고, 다른 하나는 수신자만 아는 개인키이다.
시나리오
RSA는 모듈로 n 연산(나머지)을 많이 사용한다.
모듈로 연산의 유용한 성질
[(a mod n)+(b mod n)]mod n=(a+b)mod n
[(a mod n)−(b mod n)]mod n=(a−b)mod n
[(a mod n)⋅(b mod n)]mod n=(a⋅b)mod n
// 3번째 성질로부터 나오는 식
(a mod n)^d mod n = a^d mod n
공개키와 개인키의 선택
n = pq, z =(p-1)(q-1) 식을 계산한다.큰 p와 q를 고르는 방법, 지수 연산 방법, e와 d를 고르는 방법 등은 이 책의 범위에서 벗어나므로 생략한다.
알고리즘 시나리오
c = m^e mod nm = c^d mod n = m^ed mod n 을 수행하여 복호화한다.e.g.
수신자가 p=5 , q=7로 선택한다.
이때 n = 35, z = 24가 된다.
5와 z가 공통인수가 없으므로 e = 5 를 선택한다.
5x29-1 (즉, ed-1) 이 24로 나누어떨어지므로 d= 29를 선택한다.
이제 공개키 (35,5)와 비밀키 (35,29)가 완성되었다.
이제 평문 m을 암호화 복호화 해보자.
m은 비트열 1100으로 숫자 12에 대응된다고 가정하자.
암호화 : m^e = 248832, 17(c) = 248832(m^e) mod 35(n)
복호화 : 12(m) = 4819685721067509150915091411825223071697(c^d) mod 68(n)
RSA에 필요한 지수 연산은 시간이 많이 필요하여 실제로 종종 대칭키 암호화와 함께 사용된다.
시나리오
m = m mod n= m^ed mod n 임을 증명하면 된다.
정수론에 의하면 p와 q가 소수이고 n = pq, z = (p-1)(q-1)이면, x^y mod n 이 x^(y mod z) mod n과 같다.
즉, 다음과 같은 식을 얻을 수 있다.
m^ed mod n = m^(ed mod z) mod n
ed mod z = 1이 되도록 e와 d를 선택하였으므로, m = m mod n= m^ed mod n 이다.
여기서 e와 d는 단순 제곱이므로 둘을 바꿔도 정상 동작한다.