[네트워크] 대칭키 & 공개키

xoey·2024년 11월 18일

네트워크

목록 보기
5/10
post-thumbnail

암호화는 데이터를 안전하게 전송하고 보관하기 위해 중요한 역할을 한다. 이 과정에서 데이터를 암호화하는 방식에는 대칭키 암호화공개키 암호화라는 두 가지 주요 방법이 있다. 이를 이해하려면 암호화의 기본 목적과 각각의 방식이 어떻게 작동하는지 알아볼 필요가 있다.

1. 배경

암호화는 데이터 전송 중에 외부 공격자가 내용을 엿보거나 변조하지 못하게 하기 위해 필요하다. 데이터는 송신자와 수신자 사이에서 주고받는 중에 공격자에게 노출될 수 있기 때문에, 데이터를 보호하기 위해 암호화를 통해 전송 데이터를 암호문으로 바꾸고, 수신자는 다시 이를 복호화해 원본 데이터를 복원한다.

암호화의 목적은 크게 다음과 같다:

  1. 기밀성: 오직 허가된 사람만이 데이터를 읽을 수 있도록 함.
  2. 무결성: 데이터가 변조되지 않았음을 보장함.
  3. 인증: 송신자와 수신자가 서로의 신원을 확인함.
  4. 부인 방지: 송신자가 나중에 자신이 보낸 데이터를 부인하지 못하도록 함.

이러한 목적을 달성하기 위해 다양한 암호화 방식이 개발되었고, 크게 대칭키 암호화와 공개키 암호화로 나뉜다.

2. 대칭키 암호화(Symmetric Key Encryption)

대칭키 암호화는 가장 오래된 암호화 방식 중 하나이다. 이 방식에서는 송신자와 수신자가 동일한 키를 사용하여 데이터를 암호화하고 복호화한다. 데이터를 암호화할 때 사용한 키가 데이터 복호화에도 사용되기 때문에, 이를 대칭키라고 부른다.

대칭키 암호화는 매우 빠르고, 대용량 데이터를 처리하는 데 적합하지만 키 교환 문제가 있다. 송신자와 수신자가 서로 안전한 방법으로 이 키를 공유해야 하는데, 네트워크를 통해 키를 교환하는 과정에서 키가 탈취될 위험이 있다. 사용자가 많아질수록 각각의 사용자와 키를 안전하게 관리하기가 어려워지며, 이러한 단점 때문에 주로 소규모 환경이나 안전한 키 교환 방법을 사용할 수 있을 때 사용된다.

2.1. 장점

대칭키 암호화는 암호화 및 복호화 속도가 매우 빠르며, 대용량 데이터를 처리하는 데 적합하다.

2.1.1. 대칭키 암호화의 기본 구조

대칭키 암호화는 단일 키를 사용하여 데이터를 암호화하고 복호화하는데, 이를 블록 단위로 처리하는 경우가 많다. 대칭키 알고리즘에서는 복잡한 수학 연산보다는 효율적인 비트 조작, 순환, 치환, XOR 연산 등이 많이 사용되기 때문에 빠른 속도를 유지할 수 있다.

2.1.2. 처리 방식

대칭키 암호화는 주로 블록 암호나 스트림 암호 방식을 사용한다.

  • 블록 암호: 데이터를 일정한 크기의 블록(e.g. 64비트, 128비트)으로 나눈 뒤 각각의 블록에 동일한 연산을 적용한다. 이 방식은 연산 구조가 규칙적이기 때문에 대규모 병렬 처리가 가능해, 대용량 데이터를 빠르게 처리할 수 있다. AES와 DES가 대표적인 블록 암호 알고리즘이다.
  • 스트림 암호: 데이터를 연속된 비트 단위로 처리하며, 하나씩 처리하므로 빠르고, 실시간 처리에 적합하다.

대칭키 알고리즘은 상대적으로 적은 연산 자원을 사용하므로, 소규모 장치나 네트워크 환경에서도 성능에 크게 부담을 주지 않는다. 이때문에 대칭키 암호화는 특히 대용량 처리에 적합하다.

2.2. 단점

키 교환 과정이 복잡하며, 사용자가 증가할수록 키 관리가 어려워진다. 키 교환 과정이 복잡하다는 의미는, 이 키가 노출되면 모든 보안이 무너질 수 있다는 것을 의미한다.

2.2.1. 안전한 키 전달의 어려움

