공개키 암호화와 키관리 (MPC)

limjisun
NAVER Pay Dev Blog
Published in
9 min readNov 23, 2023

안녕하세요, 네이버페이 금융인프라개발 임지선 입니다.

공개키 암호화의 개념과 거기에서 사용되는 개인키를 안전하게 보관하기 위한 키 암호화 방식에 대해 소개합니다.

공개키 암호화

단방향 암호화

단방향 암호화의 경우 어떠한 해시 함수를 활용하여 암호화만 가능하고 복호화가 불가능합니다. 사이트의 비밀번호를 저장하는 등의 활용이 가능합니다. 사이트에서는 비밀번호의 해시값만 저장하고, 이는 복호화가 불가하기 때문에 비밀번호를 분실할 경우 새로운 비밀번호를 설정해야 합니다.

사용 알고리즘 예시: SHA-256 해시 알고리즘

항상 256비트의 고정된 사이즈로 출력되는 해시함수. 단방향으로 암호화만 가능하고, 입력값으로 출력값을 유추하거나 출력값을 다시 복호화 할 수 없습니다. 출력속도가 매우 빠른것이 장점으로, 블록체인 등에서 사용됩니다.

비밀키 암호화

비밀키 암호화는 하나의 비밀키로 암복호화를 하는 방법입니다. 계산 속도가 빠르며, 암호화와 복호화에 동일한 키를 사용할 때의 문제점은, 어떠한 암호화된 문서를 전달하기 위해서는 어떠한 방식으로든 비밀키를 전달해야 한다는 것입니다. 비밀키만 있다면 누구든지 복호화를 할 수 있기 때문에 유출될 경우를 대비해야 할 것입니다.

사용 알고리즘 예시: AES

키의 길이와 관계없이 128비트의 고정된 블럭 단위로 쪼개어 암호화를 진행합니다 (이때 128비트보다 크기가 작은 블럭이 발생할 경우 임의의 값으로 채우는 Padding으로 해결). 블록 암호 방식 중 CBC (Cipher Block Chaining)를 예시로 확인하면, 128비트로 블럭을 나눈 후 각 블럭을 앞 블럭의 Cipher Text와 XOR 연산을 수행하여 암호화하는 방식입니다. 이때, 가장 첫 블럭은 앞 블럭이 없으므로 IV (Initialization Vector)로 계산합니다.

이미지 출처: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
이미지 출처: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

이 외에도 AES-ECB (Electronic Code Book), AES-CTR (Counter) 방식이 있습니다. 행렬을 이용한 자세한 계산방법은 생략.

공개키 암호화

공개키 암호화는 암복호화에 사용하는 키가 다른 암호화 방식입니다. 누구나 사용할 수 있는 하나의 키를 공개키, 나머지 하나의 키를 개인키라고 합니다. 공개키를 이용해 암호화 한 후 개인키를 이용해 복호화 할 수도, 개인키를 이용해 암호화한 후 공개키로 복호화 할 수도 있습니다.

예시1: 신원 증명

  1. A가 개인키를 이용해 어떤 문서를 암호화
  2. 공개키를 공개해 B가 A의 개인키로 문서를 복호화.

이를 통해 암호화된 문서가 변질되지 않았으며 발행인이 A임을 증명합니다.

예시2: 안전한 데이터 전송

  1. A가 공개되어 있는 B의 공개키를 이용해 암호화
  2. 암호화된 내용은 B의 개인키로만 복호화 가능.

비밀키를 전달하지 않으면서 안전하게 암호화된 내용을 전달할 수 있습니다.

가장 대표적인 공개키 암호화 사용으로는 HTTPS에 사용되는 SSL/TLS 인증서가 있습니다. 브라우저는 인증서를 확인한 후 세션키를 공개키로 암호화해 전송합니다. 서버는 개인키를 이용해 세션키를 얻고 세션키로 메시지를 암호화합니다. 공개키 암호화의 경우 비밀키 암호화보다 느리고 계산이 복잡하므로 세션이 만료되기까지 브라우저와 서버는 세션키를 사용하여 암복호화를 합니다.

사용 알고리즘 예시1: RSA

소인수분해의 어려움에 기반한 알고리즘으로, 두개의 큰 소수를 활용해 공개키와 개인키를 생성합니다. 상세한 방법은 아래와 같습니다.

  1. 두개의 소수 p, q를 곱하여 N을 만든다.
  2. φ(n) = (p — 1)(q — 1) 보다 작은, φ(n)와 서로소인 정수 e를 찾는다.
  3. de ≡ 1 (mod φ(n)) 인 정수 d를 찾는다.

