블록체인/레벨 II · 작동 원리/2.1 암호학/수업 3
개인 키, 공개 키, 그리고 secp256k1
정수, 곡선, 그리고 한쪽으로만 열리는 문
준비물위트니스 데이터를 보여주는 블록 탐색기A. M. 안토노풀로스 & D. A. 하딩, 『마스터링 비트코인』, 3판 (2023), 4장
호기심
- 점에 숫자를 곱하는 데는 밀리초밖에 걸리지 않는데, 이를 역산하는 데는 왜 우주의 나이보다 더 긴 시간이 걸릴까요?
- secp256k1이 다른 대부분의 디지털 서명에 사용되는 NIST 곡선들과 구조적으로 다른 점은 무엇인가요?
- 32바이트 값 하나가 어떻게 누가 통제하는지 드러내지 않으면서 수십억 달러 규모의 자산을 통제할 수 있을까요?
탐구
- 비트코인 개인 키는 1부터 n−1 사이의 임의의 정수로, 여기서 n은 곡선의 생성점의 차수입니다. 이 숫자 n은 약 1.158 × 10^77로, 78자리 수에 해당하며, 관측 가능한 우주에 있는 원자의 수(약 10^80)와 그다지 차이가 나지 않습니다. 공개 키는 스칼라 곱셈을 통해 도출되는데, 이 정수 k를 타원곡선 위의 고정된 생성점 G와 곱하는 방식입니다. G는 모든 비트코인 사용자에게 일정하므로, 각기 다른 k 값은 곡선 상에서 유일하고 결정론적인 점 K를 만들어냅니다.
- secp256k1 곡선은 p = 2^256 − 2^32 − 977인 소수체 위에서 방정식 y² = x³ + 7로 정의됩니다. 이 매개변수 집합은 Certicom의 SEC 2 표준에서 정해졌습니다. 2009년에 secp256k1을 선택한 것은 이례적이었습니다. secp256k1은 닐 코블리츠의 이름을 딴 코블리츠 곡선으로, 특수한 구조(효율적으로 계산 가능한 자기준동형사상) 덕분에 스칼라 곱셈을 더 빠르게 할 수 있고, 출처가 설명되지 않은 무작위 시드로 생성한 곡선과 달리 매개변수에 숨겨진 선택이 끼어들 여지가 거의 없습니다. 사토시 나카모토는 이 선택의 이유를 끝내 설명하지 않았습니다.
- 스칼라 곱셈이 빠른 이유는 구현체들이 개인 키의 이진 표현을 한 비트씩 처리하는 더블 앤 애드(double-and-add) 알고리즘을 사용하기 때문입니다. 점을 두 배로 하는 것과 다른 점을 더하는 것은 컴퓨터가 마이크로초 단위로 실행하는 기본 곡선 연산입니다. 그러나 이 연산을 거꾸로 하는 것, 즉 K와 G로부터 k를 구하는 것은 타원곡선 이산 로그 문제(ECDLP)로 알려져 있습니다. secp256k1에서 ECDLP를 푸는 효율적인 고전 알고리즘은 알려져 있지 않으며, 키 공간을 브루트포스로 탐색하는 것은 계산상 불가능하므로 고전적 공격에 대해 약 128비트 보안을 제공합니다.
- 공개 키는 저장과 전송을 위해 특정 형식으로 직렬화됩니다. 비압축 공개 키는 65바이트로, 프리픽스 04 뒤에 x 좌표와 y 좌표가 이어집니다. 압축 공개 키는 33바이트로, y 좌표의 패리티를 나타내는 프리픽스 02 또는 03을 사용하므로 x 좌표만으로 복원할 수 있습니다. 2021년 11월에 활성화된 Taproot는 x-only 키라는 추가 최적화를 사용하는데, 이 키는 32바이트이며 프리픽스를 완전히 생략하고 슈노어 서명 방식의 특성에 의존합니다.
- 개인 키와 공개 키의 관계는 철저히 일방향적입니다. 이 크기의 곡선에서는 이산 로그 문제가 여전히 풀리지 않았기 때문에, 공개 키를 공유해도 개인 키에 관해서는 아무것도 드러나지 않습니다. 반대로 개인 키를 가지고 있으면 대응하는 공개 키를 즉시 계산할 수 있습니다. 이 비대칭성이 비트코인 소유권 모델의 토대입니다. 누구나 키 자체를 보지 않고도 서명이 특정 개인 키로 만들어졌는지 검증할 수 있습니다.
- 이러한 메커니즘을 확인하려면 아무 블록 탐색기나 열고 트랜잭션 입력을 찾으세요. 네이티브 SegWit(P2WPKH) 지출의 경우 위트니스에 서명과 33바이트 압축 공개 키가 들어 있고, Taproot 키 경로 지출의 경우 32바이트 키는 출력 자체에 있으며 위트니스에는 서명만 들어 있습니다. 이를 이전 출력의 주소와 비교해 보세요. 주소는 공개 키의 해시이지만, 지출 시에는 원시 키가 여기에 나타납니다. 공개 키 좌표는 곡선 위의 점을 나타내는 16진수 문자열로, SegWit 버전 0 주소에 쓰이는 20바이트 및 32바이트 해시와는 다르다는 점에 유의하세요.
핵심 사실
- 개인 키는 1과 n−1 사이의 임의의 정수이며, 여기서 n ≈ 1.158 × 10^77입니다.
- secp256k1은 소수체 p = 2^256 − 2^32 − 977 위에서 y² = x³ + 7로 정의됩니다.
- 스칼라 곱셈 k·G를 통해 공개키가 생성되며, 이를 역산하는 것(ECDLP)은 계산상 불가능합니다.
- 압축되지 않은 공개 키는 65바이트(프리픽스 04)이며, 압축된 키는 33바이트(프리픽스 02/03)입니다.
- Taproot는 y좌표와 프리픽스를 완전히 생략한 32바이트의 x-only 키를 사용합니다.
- secp256k1은 설명되지 않은 파라미터가 거의 없는 코블리츠 곡선으로, 2009년에 사토시가 선택한 것입니다.
연습 아홉, 여섯, 셋, 하나
9모으기secp256k1의 9가지 특성을 나열하세요: 방정식, 유한체의 소수, 생성점의 차수, 키 크기(비압축/압축/x-only), 보안 수준, 표준 출처, 곡선 유형, 그리고 채택에 관한 역사적 사실 두 가지.
6묶기9개를 6개로 묶으세요: 방정식과 유한체, 생성점과 차수, 키 형식, 보안 수준, 표준의 역사, 채택.
3추리기6개를 secp256k1이 비트코인의 소유권 모델에 적합한 3가지 이유로 줄이세요.
1결정화비밀 정수를 공개 점으로 바꾸는 정확한 수학 연산을 한 문장으로 서술하고, 이를 되돌리지 못하게 막는 문제의 이름을 쓰세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.