비대칭키 암호화: 공개 키와 개인 키 한 쌍의 약속

비대칭키 암호화: 공개 키와 개인 키 한 쌍의 약속

대칭키 암호화는 빠르고 단순합니다. 하지만 한 가지 풀기 어려운 문제를 안고 있는데요. “비밀 키를 어떻게 양쪽이 안전하게 처음부터 나눠 가질 것인가”입니다. 공격자가 통신을 모두 보고 있는 상태에서 비밀 키를 그대로 보낼 수는 없는데, 그렇다고 매번 사람이 직접 만나서 키를 교환할 수도 없는 노릇이죠.

이 닭과 달걀 같은 문제를 풀기 위해 등장한 것이 비대칭키 암호화입니다. 한 사람이 한 쌍의 키를 갖고, 한쪽은 모두에게 공개하고 다른 한쪽은 자기만 가진다는 살짝 마법 같은 발상이에요. 이번 글에서는 비대칭키가 어떻게 동작하는지, RSA와 ECC가 어떤 차이를 가지는지, 그리고 디지털 서명과 인증서까지 어떻게 이어지는지를 차근차근 살펴보겠습니다.

두 개의 키, 한 쌍의 약속

비대칭키의 핵심은 “한 키로 잠그면 다른 키로만 풀 수 있다”는 수학적 성질입니다. 한 쌍의 키 가운데 한쪽을 공개 키(public key), 다른 한쪽을 개인 키(private key)라고 부르는데요. 공개 키는 누구에게나 알려도 되는 값이고, 개인 키는 본인만 알아야 하는 비밀입니다.

공개 키로 잠그고 개인 키로 풀기
보내는 사람                         받는 사람
"비밀 메시지"

     ▼ (받는 사람의 공개 키로 암호화)
   암호문 ─────────────────▶ 받는 사람

                                  ▼ (받는 사람의 개인 키로 복호화)
                              "비밀 메시지"

흥미로운 점은 누구든 받는 사람의 공개 키로 메시지를 잠글 수는 있지만, 그걸 풀 수 있는 사람은 개인 키를 가진 본인뿐이라는 거죠. 공격자가 통신을 모두 들여다보고 있어도, 개인 키 없이는 암호문을 평문으로 되돌릴 수 없습니다. 이 비대칭성이 키 교환 문제를 풀어 주는 토대가 됩니다.

반대 방향도 가능합니다. 개인 키로 잠근 메시지는 공개 키로만 풀 수 있는데요. 이 방향은 비밀이 아니라 “이 메시지는 정말 그 사람이 보낸 것이다”라는 신원 증명에 쓰입니다. 디지털 서명이 정확히 이 원리로 동작하죠.

RSA, 가장 널리 알려진 알고리즘

비대칭키 알고리즘 가운데 가장 오래되고 가장 널리 알려진 것이 RSA입니다. 세 명의 발명자(Rivest, Shamir, Adleman)의 이름에서 따왔고, 1977년에 등장한 이래 지금까지도 광범위하게 쓰이고 있죠.

RSA의 보안성은 큰 수의 소인수분해가 어렵다는 수학적 사실에 기반합니다. 큰 두 소수를 곱하는 것은 쉽지만, 그 결과로 나온 수에서 다시 두 소수를 찾아내는 것은 매우 어려운데요. 공개 키는 곱한 결과를 포함한 정보이고, 개인 키는 그 두 소수를 알고 있어야 만들 수 있는 정보라, 공개 키만으로는 개인 키를 역으로 알아낼 수 없습니다.

RSA 키의 크기는 보통 2048비트나 4096비트로 잡습니다. 같은 보안 강도를 얻기 위해 대칭키보다 훨씬 큰 키가 필요한 게 비대칭키의 특징인데요. RSA-2048이 대칭키 AES-112와 비슷한 보안 강도라고 알려져 있어, 큰 차이를 한눈에 보여 주는 비교가 됩니다.

RSA를 안전하게 쓰려면 패딩 방식도 함께 신경 써야 합니다. 순수한 RSA 연산은 결정적이라서 같은 평문에 같은 암호문이 나오는데, 이게 그대로 노출되면 공격에 취약하거든요. 그래서 실무에서는 암호화에 RSA-OAEP, 서명에 RSA-PSS 같은 패딩 방식을 함께 사용하는 것이 표준입니다. 옛 PKCS#1 v1.5 패딩은 일부 측면 채널 공격에 약점이 알려져 있어, 새로 만드는 시스템에서는 OAEP/PSS를 골라 쓰는 것이 안전합니다.