대칭키 암호화에서 송신자가 수신자와 동일한 키를 사용하여 데이터를 암호화하고 복호화하기 때문에, 이 키를 사전에 안전하게 교환해야 한다. 문제는 네트워크 상에서 이 키가 탈취되면, 공격자가 데이터를 쉽게 복호화할 수 있다는 것이다.

예를 들어 송신자가 수신자에게 키를 전달하는 과정에서 중간자 공격(Man-in-the-middle attack)이 발생할 수 있다. 공격자가 키 교환 과정을 가로채면, 전송되는 모든 데이터를 복호화할 수 있게 된다.

🔖 신뢰할 수 있는 경로의 필요성

키를 전달하기 위해서는 신뢰할 수 있는 물리적 경로나 암호화된 통신 경로가 필요하다. 하지만 이 경로를 사전에 설정하기 어렵거나 불가능할 때 문제가 발생한다.

2.2.2. 사용자 증가에 따른 관리 복잡성

대칭키 암호화에서는 모든 사용자 간에 각각의 키를 관리해야 한다. 사용자가 2명일 때는 하나의 키만 관리하면 되지만, 사용자가 3명이면 서로 간에 3개의 키가 필요하고, 4명이면 6개의 키, 5명이면 10개의 키가 필요하다.

이를 일반화하면, 사용자 수가 NN명일 때, N(N1)/2N(N-1)/2개의 키가 필요하다. 사용자가 많아질수록 관리해야 할 키의 수가 기하급수적으로 증가하기 때문에, 이를 안전하게 관리하는 것이 매우 어려워진다.

2.2.3. 키 합의 프로토콜의 필요성

대칭키 암호화를 안전하게 사용하기 위해 안전하지 않은 네트워크에서도 안전하게 키를 교환할 수 있는 방법을 고안했고, 이를 키 합의 프로토콜이라고 한다. 대표적인 키 합의 프로토콜은 RSA와 Diffie-Hellman 기반의 키 교환이다.

2.3. 대표 알고리즘

AES, DES, 3DES, ChaCha20, SEED, ARIA

2.4. 보장 기능

대칭키 암호화는 데이터를 외부로부터 보호하는 데 탁월하지만, 무결성이나 인증 기능을 제공하지 않는다. 즉, 데이터가 변조되지 않았는지 확인하거나, 송신자의 신원을 보증하는 기능이 부족하다.

3. 공개키 암호화(Asymmetric Key Encryption)

공개키 암호화는 대칭키의 키 관리 문제를 해결하기 위해 등장한 방식이다. 비대칭 키 암호화라고도 불리는 이 방식은 서로 다른 두 개의 키, 즉 공개키개인키를 사용한다. 공개키는 누구에게나 공개될 수 있지만, 개인키는 비밀로 유지되어야 한다.

이 방식의 핵심은 한 쪽의 키로 암호화하면, 반대쪽 키로만 복호화할 수 있다는 것이다. 예를 들어, 송신자는 수신자의 공개키로 데이터를 암호화하고, 수신자는 자신의 개인키로 이를 복호화한다. 이를 통해 키 교환 과정에서 발생할 수 있는 보안 문제를 해결할 수 있다.

공개키 암호화는 대칭키 암호화보다 느리지만, 키 관리가 매우 용이하여 다양한 보안 기능을 제공한다. 이를 통해 기밀성뿐만 아니라 인증, 부인 방지 등의 기능도 제공할 수 있다.

3.1. 장점

3.1.1. 키 관리 용이성

대칭키 암호화의 가장 큰 문제점은 키 교환이었다. 송신자와 수신자가 동일한 키를 사용해야 하기 때문에, 이 키를 서로 안전하게 전달해야 한다. 하지만 공개키 암호화 방식에서는 이런 문제를 크게 줄일 수 있다.

  • 공개키: 공개키는 누구나 사용할 수 있기 때문에, 키를 미리 교환할 필요가 없다. 이렇게 키가 노출되더라도 개인키가 안전하게 보호되는 한, 보안에는 문제가 없다.
  • 개인키: 공개키는 누구에게나 배포할 수 있지만, 개인키는 송신자 혹은 수신자만이 소유하는 비밀 키다. 이 개인키는 절대 다른 사람과 공유되지 않기 때문에, 키 교환 과정에서 발생할 수 있는 공격을 방지할 수 있다.

    즉, 공개키는 네트워크 상에 공개적으로 배포될 수 있고, 악의적인 사용자도 이를 가질 수 있지만, 그 자체로는 보안에 영향을 미치지 않으므로 대규모 환경에서도 키 관리가 쉬워진다. 대칭키 암호화에서는 사용자마다 각각의 키를 관리해야 하는 복잡성이 있지만, 공개키 암호화에서는 사용자별로 하나의 공개키와 개인키만 관리하면 된다. 사용자가 늘어나도 추가적인 키 교환이 필요 없기 때문에 확장성이 뛰어나다.

