BSL 아카데미 1기 공부장
BSL 비트코인 개발자 아카데미 1기 수강 기간 동안 공부한 내용들을 책갈피하고 나만의 방식으로 이해해 나가보자
BSL 아카데미 1기 공부장
BSL 비트코인 개발자 아카데미 1기 수강 기간 동안 공부한 내용들을 책갈피하고 나만의 방식으로 이해해 나가보자
유한체
Q. 유한체에서 “p로 나눈다”고 할 때 p는 뭘 의미해?
A. p는 ‘prime’, 즉 소수(prime number) 를 의미하는 기호로 쓰인다. 유한체에서 자주 등장하는 p는 대부분 “소수인 법(mod) 값”이다.
Q. 프라임 넘버가 소수라는데, 소수점이 있는 그 소수야?
A. 아니다.
Q. 7은 소수라고 하는데, 6일 때는 왜 안 돼? p=6도 있을 수 있는 거 아닌가?
A.
유한체(특히 p개의 원소를 가진 체)는 p가 소수일 때만 잘 동작한다.
p가 소수여야만:
p=6처럼 소수가 아니면, 곱셈에 대한 역원이 없는 원소들이 생겨서 “체”가 되지 못한다. (예: mod 6 에서는 2·3=0 이라서 문제들이 생김)
Q. 모듈러 연산은 어떻게 이해하면 돼?
A.
a % p 또는 a mod p.예시:
유한체 GF(p)에서는 원소들이 {0, 1, 2, …, p-1}이고,
덧셈·곱셈은 항상 이런 식으로 계산 후 p로 나머지를 취한다.
Q. p=7인 유한체에서는 구체적으로 어떻게 계산해?
A. 원소 집합: {0,1,2,3,4,5,6} 이고, 모든 연산은 % 7로 한다.
Q. 항등원, 역원은 느낌만 기억하면 어떻게?
A.
항등원(identity): “연산해도 값이 안 변하게 해 주는 원소”
역원(inverse): “연산했을 때 항등원이 되게 해 주는 원소”
유한체 GF(p)에서는 0을 제외한 모든 원소가 곱셈 역원을 가진다.
예: p=7일 때
Q. 유한체를 감으로만 정리하면?
A.
{0,1,…,p-1}.타원곡선
02_타원곡선
Q1. secp256k1은 뭐냐?
A1. 타원곡선 암호(ECC)에서 쓰는 “특정 곡선”의 규격이다.
sec : Standards for Efficient Cryptography
p : 소수(Prime) 위의 유한체에서 정의됨
256 : 사용하는 수의 비트 길이(256-bit)
k1 : Koblitz 계열 곡선 중 첫 번째
Q2. secp256k1은 타원곡선 암호의 여러 곡선 중 하나인가?
A2. 그렇다. ECC에는 많은 곡선(NIST P-256 등)이 있고, 그 중 비트코인이 선택한 곡선이 secp256k1이다.
Q3. 비트코인에서 secp256k1은 어디에 쓰이나?
A3. “개인키 → 공개키”를 만드는 데 쓰는 타원곡선이다.
개인키: 큰 정수(스칼라)
공개키: secp256k1 위의 점(타원곡선 위의 좌표)
관계: 공개키 = 개인키 × 기준점(G) (점 덧셈/배수를 secp256k1 위에서 수행)
Q4. secp256k1은 디지털 서명에도 쓰이나?
A4. 예. 비트코인의 ECDSA에서
개인키: 서명 생성에 사용
공개키: 서명 검증에 사용
이때 사용되는 수학 연산(점 덧셈/스칼라 곱)이 모두 secp256k1 곡선 위에서 이루어진다.
Q5. 개인키 그 자체에는 타원곡선이 사용되지 않나?
A5. 그렇다.
개인키 = 1 ~ n-1 범위의 임의의 256비트 정수
이 “숫자 그 자체”를 만드는 데는 타원곡선이 직접적으로 개입하지 않는다.
다만 이 숫자가 secp256k1의 군(order)에 맞는 범위 안이어야 한다는 제약은 있다.
Q6. ‘prime field’는 유한체를 의미하나?
A6. “소수 차수의 유한체”를 의미한다.
일반: 유한체 = 원소 개수가 유한한 체
prime field: 원소 개수가 소수 p 개인 유한체 GF(p)
secp256k1은 GF(p) 위에 정의된 타원곡선이라서 p가 들어간다.
Q7. secp256k1 이름을 다시 정리하면?
A7. 대략 다음 의미로 기억하면 된다.
sec : Standards for Efficient Cryptography
p : prime field(소수 개수의 유한체)
256 : 256-bit 보안 파라미터
k1 : Koblitz 계열 첫 번째 곡선
개인키과 공개키
[내 이해 방식으로 핵심 정리]
[자세히]
y² = x³ + 7 (a=0, b=7)pG = (gx, gy)nG는 바둑판 위의 출발점 한 칸.G를 계속 “점 덧셈”으로 더해가면:
1G, 2G, 3G, …, nG 이렇게 원형으로 한 바퀴 도는 궤적이 생긴다.nG에서 다시 출발점(무한원점)으로 돌아오고, 그래서 가능한 점 수가 n개로 유한하다.e는 그저 1 이상 n-1 이하의 정수 하나.P = eGP는 궤적 위에서 e번째 위치에 있는 점.(x, y)가 공개키.e = 1 이면 P = 1G = G (생성점)e = 2 이면 P = 2G (G에서 한 칸 더 간 점)e를 이진수(비트)로 보고,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를 찾는 건 거의 불가능한 수준(이산 로그 문제).
디지털 서명
내 개인키(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의 주인)이 한 것인지”를 수학적으로 체크한다.
Base58Check 인코딩 만약 여러분의 개인키가 아래와 같다고 해보자 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 소문자 엘과 대문자 아이, 숫자 영과 대문자 오를 구분하는것이 너무 어렵다.
혹시나 타이핑 오류가 나지 않았을지 걱정된다.
그래서 아래와 같이 개인키를 표현할 수 있다.
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ 여기엔 대문자 오, 대문자 아이, 소문자 엘, 숫자 영이 없다.
타이핑 오류를 방지해준다.
Base58이 있고, Base58Check가 있음. 뒤에꺼는 체크섬이 추가됨.
크기의 한계를 극복하기 위해 비트코인에서는 압축 공개키를 사용한다.
비트코인의 1byte는 1byte가 아니다. 1byte 곱하기 전세계 노드수이므로 2025년 기준 1byte는 수만byte와 같다.
트랜잭션 수수료는 비트코인의 양이 아닌 트랜잭션에 사용되는 용량 기준이므로 용량이 돈임.
그래서 비트코인은 1byte 줄이는데에 진심이며, 온갖 수학적 고민이 담겨 있다.