Intro.
암호학의 양대산맥인 대칭키 암호와 비대칭키 암호에 대해서 알아보자. 대칭키와 비대칭키 말고도 일방향 해시 함수와 하이브리드 암호도 있다. 하지만, 대킹키 암호와 비대칭키 암호가 차지하는 지분이 굉장히 크기 때문에 이 둘을 중점적으로 알아보자. 정보보안개론 1등의 위엄을 보여주도록 하겠다. 근데 일단 암호학에 대해서 아예 모른다는 전제 하에 간단한 용어들을 설명하겠다.
- 키: 암호화나 복호화에 이용되는 중요한 값 (금고 비밀번호)
- 평문: 감추고 싶은 정보의 원문 (금고 안에 든 내 돈)
- 암호문: 키를 이용해 암호화를 거쳐 알 수 없게 변형된 데이터 (잠긴 금고)
- 암호화: 키를 이용해 평문을 암호문으로 바꾸는 과정 (금고 안에 돈을 넣고 닫기)
- 복호화: 키를 이용해 암호문을 평문으로 해독하는 과정 (비밀번호 누르고 금고 열기)
대칭키 암호
암호화할 때 쓰는 키 값과 복호화 할 때 쓰는 키 값이 같은 암호들을 대칭키 암호라고 한다. 즉, 복호화하는 상대에게 나와 같은 키를 보내야 한다. 그 과정에서 키 값이 탈취당하거나 도용 당하면 그냥 끝이다. 그래서 키를 어떻게 관리하냐도 문제고 어떻게 전달하냐도 큰 문제다. 대신 속도가 빠르다는 장점이 있다.
대칭키 암호에는 치환 암호, 블럭 암호, 스트림 암호 등이 있다.
카이사르 암호
치환 암호의 대명사 격인 친구다. 알파벳을 순서대로 나열하고 해당 알파벳의 n번째 순서 뒤의 알파벳으로 치환하면 암호문이 된다.
ABCDE -> CDEFG
평문은 ABCDE, 암호문은 CDEFG이다. 나는 2번째 순서 뒤의 알파벳으로 치환했기 때문에 키 값은 2다.
암호문을 보고 2번째 전 순서인 알파벳으로 치환하면 평문이 나타나게 된다. (복호화)
즉, 암호화 할 때도 2라는 숫자를 썼고 복호화 할 때도 2라는 숫자를 썼기 때문에 키 값이 대칭이다.
이런 암호는 물론 전사 공격(하나하나 대입해보는 공격 방법)에 취약하다. 실제로 사용하는 암호는 매우 복잡하거나 공격에 소요되는 시간을 늘리기 위해 여러 암호를 같이 사용하기도 한다. 이제 대칭키 암호를 이해한 것 같으니 실제로 사용하는 대칭키 암호 알고리즘에 대해서 알아보자.
AES 암호 (Advanced Encryption Standard)
Advanced인 이유는 이전에 표준이었던 DES(Data Encryption Standard)를 대체 했기 때문이다.
일정한 단위(128비트, 16바이트)로 쪼개서 암호화 하는 블럭 암호의 일종으로 현재 대칭키 암호의 1황이라고 해도 과언이 아니다. 키의 길이에 따라 여러 버전이 있지만, 속도냐 보안이냐에 따라 AES-128과 AES-256이 대중적으로 쓰인다.뒤에 숫자는 키의 길이이다. (물론 비트 단위)
기본적은 AES는 4 x 4 격자에 데이터를 바이트 단위로 배치한 뒤(행렬?) 여러 번의 라운드를 거치며 데이터를 야바위마냥 마구잡이로 섞는다. 4단계의 암호화 알고리즘을 전부 거치면 한 라운드다. (게임의 라운드 개념이랑 비슷)
각 단계는 다음과 같다.
1. SubBytes (치환)
미리 정의된 표에서 각 바이트를 다른 바이트로 바꾼다. (처음으로 이미지 쓴다.)

2. ShiftRows (행 이동)
각 행마다 왼쪽으로 일정 칸만큼 밀어버린다.

3. MixColumns (열 혼합)
각 열의 데이터를 수학적으로 복잡하게 섞는다.

4. AddRoundKey (키 더하기)
현재 라운드의 키와 데이터의 XOR 연산을 진행

이 과정을 128은 10라운드, 256은 14라운드로 반복한다.
복호화는 XOR을 두번 하면 원래 값으로 돌아오는 특징을 이용해서 암호화 과정을 역순으로 라운드 수만큼 반복해서 진행하면 된다.
이렇게 발악을 해도 대칭키 암호 특성상 키를 탈취당하면 끝장이다. 이런 대칭키 암호의 문제를 극복하기 위한 여러 방법들로 디피-헬만 키 교환이나 하이브리드 암호가 있는데, 다른 게시글로 더 자세히 다루도록 하겠다.
비대칭키 암호
대칭키의 키 문제를 근본적으로 해결해버린 방식으로 아예 한 쌍의 키를 지녀 굳이 키를 교환할 필요가 없게 만들어버렸다. 키를 공개키와 비밀키로 나누어 각자가 처음부터 갖고 있는 것이다.
- 공개키는 나한테 보낼 평문(메세지)를 상대방이 암호화할 때 사용하는 키로 이 값을 누구에게나 배포할 수 있다.
- 비밀키는 나한테 온 암호문(메세지)를 내가 복호화할 때 사용하는 키로 오로지 나만 이 값을 가지고 있어야 한다.
누구에게나 내 집 주소를 알려주고 내 집 주소로 택배나 물건을 보낼 수는 있지만, 집 안으로 들이는 건 집 비밀번호를 알고 있는 나만이 가능하다.
이런 비대칭키는 대칭키 암호의 문제를 극복해서 무적인 것처럼 보이지만 또 그런 것은 아니다. 속도도 대칭키 암호에 비해 느리고 중간에서 공개키를 속여서 낚아채가면 내가 공격 당하고 있는지도 모르는 새에 데이터를 도둑 맞을 수도 있다. 여담으로 세상에 해독 불가능한 암호는 없다. 해독이 오래 걸리거나 잘 숨긴 암호만이 있을 뿐이다.
대신, 비밀키는 나만이 갖고 있고 공개키는 누구나 가질 수 있다는 특성을 이용해 디지털 서명에 이용할 수도 있다.
RSA (Rivest, Shamir, Adleman)
RSA는 아주 큰 두 소수의 곱을 인수분해 하기 어렵다는 수학적 난제를 이용한 암호화 알고리즘이다.
RSA 알고리즘을 키쌍을 생성하는 방법이다.

다음과 같은 방법으로 구한 공개키로 다음과 같이 암호화 한다.

비밀키로는 다음과 같이 복호화 한다.

실제 디지털 서명은 이 RSA를 이용한다. 얼핏 보면 이 친구도 무적 같아 보이지만, 미래에 양자 컴퓨터가 상용화 된다면, 쇼어 알고리즘으로 인해 사용할 수 없게 될 수도 있다고 한다.