3.1.2. 다양한 보안 기능

공개키 암호화는 단순한 기밀성뿐만 아니라 인증, 부인 방지 등 다양한 보안 기능을 제공한다. 이들은 모두 암호화의 핵심 보안 요소들이다.

  • 기밀성: 송신자는 수신자의 공개키로 데이터를 암호화하고, 수신자는 개인키로 이를 복호화한다. 중간에 공격자가 데이터를 가로채더라도 개인키가 없으면 복호화할 수 없다. 이는 송신된 정보가 비밀로 유지될 수 있음을 의미한다.
  • 인증: 공개키 암호화는 자신이 누구인지 증명하는 데 사용할 수 있다. 송신자가 자신의 개인키로 데이터를 암호화하면, 수신자는 그 데이터를 해당 송신자의 공개키로만 복호화할 수 있다. 공개키로 복호화가 가능다하면 그 데이터는 해당 개인키 소유자, 즉 송신자만이 암호화할 수 있다는 것이 보장되기 때문에 송신자가 개인키를 소유한 진짜 사용자임을 인증할 수 있다.
  • 부인 방지: 송신자가 데이터를 보낸 후에 이를 부인할 수 없게 만든다. 송신자가 개인키로 서명한 데이터는 해당 개인키에 대응하는 공개키로만 검증할 수 있기 때문에, 송신자가 나중에 “내가 보낸 데이터 아닌데?”라고 주장할 수 없다. 이는 법적 책임을 보장하는 중요한 기능이다.

3.2. 단점

암호화 및 복호화 속도가 느리다. 따라서 대용량 데이터 암호화보다는 소량 데이터 암호화나 대칭키 교환에 사용되는 경우가 많다.

3.2.1. 단방향 연산의 복잡성

공개키 암호화 알고리즘은 대부분 소수 분해, 이산 로그 문제, 타원 곡선 연산 등의 매우 복잡한 수학적 원리를 담은 단방향 함수를 사용한다. 이러한 연산은 계산량이 매우 크고, 컴퓨터에서 처리하는 데 시간이 많이 걸린다.

  • RSA 알고리즘:
    • 암호화(쉬운 연산): 두 개의 큰 소수를 곱하여 하나의 큰 수를 만든다.
    • 복호화(어려운 연산): 이 큰 수에서 다시 두 소수로 분해하는 것은 까다롭다. 이 문제는 소인수 분해 문제로 불리며, 현재 컴퓨터 성능으로는 매우 오랜 시간이 걸릴 수 있다.
  • ECC(타원 곡선 암호화):
    • 암호화(쉬운 연산): 타원 곡선의 한 점을 기반으로 연산을 수행하여 암호화한다.
    • 복호화(어려운 연산): 타원 곡선의 한 점을 사용하여 다시 원래의 값을 추정하는 것은 이산 로그 문제로, 시간이 많이 소요된다. 이 문제는 현재 알고리즘으로는 효율적인 해법이 없기 때문에 높은 보안성을 제공한다.

3.2.2. 비트 크기

공개키 암호화에서는 높은 보안 수준을 유지하기 위해 긴 비트 크기의 키를 사용한다. 예를 들어, RSA 알고리즘에서는 안전성을 확보하기 위해 최소 2048비트 이상의 키를 사용하는 것이 권장된다. 이와 비교해 대칭키 암호화에서는 128비트, 256비트 정도의 키가 주로 사용된다.

3.3. 사용 사례

3.3.1. 소량 데이터 암호화

공개키 암호화는 대용량 데이터를 처리하는 데는 부적합하지만, 소량의 중요한 정보를 처리하는 데에는 매우 유용하다.

예를 들어, 은행 계좌 정보, 비밀번호, 인증 정보 등 중요한 정보를 안전하게 암호화하는 데 사용된다. 이러한 소량의 데이터를 처리할 때는 공개키 암호화의 속도 저하가 크게 문제되지 않기 때문에, 안전성과 보안성을 우선할 수 있다.

3.3.2. 대칭키 교환

공개키 암호화는 대칭키 교환에 매우 자주 사용된다. 대칭키 암호화는 빠르지만 키 교환 과정에서 보안 문제가 발생할 수 있기 때문에, 공개키 암호화를 사용하여 대칭키(세션 키)를 안전하게 교환한 후, 대칭키로 실제 데이터를 암호화하는 방식이 일반적이다.

이 과정은 다음과 같다.

  1. 송신자가 수신자의 공개키로 대칭키를 암호화하여 전송한다.
  2. 수신자는 자신의 개인키로 대칭키를 복호화한다.
  3. 이렇게 공유된 대칭키를 사용하여, 송신자와 수신자는 빠른 대칭키 암호화 방식을 사용해 대용량 데이터를 암호화하고 주고받는다.

e.g. 웹에서 HTTPS 통신을 할 때 SSL/TLS 프로토콜은 공개키 암호화를 사용하여 대칭키를 안전하게 교환한 후, 그 대칭키로 실제 통신 데이터를 암호화한다. 이를 통해 보안성과 속도 모두를 확보할 수 있다.

3.4. 대표 알고리즘

  • RSA: 대표적인 공개키 암호화 방식으로 많이 사용된다.
  • Diffie-Hellman: 최초의 공개키 알고리즘이나, 위조에 취약하다.
  • ECC: 짧은 키로 높은 보안 강도를 제공하며, 모바일 기기 등에 적합하다.
  • DSA: 전자서명 표준 알고리즘

4. 디지털 인증서와 공개키 인프라(PKI)

공개키 암호화는 키 관리가 용이하지만, 한 가지 문제점이 있다. 송신자가 받은 공개키가 정말 수신자의 공개키인지 확신할 방법이 필요하다. 이를 위해 디지털 인증서공개키 인프라(PKI)가 사용된다.

디지털 인증서는 신뢰할 수 있는 제3자인 CA(Certificate Authority)가 발급한다. 공개키 교환 절차는 다음과 같다.

  1. B는 자신의 공개키를 CA에 제출하여, 그 키가 자신에게 속한다는 인증서를 발급받는다.
  2. B의 인증서를 A에게 보낸다. 이 인증서에는 B의 공개키가 포함되어 있다.
  3. A는 CA의 공개키로 B의 인증서를 검증하고, 서명이 유효하다면 인증서 안의 B의 공개키를 사용한다.
  4. 이제 A는 B의 공개키를 사용해 안전하게 통신을 시작할 수 있다.

5. 기밀성 보장을 위한 노력

앞서 설명한 바와 같이 대칭키를 안전하게 공유할 수 있는 방법에 대한 필요성으로 키 합의 프로토콜이 등장했다. 대표적인 키 합의 프로토콜에 대해 알아보자.

5.1. RSA 키 합의 프로토콜

비대칭키 암호화인 RSA를 사용한 키 합의 프로토콜이다.

앨리스는 앞으로 통신에 사용할 세션키를 만들어서 이를 밥의 공개키로 암호화한 다음 밥에게 전송한다. 밥은 자신의 개인키로 암호화된 세션키를 복호화해 사용한다.

문제점은 이 방식에서는 순방향 비밀성이 보장되지 않는다는 것이다.

순방향 비밀성(Forward Secrecy)이란, 미래에 개인키가 유출되더라도, 과거의 세션 내용은 복호화할 수 없도록 보장하는 것이다. 하지만 RSA 방식에서는 만약 공격자가 이후에 밥의 개인키를 탈취하면, 이전 통신에서 사용한 세션키를 복호화하여 모든 과거의 통신 내용을 해독할 수 있게 된다.

5.2. Diffie-Hellman 키 합의 프로토콜

디피-헬만 키 교환은 순방향 비밀성을 제공하는 대표적 키 합의 프로토콜이다. 이 프로토콜은 암호화되지 않은 공용 채널에서도 안전하게 대칭키를 생성하고 교환할 수 있도록 설계되었다.

  1. 기저키 선택: 앨리스와 밥은 서로 통신에 사용할 기저키(공용 값)를 공개적으로 선택한다. 이 기저키는 노출되어도 상관 없다.
  2. 개인키 설정: 앨리스와 밥은 각각 자신만 아는 비밀키를 정한다.
  3. 공유 정보 생성: 앨리스와 밥은 각자의 비밀키와 기저키를 조합하여 중간 값을 계산하고, 그 값을 서로에게 전송한다.
  4. 최종 키 계산: 앨리스는 밥의 중간 값에 자신의 비밀키를 추가로 조합하여 최종 공유 키를 계산하고, 밥도 마찬가지로 앨리스의 중간 값에 자신의 비밀키를 추가하여 같은 최종 공유 키를 계산한다.
  5. 비밀키 삭제: 세션이 끝나면 앨리스와 밥은 각자의 비밀키를 즉시 폐기한다.

