암호화는 데이터를 안전하게 전송하고 보관하기 위해 중요한 역할을 한다. 이 과정에서 데이터를 암호화하는 방식에는 대칭키 암호화와 공개키 암호화라는 두 가지 주요 방법이 있다. 이를 이해하려면 암호화의 기본 목적과 각각의 방식이 어떻게 작동하는지 알아볼 필요가 있다.
암호화는 데이터 전송 중에 외부 공격자가 내용을 엿보거나 변조하지 못하게 하기 위해 필요하다. 데이터는 송신자와 수신자 사이에서 주고받는 중에 공격자에게 노출될 수 있기 때문에, 데이터를 보호하기 위해 암호화를 통해 전송 데이터를 암호문으로 바꾸고, 수신자는 다시 이를 복호화해 원본 데이터를 복원한다.
암호화의 목적은 크게 다음과 같다:
- 기밀성: 오직 허가된 사람만이 데이터를 읽을 수 있도록 함.
- 무결성: 데이터가 변조되지 않았음을 보장함.
- 인증: 송신자와 수신자가 서로의 신원을 확인함.
- 부인 방지: 송신자가 나중에 자신이 보낸 데이터를 부인하지 못하도록 함.
이러한 목적을 달성하기 위해 다양한 암호화 방식이 개발되었고, 크게 대칭키 암호화와 공개키 암호화로 나뉜다.

대칭키 암호화는 가장 오래된 암호화 방식 중 하나이다. 이 방식에서는 송신자와 수신자가 동일한 키를 사용하여 데이터를 암호화하고 복호화한다. 데이터를 암호화할 때 사용한 키가 데이터 복호화에도 사용되기 때문에, 이를 대칭키라고 부른다.
대칭키 암호화는 매우 빠르고, 대용량 데이터를 처리하는 데 적합하지만 키 교환 문제가 있다. 송신자와 수신자가 서로 안전한 방법으로 이 키를 공유해야 하는데, 네트워크를 통해 키를 교환하는 과정에서 키가 탈취될 위험이 있다. 사용자가 많아질수록 각각의 사용자와 키를 안전하게 관리하기가 어려워지며, 이러한 단점 때문에 주로 소규모 환경이나 안전한 키 교환 방법을 사용할 수 있을 때 사용된다.
대칭키 암호화는 암호화 및 복호화 속도가 매우 빠르며, 대용량 데이터를 처리하는 데 적합하다.
대칭키 암호화는 단일 키를 사용하여 데이터를 암호화하고 복호화하는데, 이를 블록 단위로 처리하는 경우가 많다. 대칭키 알고리즘에서는 복잡한 수학 연산보다는 효율적인 비트 조작, 순환, 치환, XOR 연산 등이 많이 사용되기 때문에 빠른 속도를 유지할 수 있다.
대칭키 암호화는 주로 블록 암호나 스트림 암호 방식을 사용한다.
대칭키 알고리즘은 상대적으로 적은 연산 자원을 사용하므로, 소규모 장치나 네트워크 환경에서도 성능에 크게 부담을 주지 않는다. 이때문에 대칭키 암호화는 특히 대용량 처리에 적합하다.
키 교환 과정이 복잡하며, 사용자가 증가할수록 키 관리가 어려워진다. 키 교환 과정이 복잡하다는 의미는, 이 키가 노출되면 모든 보안이 무너질 수 있다는 것을 의미한다.
대칭키 암호화에서 송신자가 수신자와 동일한 키를 사용하여 데이터를 암호화하고 복호화하기 때문에, 이 키를 사전에 안전하게 교환해야 한다. 문제는 네트워크 상에서 이 키가 탈취되면, 공격자가 데이터를 쉽게 복호화할 수 있다는 것이다.
예를 들어 송신자가 수신자에게 키를 전달하는 과정에서 중간자 공격(Man-in-the-middle attack)이 발생할 수 있다. 공격자가 키 교환 과정을 가로채면, 전송되는 모든 데이터를 복호화할 수 있게 된다.
🔖 신뢰할 수 있는 경로의 필요성
키를 전달하기 위해서는 신뢰할 수 있는 물리적 경로나 암호화된 통신 경로가 필요하다. 하지만 이 경로를 사전에 설정하기 어렵거나 불가능할 때 문제가 발생한다.
대칭키 암호화에서는 모든 사용자 간에 각각의 키를 관리해야 한다. 사용자가 2명일 때는 하나의 키만 관리하면 되지만, 사용자가 3명이면 서로 간에 3개의 키가 필요하고, 4명이면 6개의 키, 5명이면 10개의 키가 필요하다.
이를 일반화하면, 사용자 수가 명일 때, 개의 키가 필요하다. 사용자가 많아질수록 관리해야 할 키의 수가 기하급수적으로 증가하기 때문에, 이를 안전하게 관리하는 것이 매우 어려워진다.
대칭키 암호화를 안전하게 사용하기 위해 안전하지 않은 네트워크에서도 안전하게 키를 교환할 수 있는 방법을 고안했고, 이를 키 합의 프로토콜이라고 한다. 대표적인 키 합의 프로토콜은 RSA와 Diffie-Hellman 기반의 키 교환이다.
AES, DES, 3DES, ChaCha20, SEED, ARIA
대칭키 암호화는 데이터를 외부로부터 보호하는 데 탁월하지만, 무결성이나 인증 기능을 제공하지 않는다. 즉, 데이터가 변조되지 않았는지 확인하거나, 송신자의 신원을 보증하는 기능이 부족하다.

