Saved by bc
개인키과 공개키
디지털 서명
readwise.io • 개인키과 공개키
- 큰 그림
Q. 비트코인에서 “디지털 서명한다”는 건 뭐야?
A. 내가 가진 비트코인을 보내기 위해,
내 개인키(e) 로
“이런 트랜잭션을 만들겠습니다”라는 메시지를
수학적으로 서명해서
→ 네트워크에 “이건 진짜 내 돈이고, 내가 보내는 거 맞음”을 증명하는 행위.
2. 타원곡선 세계 vs 개인키
Q. 타원곡선 암호에서 ‘세계’는 어떻게 생겼다고 상상하면 돼?
A. 이미 다음이 고정된 채로 존재하는 세계라고 생각하면 편해:
거대한 바둑판(유한체) : 숫자는 0 ~ p-1 안에서만 노는 세계
그 위에 그려진 곡선 하나 : y² = x³ + 7
그 위의 시작점 G(생성점) : “출발 칸”
이 곡선을 따라 계속 +G를 하며 점프하면, 언젠가 한 바퀴 돌아 제자리 오는 “루프” 구조 → 이 루프의 길이가 위수 n
Q. 개인키 e는 이 세계에서 뭐야?
A. “출발점 G에서 몇 칸 점프할지 정하는 자연수”(1,2,3,…).
e = 1 → 1G = G
e = 2 → 2G (G에서 한 번 더 더한 점)
e = 123456… → eG (G를 e번 더한 점)
즉, 개인키 e를 타원곡선 세계에 ‘대입’하면 그 위치가 공개키 P = eG가 됨.
3. secp256k1에서 고정된 값 vs 내가 고르는 값
Q. secp256k1에서 “이미 정해져 있는 상수들”은 뭐야?
A. 비트코인이 사용하는 타원곡선 규격의 고정값들:
곡선 식: y² = x³ + 7
유한체 소수: p
생성점 좌표: Gx, Gy (합쳐서 G)
위수(루프 길이): n
이 네 가지는 누가 개인키를 갖든 전 세계가 똑같이 공유하는 규칙이야.
Q. 내가 직접 선택하는 값은 뭐야?
A.
개인키 e : 1 이상 n-1 이하의 큰 정수 (나만 아는 값)
메시지 m : “누구에게 얼마 보낼지” 같은 트랜잭션 정보
k : 서명할 때마다 새로 뽑는 1회용 랜덤값(혹은 pseudo-random)
4. 공개키는 어떻게 만들어져?
Q. 개인키 e에서 공개키 P는 어떻게 나오지? (요약)
A.
이미 존재하는 세계: p, G, n, 곡선식 y² = x³ + 7
내가 고르는 개인키 e
“G에서 시작해서 e칸 점프한다” → P = eG
이 P의 (x, y) 좌표가 내 공개키
5. 디지털 서명: 등장인물 정리
5-1. 서명 전에
Q. 서명할 때 기본적으로 알고 있는 값은 뭐야?
A.
개인키: e (나만 암)
공개키: P = eG
타원곡선 세계 상수: p, G, n, 곡선식
서명할 메시지: m (트랜잭션 데이터)
5-2. 서명 단계에서 새로 생기는 알파벳들
Q. z, k, R, r, s, u, v는 각각 뭐야?
z :
메시지 m을 해시(SHA-256 등) 해서 얻는 큰 정수
“이 트랜잭션 내용 전체를 256비트 숫자로 뭉갠 것”
k :
매 서명마다 한 번만 쓰는 임의값(난수)
“이번 서명에서 한 번 쓰고 버릴 1회용 개인키 느낌”
같은 e와 같은 z라도, k가 다르면 서명 결과가 매번 달라짐 → 패턴 노출 방지
R = kG :
k로부터 나온 점 (타원곡선 위의 점)
R의 x좌표를 따서 r 로 사용
r :
R의 x좌표를 적당히 줄여 쓴 값
실제 서명 값의 절반 (r, s 중 r)
s :
s = (z + r·e) / k (mod n) 이라는 수식으로 계산된 값
개인키 e와 k가 들어가지만, 바깥 사람은 이 식을 거꾸로 못 풂
결국 서명 = (r, s)
u, v (검증할 때만 사용):
검증자가 계산하는 중간 값
u = z/s, v = r/s
이걸로 uG + vP 를 계산했을 때, 그 결과가 아까의 R과 같으면 “이 서명은 진짜네!”가 되는 구조
6. 왜 k가 그렇게 중요한가?
Q. “k는 왜 필요해?”를 지금 식으로 다시 말하면?
A.
하나의 개인키 e를 평생 여러 번 쓰니까,
만약 k를 안 쓰고 (e, z)만으로 서명하면,
서명 결과가 패턴을 드러내기 쉽고,
수학적으로 e를 되짚어낼 공격 여지가 커짐.
그래서 매번 새로운 k 로 “랜덤 비틀기”를 해서,
같은 메시지 + 같은 개인키여도
서명 결과 (r, s)가 매번 달라지게 함.
7. 해시 “한다”의 의미
Q. “메시지를 해시해서 z를 구한다”가 구체적으로 뭐야?
A.
메시지 m (트랜잭션 전체 바이트들)을
비트코인에선 보통 SHA-256 혹은 double SHA-256으로 해시
그 결과 256비트(32바이트) 값 → 정수로 해석 → 그게 z
즉, “해시한다” = “정해진 해시 함수(SHA-256)로 m을 256비트 숫자로 압축한다”
8. “수학은 믿고, 메커니즘만 이해하기” 버전 한 줄 요약
Q. 전체 메커니즘을 한 줄로 말하면?
A.
타원곡선 세계(secp256k1) 는 이미 p, G, n, 식이 정해져 있고
나는 그 안에서 e라는 정수(개인키) 를 고르고 → P = eG(공개키) 를 얻고
서명할 메시지 m을 해시해서 z를 만든 뒤
매번 새 k를 뽑아 (r, s) 라는 서명값을 만든 다음
검증자는 공개키 P와 (r, s, z)만 가지고 “이 서명이 진짜 이 사람(eG의 주인)이 한 것인지”를 수학적으로 체크한다.
개인키과 공개키
readwise.io • 개인키과 공개키
[내 이해 방식으로 핵심 정리]
- “바둑판(타원 곡선 세계)은 규격으로 먼저 다 정해져 있음”
- “G에서 시작해 한 칸 한 칸 도는 궤적이 있고”
- “개인키 e = 그 궤적 위에서 e번째 칸 번호”
- “공개키 = 그 칸에 해당하는 점 (x, y)”
[자세히]
1. 타원 곡선 세계(바둑판 이미지)
- 거대한 바둑판 같은 “타원 곡선 세계”가 먼저 정해져 있다.
- 이 세계는 네 가지 상수로 완전히 정의된다:
- 곡선 식:
y² = x³ + 7(a=0, b=7) - 바둑판 크기: 소수
p - 출발점: 생성점
G = (gx, gy) - 한 바퀴 돌 때까지의 칸 수: 위수
n
→ 이 네 개는 secp256k1 규격으로 모두 고정이다.
- 곡선 식:
2. G를 따라 도는 궤적
G는 바둑판 위의 출발점 한 칸.G를 계속 “점 덧셈”으로 더해가면:1G,2G,3G, …,nG이렇게 원형으로 한 바퀴 도는 궤적이 생긴다.nG에서 다시 출발점(무한원점)으로 돌아오고, 그래서 가능한 점 수가n개로 유한하다.
- 이 궤적 위의 각 점이 “공개키 후보들”이다.
3. 개인키를 타원 곡선 세계에 대입하는 관점
- 개인키
e는 그저 1 이상 n-1 이하의 정수 하나. - “개인키에 타원 곡선 함수를 씌운다”가 아니라:
- 이미 존재하는 궤적(1G, 2G, 3G, …) 위에
“e번째 칸으로 점프한다”고 보면 된다.
- 이미 존재하는 궤적(1G, 2G, 3G, …) 위에
- 수식으로:
P = eG- 여기서
P는 궤적 위에서e번째 위치에 있는 점.
→ 이 점의 좌표(x, y)가 공개키.
4. 1, 2 같은 단순 숫자와 256비트 e의 차이
- 개념 상:
e = 1이면P = 1G = G(생성점)e = 2이면P = 2G(G에서 한 칸 더 간 점)
- 실제 개인키는 256비트짜리 매우 큰 정수지만,
- 결국 “몇 칸 갈지”를 나타내는 숫자일 뿐이다.
- 컴퓨터는 이
e를 이진수(비트)로 보고,
“더블링 + 더하기(점 덧셈)” 방식으로 빠르게 eG를 계산한다. - 개념은 “e번 더한다”지만, 구현은 “비트 기반 반복”일 뿐.
5. 요약 Q&A (너 버전)
-
Q. 타원 곡선 세계는 언제 생겨?
A. 먼저 정해져 있다.y² = x³ + 7,p,G,n이 규격(secp256k1)으로 이미 결정돼 있음. -
Q. 개인키는 이 세계와 어떻게 연결돼?
A. 개인키e는 “G에서 몇 칸 갈지”를 말해주는 정수. 이걸 타원 곡선 세계에 대입해서eG위치의 점을 고르는 것. -
Q. 공개키는 정확히 뭐야?
A.P = eG로 얻어진 그 한 점의 (x, y) 좌표. -
Q. 왜 이걸로 안전해?
A.e와G를 알면P(=eG)는 쉽게 구하지만,P와G를 알고 거꾸로e를 찾는 건 거의 불가능한 수준(이산 로그 문제).