이때 p와 q를 이용한 공개키는 <N, e>, 개인키는 <N, d> 입니다.

RSA에서의 암복호화

공개키 암호화에서 중요한 것은 개인키의 보안입니다. 개인키가 유출될 경우 실효성을 잃게 되기 때문입니다. 개인키의 소유 당사자만 키를 소유하는 경우 개인키의 분실시 복구할 수 있는 방법이 없습니다. 개인키의 보안을 유지하며 관리하기 위한 방법에는 몇가지 대표적인 방식이 있습니다.

MPC (Multi Party Computation, 다자간 연산)

이미지 출처: https://www.pentasecurity.com/solutions/blockchain/mpc-solution/

MPC는 이름 그대로 비밀로 하고자 하는 값 (개인키)을 여러 end point (3개 이상)로 나누어 각자의 입력값으로 연산을 수행하는 방식입니다. 이때 각 end point는 전체 비밀 값을 알 수 없기 때문에 개인키가 유출될 수 있는 단일 실패점 (SPOF, Single Point Of Failure. 전체 시스템 중단을 야기하는 약점)을 제거합니다.

MPC vs Multi-Sig

이미지 출처 : https://scalablesolutions.io/news/cryptocurrency-exchange-hacks/

다중 서명 (Multi-Sig)은 키를 여러곳에 나누어 저장한다는 점에서 MPC와 비교될 수 있습니다. MPC가 키 자체를 쪼개어 각각 연산을 수행한다면, Multi-sig는 키를 여러개 생성하여 서명하는 방식입니다.

각 end point의 오프체인으로 서명을 진행하는 MPC와 달리 Multi-Sig 방식은 여러 키를 하나로 모아 하나의 온체인에서 서명을 진행합니다. MPC와 비교하였을 때 키 분실과 권한 변경에 유연하지 못하고, 키 유출 위험이 존재합니다. (오프체인과 온체인에서 오는 차이)

이미지 출처: https://www.fireblocks.com/blog/mpc-vs-multi-sig/

SSS (Sharmir’s Secret Sharing)

SSS는 키의 독점을 방지하는 비밀공유방식으로 아래 두가지 조건을 만족합니다.

  1. 하나의 Secret을 n개로 나누어 분산해 저장한다. (share)
  2. k개 이상의 Share를 이용해야 Secret을 복원할 수 있다.

이를 만족하기 위해 SSS는 “서로 다른 k개의 점을 지나는 (k-1)차 다항식은 유일하게 존재한다.”는 명제를 기반으로 합니다.

예를 들어, 2차 다항식 y = ax² + bx + c에서 a, b, c를 구하기 위해서는 3개의 점이 필요하다. 다시 말해 n차 다항식의 계수를 구하기 위해서는 n + 1개의 점이 필요한 것입니다. SSS에서는 이를 활용하여 상수항 S를 가지는 임의의 k-1차 다항식을 생성하고, k개의 점(share)을 이용해 다항식을 복원해 S를 구합니다.

TSS (Threshold Signature Scheme)

위의 SSS 방식에서의 허점은, 누가 처음 키(S, Secret)를 분배할 것인가? 입니다. 최초의 다항식을 생성하기 위해서는 누군가 S의 원형을 알고 있어야 하기 때문입니다. TSS는 여기에서 DKG (Distributed Key Generation, 분산 키 생성) 방식을 활용합니다. DKG는 다수의 참여자가 S 값을 모르는 상태에서 share를 생성할 수 있도록 합니다.

위 예시로 확인해보면 도출된 (1, a=19), (2, b=23), (3, c=27)로 y = 4x + 15, 즉 S 값 (y절편)이 15임을 계산할 수 있지만 각 참여자는 이를 확인할 수 없습니다.

SSS방식에서는 S의 복원시에도 동일한 문제가 발생합니다. 단일 시스템이 S를 재조립함으로 S의 원형을 확인할 수 있기 때문입니다. TSS는 이를 임계값 서명 (Threshold Signing)을 이용해 해결합니다. 임계값 서명은 여러 서명에서 단일 디지털 서명을 생성하는 방식으로 S의 복원 없이도 서명이 가능하도록 합니다.

--

--