공개키 암호화는 대칭키의 키 관리 문제를 해결하기 위해 등장한 방식이다. 비대칭 키 암호화라고도 불리는 이 방식은 서로 다른 두 개의 키, 즉 공개키와 개인키를 사용한다. 공개키는 누구에게나 공개될 수 있지만, 개인키는 비밀로 유지되어야 한다.
이 방식의 핵심은 한 쪽의 키로 암호화하면, 반대쪽 키로만 복호화할 수 있다는 것이다. 예를 들어, 송신자는 수신자의 공개키로 데이터를 암호화하고, 수신자는 자신의 개인키로 이를 복호화한다. 이를 통해 키 교환 과정에서 발생할 수 있는 보안 문제를 해결할 수 있다.
공개키 암호화는 대칭키 암호화보다 느리지만, 키 관리가 매우 용이하여 다양한 보안 기능을 제공한다. 이를 통해 기밀성뿐만 아니라 인증, 부인 방지 등의 기능도 제공할 수 있다.
대칭키 암호화의 가장 큰 문제점은 키 교환이었다. 송신자와 수신자가 동일한 키를 사용해야 하기 때문에, 이 키를 서로 안전하게 전달해야 한다. 하지만 공개키 암호화 방식에서는 이런 문제를 크게 줄일 수 있다.
즉, 공개키는 네트워크 상에 공개적으로 배포될 수 있고, 악의적인 사용자도 이를 가질 수 있지만, 그 자체로는 보안에 영향을 미치지 않으므로 대규모 환경에서도 키 관리가 쉬워진다. 대칭키 암호화에서는 사용자마다 각각의 키를 관리해야 하는 복잡성이 있지만, 공개키 암호화에서는 사용자별로 하나의 공개키와 개인키만 관리하면 된다. 사용자가 늘어나도 추가적인 키 교환이 필요 없기 때문에 확장성이 뛰어나다.
공개키 암호화는 단순한 기밀성뿐만 아니라 인증, 부인 방지 등 다양한 보안 기능을 제공한다. 이들은 모두 암호화의 핵심 보안 요소들이다.
암호화 및 복호화 속도가 느리다. 따라서 대용량 데이터 암호화보다는 소량 데이터 암호화나 대칭키 교환에 사용되는 경우가 많다.
공개키 암호화 알고리즘은 대부분 소수 분해, 이산 로그 문제, 타원 곡선 연산 등의 매우 복잡한 수학적 원리를 담은 단방향 함수를 사용한다. 이러한 연산은 계산량이 매우 크고, 컴퓨터에서 처리하는 데 시간이 많이 걸린다.
공개키 암호화에서는 높은 보안 수준을 유지하기 위해 긴 비트 크기의 키를 사용한다. 예를 들어, RSA 알고리즘에서는 안전성을 확보하기 위해 최소 2048비트 이상의 키를 사용하는 것이 권장된다. 이와 비교해 대칭키 암호화에서는 128비트, 256비트 정도의 키가 주로 사용된다.
공개키 암호화는 대용량 데이터를 처리하는 데는 부적합하지만, 소량의 중요한 정보를 처리하는 데에는 매우 유용하다.
예를 들어, 은행 계좌 정보, 비밀번호, 인증 정보 등 중요한 정보를 안전하게 암호화하는 데 사용된다. 이러한 소량의 데이터를 처리할 때는 공개키 암호화의 속도 저하가 크게 문제되지 않기 때문에, 안전성과 보안성을 우선할 수 있다.
공개키 암호화는 대칭키 교환에 매우 자주 사용된다. 대칭키 암호화는 빠르지만 키 교환 과정에서 보안 문제가 발생할 수 있기 때문에, 공개키 암호화를 사용하여 대칭키(세션 키)를 안전하게 교환한 후, 대칭키로 실제 데이터를 암호화하는 방식이 일반적이다.
이 과정은 다음과 같다.
- 송신자가 수신자의 공개키로 대칭키를 암호화하여 전송한다.
- 수신자는 자신의 개인키로 대칭키를 복호화한다.
- 이렇게 공유된 대칭키를 사용하여, 송신자와 수신자는 빠른 대칭키 암호화 방식을 사용해 대용량 데이터를 암호화하고 주고받는다.
e.g. 웹에서 HTTPS 통신을 할 때 SSL/TLS 프로토콜은 공개키 암호화를 사용하여 대칭키를 안전하게 교환한 후, 그 대칭키로 실제 통신 데이터를 암호화한다. 이를 통해 보안성과 속도 모두를 확보할 수 있다.
공개키 암호화는 키 관리가 용이하지만, 한 가지 문제점이 있다. 송신자가 받은 공개키가 정말 수신자의 공개키인지 확신할 방법이 필요하다. 이를 위해 디지털 인증서와 공개키 인프라(PKI)가 사용된다.