ECC, 더 작은 키로 더 강한 보안

요즘 점점 자리를 넓혀 가고 있는 알고리즘이 타원곡선 암호(ECC, Elliptic Curve Cryptography)입니다. 타원곡선 위의 점들에 대한 수학적 성질을 활용하는데, 같은 보안 강도를 훨씬 작은 키로 얻을 수 있다는 장점이 있죠.

256비트짜리 ECC 키가 RSA-3072와 비슷한 보안 강도를 제공한다고 알려져 있어, 키 크기도 연산량도 모두 작아집니다. 모바일이나 IoT 환경처럼 자원이 빠듯한 자리에 특히 잘 어울리는데요. HTTPS의 키 교환에 자주 등장하는 ECDHE도 이 타원곡선의 한 응용이고, 비트코인이 트랜잭션 서명에 쓰는 secp256k1도 ECC 곡선의 한 종류입니다.

ECC가 모든 면에서 RSA를 대체하는 것은 아닙니다. 오랫동안 검증된 안정성이라는 측면에서는 RSA가 여전히 강력하고, 일부 옛 시스템과의 호환성 때문에 RSA를 유지해야 하는 자리도 있죠. 다만 새로 만드는 시스템에서는 ECC 계열을 기본 선택지로 두는 흐름이 점점 강해지고 있습니다.

키 교환: Diffie-Hellman과 ECDHE

비대칭키의 또 다른 큰 쓰임새가 키 교환입니다. 양쪽이 서로 다른 비밀을 가지고 시작하지만, 공개된 통신 채널만으로 같은 비밀 키를 합의해 만들어 내는 마법 같은 절차죠. 이 절차의 원형이 Diffie-Hellman 키 교환입니다.

Diffie-Hellman의 흐름
앨리스                                      밥
  비밀 a 보유                            비밀 b 보유
       │                                    │
       │── 공개 값 A = g^a ────────────────▶│
       │                                    │
       │◀──────────────── 공개 값 B = g^b ──│
       │                                    │
   B^a 계산                            A^b 계산
       │                                    │
       └────── 같은 비밀 키 = g^(ab) ────────┘

공격자가 A와 B를 모두 보아도, 비밀 a와 b를 알지 못하면 g^(ab)를 계산할 수 없습니다. 이 한 번의 교환만으로 양쪽이 같은 비밀 키를 갖게 되니, 처음부터 키를 공유하지 않고도 안전한 대칭키 통신을 시작할 수 있는 셈이죠.

타원곡선 위에서 같은 일을 하는 변형이 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)입니다. “Ephemeral”이 붙은 이유는 매번 새로운 임시 키를 만들어 쓰기 때문인데요. 이 덕분에 서버의 장기 키가 나중에 새더라도 과거 통신 내용까지 풀리지 않게 되는데, 이를 forward secrecy라고 부릅니다. HTTPS가 기본으로 ECDHE를 쓰는 이유이기도 합니다.

디지털 서명: 해시와 비대칭키의 조합

비대칭키의 또 한 가지 핵심 쓰임새가 디지털 서명입니다. “이 메시지는 정말 그 사람이 보낸 것이고, 도중에 변조되지 않았다”는 사실을 수학적으로 증명해 주는 도구죠.

서명 절차는 해시와 비대칭키의 조합으로 이루어집니다. 보내는 사람은 메시지의 해시를 만든 다음, 그 해시에 자기 개인 키로 서명을 만들어 메시지와 함께 보냅니다. 받는 사람은 같은 방식으로 메시지의 해시를 만들고, 보내는 사람의 공개 키로 서명을 검증해 두 해시가 일치하는지 확인하죠.

디지털 서명의 흐름
보내는 사람:
  메시지 ──▶ 해시 ──▶ 개인 키로 서명 ──▶ 서명값

받는 사람:
  메시지 ──▶ 해시

                   ╲ 비교

  서명값 ──▶ 공개 키로 검증

JWT의 RS256, ES256 같은 서명 알고리즘이 정확히 이 원리로 동작합니다. 큰 메시지에 직접 서명하지 않고 해시에 서명하는 이유는 비대칭키 연산이 비싸기 때문이고, 해시의 충돌 저항성이 받쳐 주기 때문에 짧은 해시에 대한 서명만으로도 원본 메시지의 무결성이 보장되는 셈이죠.

인증서: 공개 키에 신원 묶기