설사 나중에 공격자가 밥의 개인키를 탈취하더라도, 그로부터 얻을 수 있는 정보는 세션키를 만들기 위한 단서(힌트) 정도일 뿐, 실제 세션키나 과거의 통신키 내용을 복호화할 수는 없다.

6. 무결성 보장을 위한 노력

무결성을 보장하기 위해서는 데이터가 전송 중에 손상되거나 변경되었는지를 확인할 수 있어야 한다. 이를 위해 주로 해시 함수메세지 인증 코드(MAC)가 사용된다.

6.1. 해시 함수(Hash Function)

해시 함수는 임의의 길이를 가진 데이터를 일정한 길이의 고정된 값으로 변환하는 함수이다. 이 고정된 값이 바로 해시 값 또는 해시라고 불린다.

6.1.1. 암호학적 해시 함수의 특징

암호학적으로 안전한 해시 함수는 다음과 같은 특성을 가져야 한다.

  1. 단방향성: 해시 값만 보고 원래 입력 데이터를 알아내는 것이 불가능하거나 매우 어렵다.
  2. 충돌 회피: 동일한 해시 값을 가지는 서로 다른 데이터(충돌)를 찾는 것이 매우 어렵다.
  3. 민감도: 입력 데이터에서 단 1비트라도 변경되면 완전히 다른 해시 값이 출력된다.

e.g. SHA-256: 매우 널리 사용되는 암호학적 해시 함수이다. 256비트(32바이트)의 해시 값을 생성하며, 블록 체인 기술에서도 많이 사용된다.

6.1.2. 해시 함수의 역할

데이터를 송신할 때, 데이터의 해시 값을 함께 전송하여 수신자가 이를 검증할 수 있게 한다. 수신자가 데이터의 해시 값을 재계산하고 송신자가 보낸 해시 값과 비교하여 데이터가 변조되었는지 확인할 수 있다.

만약 두 해시 값이 다르면 데이터가 전송 중에 손상되었거나 변경된 것이다.

6.1.3. 문제점

해시 함수는 데이터가 변경되었는지 여부를 판단할 수는 있지만, 누가 데이터를 변경했는지 확인할 수는 없다. 즉, 악의적인 공격자가 데이터를 변경한 후 새로운 해시 값을 생성하여 위조할 수 있다.

따라서 해시 함수만으로는 완전한 무결성을 보장하기 어렵다. 이를 보완하기 위해 사용하는 것이 키가 포함된 해시 함수, 즉 메세지 인증 코드(MAC)이다.

6.2. 메세지 인증 코드(MAC: Message Authentication Code)

메세지 인증 코드는 대칭키 암호화와 해시 함수를 결합한 방식으로, 메세지의 무결성과 인증을 동시에 제공한다. MAC은 송신자가 데이터를 변조하지 않도록 보호하고, 수신자는 해당 데이터가 변조되지 않았는지, 그리고 인증된 송신자로부터 온 것인지 확인할 수 있다.

MAC은 단순 해시 함수와 달리, 송신자와 수신자가 미리 공유한 대칭키를 사용하여 생성한다. 대칭키는 송신자와 수신자만이 알고있기 때문에, 제3자가 이 키를 모르면 MAC 값을 생성하거나 변조할 수 없다.

6.2.1. 인증 과정

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

6.2.2. 장점

  • 무결성 보장: 메세지가 전송 중 변경되었을 경우, 수신자가 이를 쉽게 알아낼 수 있다.
  • 인증 기능: 송신자와 수신자가 사전에 공유된 키를 사용하기 때문에, 수신자는 이 메세지가 진짜 송신자로부터 온 것임을 확인할 수 있다.
  • 안전성: MAC 값은 대칭키를 사용하여 계산되므로, 공격자가 대칭키를 알지 못하면 MAC 값을 위조할 수 없다.

Reference

profile
[Roman 8:18] consider that our present sufferings are not worth comparing with the glory that will be revealed in us.

0개의 댓글