디지털 인증서는 신뢰할 수 있는 제3자인 CA(Certificate Authority)가 발급한다. 공개키 교환 절차는 다음과 같다.
- B는 자신의 공개키를 CA에 제출하여, 그 키가 자신에게 속한다는 인증서를 발급받는다.
- B의 인증서를 A에게 보낸다. 이 인증서에는 B의 공개키가 포함되어 있다.
- A는 CA의 공개키로 B의 인증서를 검증하고, 서명이 유효하다면 인증서 안의 B의 공개키를 사용한다.
- 이제 A는 B의 공개키를 사용해 안전하게 통신을 시작할 수 있다.
앞서 설명한 바와 같이 대칭키를 안전하게 공유할 수 있는 방법에 대한 필요성으로 키 합의 프로토콜이 등장했다. 대표적인 키 합의 프로토콜에 대해 알아보자.
비대칭키 암호화인 RSA를 사용한 키 합의 프로토콜이다.
앨리스는 앞으로 통신에 사용할 세션키를 만들어서 이를 밥의 공개키로 암호화한 다음 밥에게 전송한다. 밥은 자신의 개인키로 암호화된 세션키를 복호화해 사용한다.

문제점은 이 방식에서는 순방향 비밀성이 보장되지 않는다는 것이다.
순방향 비밀성(Forward Secrecy)이란, 미래에 개인키가 유출되더라도, 과거의 세션 내용은 복호화할 수 없도록 보장하는 것이다. 하지만 RSA 방식에서는 만약 공격자가 이후에 밥의 개인키를 탈취하면, 이전 통신에서 사용한 세션키를 복호화하여 모든 과거의 통신 내용을 해독할 수 있게 된다.
디피-헬만 키 교환은 순방향 비밀성을 제공하는 대표적 키 합의 프로토콜이다. 이 프로토콜은 암호화되지 않은 공용 채널에서도 안전하게 대칭키를 생성하고 교환할 수 있도록 설계되었다.

- 기저키 선택: 앨리스와 밥은 서로 통신에 사용할 기저키(공용 값)를 공개적으로 선택한다. 이 기저키는 노출되어도 상관 없다.
- 개인키 설정: 앨리스와 밥은 각각 자신만 아는 비밀키를 정한다.
- 공유 정보 생성: 앨리스와 밥은 각자의 비밀키와 기저키를 조합하여 중간 값을 계산하고, 그 값을 서로에게 전송한다.
- 최종 키 계산: 앨리스는 밥의 중간 값에 자신의 비밀키를 추가로 조합하여 최종 공유 키를 계산하고, 밥도 마찬가지로 앨리스의 중간 값에 자신의 비밀키를 추가하여 같은 최종 공유 키를 계산한다.
- 비밀키 삭제: 세션이 끝나면 앨리스와 밥은 각자의 비밀키를 즉시 폐기한다.
설사 나중에 공격자가 밥의 개인키를 탈취하더라도, 그로부터 얻을 수 있는 정보는 세션키를 만들기 위한 단서(힌트) 정도일 뿐, 실제 세션키나 과거의 통신키 내용을 복호화할 수는 없다.
무결성을 보장하기 위해서는 데이터가 전송 중에 손상되거나 변경되었는지를 확인할 수 있어야 한다. 이를 위해 주로 해시 함수와 메세지 인증 코드(MAC)가 사용된다.

해시 함수는 임의의 길이를 가진 데이터를 일정한 길이의 고정된 값으로 변환하는 함수이다. 이 고정된 값이 바로 해시 값 또는 해시라고 불린다.
암호학적으로 안전한 해시 함수는 다음과 같은 특성을 가져야 한다.
e.g. SHA-256: 매우 널리 사용되는 암호학적 해시 함수이다. 256비트(32바이트)의 해시 값을 생성하며, 블록 체인 기술에서도 많이 사용된다.
데이터를 송신할 때, 데이터의 해시 값을 함께 전송하여 수신자가 이를 검증할 수 있게 한다. 수신자가 데이터의 해시 값을 재계산하고 송신자가 보낸 해시 값과 비교하여 데이터가 변조되었는지 확인할 수 있다.
만약 두 해시 값이 다르면 데이터가 전송 중에 손상되었거나 변경된 것이다.
해시 함수는 데이터가 변경되었는지 여부를 판단할 수는 있지만, 누가 데이터를 변경했는지 확인할 수는 없다. 즉, 악의적인 공격자가 데이터를 변경한 후 새로운 해시 값을 생성하여 위조할 수 있다.
따라서 해시 함수만으로는 완전한 무결성을 보장하기 어렵다. 이를 보완하기 위해 사용하는 것이 키가 포함된 해시 함수, 즉 메세지 인증 코드(MAC)이다.
메세지 인증 코드는 대칭키 암호화와 해시 함수를 결합한 방식으로, 메세지의 무결성과 인증을 동시에 제공한다. MAC은 송신자가 데이터를 변조하지 않도록 보호하고, 수신자는 해당 데이터가 변조되지 않았는지, 그리고 인증된 송신자로부터 온 것인지 확인할 수 있다.
MAC은 단순 해시 함수와 달리, 송신자와 수신자가 미리 공유한 대칭키를 사용하여 생성한다. 대칭키는 송신자와 수신자만이 알고있기 때문에, 제3자가 이 키를 모르면 MAC 값을 생성하거나 변조할 수 없다.

- 키 공유: 송신자 앨리스와 수신자 밥은 미리 공유된 대칭키를 가지고 있다.
- MAC 값 생성: 송신자 앨리스는 메세지와 대칭키를 결합하여 MAC 값을 계산한다. 이를 해시 값과 비슷하게 생각할 수 있다.
- 메세지 전송: 앨리스는 메세지와 함께 MAC 값을 수신자 밥에게 전송한다.
- MAC 검증: 밥은 메세지와 미리 공유된 대칭키를 사용하여 MAC 값을 재계산한 후, 앨리스가 보낸 MAC 값과 비교한다.
- 무결성 및 인증 확인: 두 MAC 값이 같다면 데이터가 변조되지 않았고, 해당 데이터가 앨리스로부터 온 것임을 확인할 수 있다.
Reference