여기까지 오면 한 가지 의문이 남습니다. “공개 키로 누구에게나 메시지를 잠글 수 있고, 누구든 공개 키로 서명을 검증할 수 있다면, 그 공개 키가 정말 내가 통신하려는 그 사람의 것인지 어떻게 확인할까요?” 공격자가 가짜 공개 키를 자기 것이라고 주장하면 모든 보안이 무너지는데요.

이 문제를 푸는 도구가 디지털 인증서입니다. 인증서는 “이 공개 키는 example.com의 주인이 맞다”는 사실을 신뢰할 수 있는 제3자(인증 기관, CA)가 자기 개인 키로 서명해 발급한 문서입니다. 브라우저나 운영 체제는 미리 신뢰할 만한 CA의 공개 키를 들고 있어서, 그 서명을 검증하면 인증서를 믿을 수 있는지 판단할 수 있죠.

HTTPS 글에서 다룬 신뢰의 사슬이 정확히 이 구조입니다. 내 사이트 인증서를 중간 인증서가 보증하고, 중간 인증서를 루트 인증서가 보증하는 식으로 사슬을 따라 올라가다 보면, 결국 브라우저가 알고 있는 루트에 도달하는데요. 이 사슬이 한 군데라도 깨지면 브라우저는 빨간 경고 화면을 띄워 가짜 서버임을 알려 줍니다.

느린 비대칭키, 그래서 하이브리드

비대칭키의 마지막 특징은 느리다는 점입니다. 같은 양의 데이터를 처리할 때 대칭키에 비해 훨씬 많은 연산이 필요해서, 큰 데이터를 직접 비대칭키로 암호화하는 것은 비효율적이죠.

그래서 현실의 시스템은 거의 항상 두 방식을 섞어 씁니다. HTTPS가 좋은 예인데요. 세션을 시작할 때 ECDHE 같은 비대칭키 키 교환으로 짧은 비밀 키 하나를 안전하게 합의하고, 그 뒤로는 그 비밀 키로 AES-GCM 같은 대칭키 암호화로 본 통신을 흘려보냅니다.

이 패턴을 하이브리드 암호화라고 부릅니다. 비대칭키의 키 교환 우아함과 대칭키의 빠른 처리 속도를 모두 챙길 수 있는데요. “비대칭키는 첫 인사, 대칭키는 본 대화”라고 비유하면 두 도구가 어떻게 짝을 이루는지가 또렷해집니다.

양자 컴퓨터와 비대칭키의 미래

비대칭키 암호의 안전성은 결국 “특정 수학 문제가 어렵다”는 가정 위에 서 있습니다. RSA는 큰 수의 소인수분해, ECC는 타원곡선 위의 이산 로그 문제가 어렵다는 가정인데요. 그런데 충분히 강한 양자 컴퓨터가 등장하면 이 두 문제 모두 효율적으로 풀릴 수 있다는 것이 이론적으로 알려져 있습니다.

당장 위협이 되는 단계는 아니지만, 학계와 표준 기관은 미리 대비를 시작했습니다. 양자 컴퓨터에도 강한 새로운 비대칭키 알고리즘을 모아 둔 분야를 포스트 양자 암호(Post-Quantum Cryptography, PQC)라고 부르는데요. NIST가 2024년에 첫 표준을 발표했고, ML-KEM(키 교환용)과 ML-DSA(서명용) 같은 알고리즘이 그 첫 결과물입니다.

당장 대부분의 시스템이 옮겨갈 시기는 아니지만, 새 시스템을 설계할 때 알고리즘을 교체하기 쉬운 구조로 만들어 두면 미래의 전환이 한결 부드러워집니다. 인증서나 키 형식이 알고리즘 식별자를 명시적으로 담도록 설계하는 것이 좋은 출발점이죠.

마치며

비대칭키 암호화는 한 쌍의 키로 키 교환과 디지털 서명이라는 큰 문제를 한꺼번에 풀어내는 도구입니다. 공개 키를 누구에게나 알려도 안전하다는 마법 같은 성질 덕분에, 처음 만나는 두 사람도 안전한 통신을 시작할 수 있게 되었고, 메시지가 누구로부터 왔는지를 수학적으로 증명할 수 있게 되었죠.

해시·대칭키·비대칭키 세 도구를 한자리에 두고 보면, 현대 암호학이 어떻게 이 셋을 엮어 HTTPSJWT 같은 시스템을 만들어 냈는지가 한눈에 들어옵니다. 비대칭키 알고리즘의 자세한 명세가 궁금하다면 RFC 8017 (RSA)을 출발점으로 추천합니다.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord