서론
많은 고전 암호에서는 송신자와 수신자가 같은 키를 가지고 있어야 했다.
카이사르 암호에서는 두 사람이 알파벳을 미는 칸의 수를 공유하고 있어야 했고, 비제네르 암호에서는 키워드를 공유하고 있어야 했다.
이렇게 송신자와 수신자가 같은 키를 공유해야하는 암호 시스템을 대칭키 암호 시스템(Symmetric Key Cryptosystem)이라고 부른다.
같은 키를 갖고 있어야 하는 특성상, 대칭키 암호 시스템은 사전에 서로 키를 공유하는 과정이 반드시 필요하다.
그런데 현대에 많은 데이터가 오가는 네트워크는 도청에 매우 취약하므로 키를 평문으로 공유하기는 부적절하다.
그래서 학자들은 외부인이 키가 공유되는 과정을 도청해도, 공유되는 키는 알지 못하게 하는 키 공유 알고리즘(Key-Sharing Algorithm)을 연구했다.
1970년 중반에 Diffie와 Hellman이 Diffie-Hellman 키 교환 알고리즘을 제시하였고, 송신자와 수신자가 서로 다른 키를 사용하는 공개키 암호 시스템(Public Key Cryptosystem)의 개념을 창안했다.
이는 대칭키와 대비되어 비대칭키 암호 시스템(Asymmetric Cryptography)이라고도 불린다.
혼돈과 확산
1945년에 암호학자 Claude Shannon은 안전한 암호 시스템은 혼돈(Confusion)과 확산(Diffusion)의 성질을 만족해야한다고 발표했다.
현대의 많은 암호 시스템이 두 성질을 따르고 있다.
혼돈
혼돈은 암호문에서 평문의 특성을 알아내기 힘든 성질을 말한다.
단일 치환 암호를 사용하여 같은 평문을 두 번 암호화하면 출력된 두 암호문은 서로 같다.
공격자는 암호문을 보고 평문이 무엇인지 유추하지는 못하더라도 암호문을 생성한 두 평문이 같다는 사실은 알 수 있다.
따라서 단일 치환 암호는 혼돈 성질을 만족하지 못하는 암호이다.
확산
확산은 평문의 작은 변화가 암호문의 큰 변화로 이어지는 성질이다.
이 성질은 대부분의 고전 암호에서 찾아보기 힘들다.
대칭키 암호 시스템
대칭키 암호 시스템은 암호화와 복호화에 같은 키를 사용하는 암호 시스템이다.
크게 블록 암호와 스트림 암호로 구분한다.
블록 암호
블록 암호(Block Cipher) : 평문을 정해진 크기의 블록 단위로 암호화하는 암호
예를 들어 블록의 크기가 4바이트라면 평문을 4바이트의 블록으로 쪼개어 각 블록마다 암호화를 진행한다.
만약 평문의 크기가 블록 크기의 배수가 아니어서 블록으로 균등하게 쪼갤 수 없다면, 평문뒤에 데이터를 추가하는 패딩(Padding)을 먼저 수행한다.
패딩은 평문이 블록 크기의 배수가 될 때까지 데이터를 추가한다.
블록 암호의 대표적인 예시로는 DES와 AES가 있다.
스트림 암호
스트림 암호(Stream Cipher) : 송신자와 수신자가 공유하는 데이터 스트림을 생성하고 이를 평문에 XOR하는 암호
평문을 , 암호문을 , 스트림을 라고 할 때, 암호문 는 C=로 생성된다.
이므로 수신자는 로 암호문을 복호화할 수 있다.
만약 송신자와 수신자가 평문 길이 만큼의 스트림을 매번 공유할 수 있다면, 스트림을 모르는 공격자는 암호문을 복호화할 수 없다.
하지만 평문과 같은 길이의 스트림을 안전하게 공유할 수 있다면, 스트림을 공유하는 채널로 평문을 공유하면 되므로 암호화가 필요하지 않은 환경임을 의미한다.
그래서 일반적으로 송신자와 수신자는 스트림을 공유하는 대신, 시드(Seed)라 불리는 작은 값을 공유하고, 이를 사전에 합의된 함수의 인자로 넣어 스트림을 각자 생성한다.
스트림 암호는 단순한 연산으로만 구현되므로 속도가 매우 빠르지만 블록암호보다는 안전하지 못하다고 알려져서 연산 능력이 부족한 임베디드 기기나 속도가 중요한 환경에서만 제한적으로 사용된다.
대칭키 암호 시스템의 장점과 단점
대칭키 암호 시스템은 일반적으로 공개키 암호 시스템에 비해 속도가 빠르다.
그러나 송신자와 수신자가 사전에 키를 교환해야 한다는 제약이 있다.
또한 대칭키 암호 시스템에서는 그룹 내에 여러 명이 있을 경우 두 사람마다 서로 다른 키를 생성해서 사용해야 한다.
즉, N명의 사람이 있을 때 총 \(\binom{N}{2}=N(N-1)/2\)개의 키가 필요하다.
이후에도 새로운 상대와 통신할 때마다 계속 키를 생성해야 한다.
공개키 암호 시스템에는 이와 같은 키 생성의 불편함이 없다.
공개키 암호 시스템
공개키 암호 시스템에서 송신자는 수신자의 공개키(Public Key)로 데이터를 암호화하여 수신자에게 전송하고, 수신자는 자신의 비밀키(Private Key)로 이를 복호화한다.
명칭에서 알 수 있듯 공개키는 모두에게 공개되어 있으므로 공개키를 아는 사람은 누구나 수신자에게 암호문을 보낼 수 있다.
그러나 개인키는 수신자만 알고 있으므로, 공격자는 암호문을 도청해도 이를 복호화할 수 없다.
공개키 암호 시스템은 우체통에 비유될 수 있다.
누구나 수신자의 우체통으로 편지를 보낼 수 있지만, 편지를 꺼내서 볼 수 있는 사람은 열쇠를 가지고 있는 수신자뿐이다.
공개키 암호 시스템의 장점과 단점
공개키 암호 시스템에서는 그룹 내의 사람들이 각자의 공개키와 비밀키를 만든 후 공개키만 공개하면 되므로 명의 사람이 있을 때 개의 키만 필요하다.
이는 개의 키가 필요했던 대칭키 암호 시스템보다 훨씬 적다.
또한 한 번 키를 생성하고 나면, 새로운 상대와 통신하더라도 자신이 키를 다시 만들어야할 필요가 없다.
반면, 공개키 암호 시스템은 일반적으로 대칭키 암호 시스템에 비해 다소 복잡한 연산이 필요하므로 속도가 느리다.
또한 대칭키 암호와 같은 안전성을 제공하려면, 대칭키 암호보다 긴 키를 사용해야 한다.
예를 들어 대칭키 암호 시스템인 AES는 192 비트 이상의 키를 사용하면 충분히 안전하지만, 공개키 암호 시스템인 RSA는 2048 비트 이상의 키를 사용할 것이 권장된다.
암호의 기능
정보 보안에는 여러 목표가 있는데, 현대 암호학은 기밀성 외에도 여러 목표의 달성에 기여하고 있다.
현대 암호학이 제공하는 보안적 기능은 다음과 같다.
1. 기밀성(Confidentiality)
기밀성은 허락된 사람만이 정보를 열람할 수 있게 하는 기능을 의미한다.
여기서 허락된 사람은 일반적으로 키를 가지고 있는 사람을 말한다.
2. 무결성(Integrity)
무결성은 송신자가 보낸 정보에 변조가 일어나지 않았음을 의미한다.
예를 들어, 송신자가 데이터를 보냈는데, 누군가가 이를 가로채어 조작하고, 수신자에 전달할 수 있다.
또는 네트워크 상의 문제로 이 중 일부가 변경될 수도 있다.
무결성은 이러한 데이터의 변화가 발생하지 않았음을 보증하는 기능이다.
3. 인증(Authentication)
인증은 정보를 주고 받는 상대방의 신원을 확인하는 기능을 말한다.
얼굴도 보이지 않고, 신분증도 교환할 수 없는 네트워크에서 서로가 신뢰할 수 있는 것은 인증 시스템이 갖춰져 있기 때문이다.
공인인증서가 대표적인 예이며 작게는 웹에서 아이디와 비밀번호를 입력하는 것도 인증의 영역에 속한다.
4. 부인 방지(Non-repudiation)
부인 방지는 정보를 교환한 이후에 교환한 사실을 부인할 수 없게 하는 기능을 의미한다.
온라인상에서 거래가 발생했을 때 돈을 수신한 쪽에서 수신한 사실을 부인할 수 있다면 온라인 거래는 불가능할 것이다.