개요
secp256k1.h와 secp256k1.c는 비트코인 코어 프로젝트에서 개발한 타원곡선 암호화 라이브러리의 핵심 파일입니다[1]. 이 라이브러리는 secp256k1 타원곡선에서의 암호화 연산을 최적화하여 구현한 C 라이브러리로, 비트코인과 같은 암호화폐에서 디지털 서명 및 키 생성에 사용됩니다[2]. 이 문서에서는 두 파일의 구조, 주요 기능, 그리고 내부 구현에 대해 자세히 알아보겠습니다.
secp256k1.h 파일 분석
파일 목적
secp256k1.h는 라이브러리의 공개 API를 정의하는 헤더 파일입니다[1]. 이 파일은 라이브러리를 사용하는 외부 애플리케이션이 접근할 수 있는 모든 함수, 구조체, 상수를 선언합니다[3].
주요 구조체
secp256k1.h에는 다음과 같은 주요 구조체가 정의되어 있습니다:
- secp256k1_context_struct: 라이브러리의 컨텍스트를 저장하는 불투명(opaque) 구조체로, 부작용 채널 누출로부터 보호하기 위한 무작위화 데이터를 저장합니다[3].
- secp256k1_pubkey: 유효한 공개키를 저장하는 불투명 구조체로, 64바이트 크기입니다[3].
- secp256k1_ecdsa_signature: ECDSA 서명을 저장하는 불투명 구조체로, 64바이트 크기입니다[3].
typedef struct secp256k1_context_struct secp256k1_context;
typedef struct secp256k1_pubkey {
unsigned char data[64];
} secp256k1_pubkey;
typedef struct secp256k1_ecdsa_signature {
unsigned char data[64];
} secp256k1_ecdsa_signature;
주요 함수 그룹
secp256k1.h에 선언된 함수들은 다음과 같은 그룹으로 분류할 수 있습니다:
- 컨텍스트 관리 함수:
secp256k1_context_create
: 새 컨텍스트 생성[3]secp256k1_context_clone
: 컨텍스트 복제[3]secp256k1_context_destroy
: 컨텍스트 소멸[3]secp256k1_context_randomize
: 부작용 채널 보호를 위한 컨텍스트 무작위화[3]
- 공개키 관련 함수:
secp256k1_ec_pubkey_parse
: 직렬화된 공개키 파싱[3]secp256k1_ec_pubkey_serialize
: 공개키 직렬화[3]secp256k1_ec_pubkey_cmp
: 공개키 비교[3]secp256k1_ec_pubkey_create
: 비밀키로부터 공개키 생성[3]
- ECDSA 서명 관련 함수:
secp256k1_ecdsa_signature_parse_der
: DER 형식 서명 파싱[3]secp256k1_ecdsa_signature_parse_compact
: 컴팩트 형식 서명 파싱[3]secp256k1_ecdsa_signature_serialize_der
: DER 형식으로 서명 직렬화[3]secp256k1_ecdsa_signature_serialize_compact
: 컴팩트 형식으로 서명 직렬화[3]secp256k1_ecdsa_sign
: 메시지 해시에 서명[3]secp256k1_ecdsa_verify
: 서명 검증[3]
- 키 조작 함수:
secp256k1_ec_seckey_verify
: 비밀키 유효성 검증[3]secp256k1_ec_seckey_negate
: 비밀키 부정[3]secp256k1_ec_pubkey_negate
: 공개키 부정[3]secp256k1_ec_seckey_tweak_add
: 비밀키에 스칼라 값 더하기[3]secp256k1_ec_pubkey_tweak_add
: 공개키에 스칼라 값 더하기[3]secp256k1_ec_seckey_tweak_mul
: 비밀키에 스칼라 값 곱하기[3]secp256k1_ec_pubkey_tweak_mul
: 공개키에 스칼라 값 곱하기[3]
상수 및 플래그
secp256k1.h는 다양한 상수와 플래그를 정의합니다:
#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT)
#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY)
#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN)
#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION)
#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION)
이러한 플래그들은 컨텍스트 생성 및 공개키 직렬화 시 사용됩니다[3].
secp256k1.c 파일 분석
파일 목적
secp256k1.c는 secp256k1.h에 선언된 공개 API 함수들의 실제 구현을 담고 있는 소스 파일입니다[4]. 이 파일은 다양한 내부 구현 파일들을 포함하여 전체 라이브러리의 기능을 통합합니다[4].
주요 구현 세부사항
- 컨텍스트 구조체 구현:
struct secp256k1_context_struct {
secp256k1_ecmult_gen_context ecmult_gen_ctx;
secp256k1_callback illegal_callback;
secp256k1_callback error_callback;
int declassify;
};
이 구조체는 타원곡선 곱셈 컨텍스트, 콜백 함수, 그리고 디클래시파이 플래그를 포함합니다[4].
- 인자 검증 매크로:
#define ARG_CHECK(cond) do { \
if (EXPECT(!(cond), 0)) { \
secp256k1_callback_call(&ctx->illegal_callback, #cond); \
return 0; \
} \
} while(0)
이 매크로는 함수 인자의 유효성을 검사하고, 조건이 충족되지 않으면 콜백을 호출합니다[4].
- 정적 컨텍스트:
static const secp256k1_context secp256k1_context_static_ = {
{ 0 },
{ secp256k1_default_illegal_callback_fn, 0 },
{ secp256k1_default_error_callback_fn, 0 },
0
};
const secp256k1_context * const secp256k1_context_static = &secp256k1_context_static_;
이 정적 컨텍스트는 제한된 기능만 제공하며, 주로 자체 테스트와 함께 사용됩니다[4].
주요 함수 구현
- secp256k1_ecdsa_sign:
이 함수는 메시지 해시에 ECDSA 서명을 생성합니다[4]. 내부적으로secp256k1_ecdsa_sign_inner
함수를 호출하여 실제 서명 작업을 수행합니다[4]. - secp256k1_ecdsa_verify:
이 함수는 ECDSA 서명의 유효성을 검증합니다[4]. 서명의 s 값이 낮은 형태인지 확인하고, 공개키를 로드한 후 서명을 검증합니다[4]. - nonce_function_rfc6979:
이 함수는 RFC6979에 따라 결정론적 논스를 생성합니다[4]. 이는 동일한 메시지와 키에 대해 항상 동일한 논스를 생성하여 무작위성 문제로 인한 보안 취약점을 방지합니다[4]. - secp256k1_ec_pubkey_create:
이 함수는 비밀키로부터 공개키를 생성합니다[4]. 내부적으로secp256k1_ec_pubkey_create_helper
함수를 호출하여 실제 생성 작업을 수행합니다[4].
내부 구현 구조
secp256k1 라이브러리는 모듈식 구조로 설계되어 있으며, 다음과 같은 주요 구현 파일들을 포함합니다:
필드 연산 구현
필드 연산은 secp256k1 곡선의 유한체 상에서의 산술 연산을 구현합니다[5]:
- field_impl.h: 필드 연산의 일반적인 인터페이스를 정의합니다[5].
- field_5x52_impl.h: 64비트 아키텍처를 위한 5×52 비트 표현을 사용한 필드 연산 구현입니다[5][6].
- field_10x26_impl.h: 32비트 아키텍처를 위한 10×26 비트 표현을 사용한 필드 연산 구현입니다[5][6].
스칼라 연산 구현
스칼라 연산은 secp256k1 곡선의 그룹 위수에 대한 모듈로 연산을 구현합니다[7][8]:
- scalar_impl.h: 스칼라 연산의 일반적인 인터페이스를 정의합니다[7].
- scalar_4x64_impl.h: 64비트 아키텍처를 위한 4×64 비트 표현을 사용한 스칼라 연산 구현입니다[7][8].
- scalar_8x32_impl.h: 32비트 아키텍처를 위한 8×32 비트 표현을 사용한 스칼라 연산 구현입니다[7].
그룹 연산 구현
그룹 연산은 타원곡선 위의 점 연산을 구현합니다[9]:
- group_impl.h: 타원곡선 점 연산(덧셈, 두 배, 부정 등)을 구현합니다[9].
- ecmult_impl.h: 일반적인 점 스칼라 곱셈을 구현합니다[9][10].
- ecmult_gen_impl.h: 기준점(제너레이터)에 대한 스칼라 곱셈을 최적화하여 구현합니다[9][10].
- ecmult_const_impl.h: 상수 시간 점 스칼라 곱셈을 구현합니다[9].
최적화 기법
secp256k1 라이브러리는 다양한 최적화 기법을 사용하여 성능을 향상시킵니다:
- 내부 구조 최적화: 필드 연산에서 5×52 비트(64비트 아키텍처용) 또는 10×26 비트(32비트 아키텍처용) 표현을 사용하여 오버플로우를 최소화하고 성능을 향상시킵니다[6].
- 엔도모피즘 최적화: secp256k1 곡선은 특별한 엔도모피즘 속성을 가지고 있어, 스칼라 곱셈 연산을 약 30% 가속화할 수 있습니다[11]. 이는
scalar_split_lambda
함수를 통해 구현됩니다[7]. - 윈도우 방식 곱셈: 점 스칼라 곱셈에서 윈도우 방식을 사용하여 사전 계산된 테이블을 활용함으로써 성능을 향상시킵니다[9].
- 상수 시간 구현: 부작용 채널 공격을 방지하기 위해 많은 연산이 상수 시간으로 구현되어 있습니다[12].
모듈 시스템
secp256k1 라이브러리는 선택적으로 활성화할 수 있는 여러 모듈을 제공합니다:
- recovery: 서명으로부터 공개키를 복구하는 기능을 제공합니다[12][13].
- ecdh: 타원곡선 디피-헬만 키 교환 기능을 제공합니다[12][13].
- schnorrsig: BIP-340에 따른 슈노르 서명 기능을 제공합니다[12][13].
- extrakeys: 추가적인 키 관리 기능을 제공합니다[4].
- ellswift: BIP-324에 따른 ElligatorSwift 키 교환 기능을 제공합니다[5].
이러한 모듈들은 컴파일 시 ENABLE_MODULE_XXX
플래그를 통해 활성화할 수 있습니다[4].
빌드 및 컴파일 옵션
secp256k1 라이브러리는 다양한 빌드 옵션을 제공합니다:
- 필드 구현 선택:
- 64비트 아키텍처에서는 5×52 비트 표현이 기본값입니다[6].
- 32비트 아키텍처에서는 10×26 비트 표현이 기본값입니다[6].
- 최적화 옵션:
ECMULT_WINDOW_SIZE
: 점 곱셈에 사용되는 윈도우 크기를 설정합니다[14].ECMULT_GEN_PREC_BITS
: 기준점 곱셈의 정밀도 비트를 설정합니다[14].
- 모듈 활성화:
ENABLE_MODULE_RECOVERY
: 공개키 복구 모듈을 활성화합니다[15][16].ENABLE_MODULE_ECDH
: ECDH 모듈을 활성화합니다[4][16].ENABLE_MODULE_SCHNORRSIG
: 슈노르 서명 모듈을 활성화합니다[4][16].
- 실험적 기능:
SECP_BUNDLED_EXPERIMENTAL
: 실험적 모듈을 활성화합니다[17][16].
결론
secp256k1.h와 secp256k1.c는 비트코인과 같은 암호화폐에서 사용되는 고성능 타원곡선 암호화 라이브러리의 핵심 파일입니다[1][2]. 이 라이브러리는 secp256k1 곡선에서의 ECDSA 서명 생성 및 검증, 키 생성, 직렬화 등의 기능을 제공하며, 다양한 최적화 기법을 통해 뛰어난 성능을 발휘합니다[12][13].
라이브러리는 모듈식 구조로 설계되어 있어 필요에 따라 추가 기능을 선택적으로 활성화할 수 있으며, 다양한 아키텍처에서 최적의 성능을 발휘할 수 있도록 여러 구현 방식을 제공합니다[5][6]. 또한 상수 시간 구현과 같은 보안 기능을 통해 부작용 채널 공격에 대한 보호를 제공합니다[12].
이러한 특성들로 인해 secp256k1 라이브러리는 암호화폐 시스템뿐만 아니라 높은 성능과 보안이 요구되는 다양한 암호화 애플리케이션에서 널리 사용되고 있습니다[2][12].
출처
[1] secp256k1/include/secp256k1.h at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h
[2] bitcoin-core/secp256k1: Optimized C library for EC … – GitHub https://github.com/bitcoin-core/secp256k1
[3] secp256k1 library building for C++ – Bitcoin Stack Exchange https://bitcoin.stackexchange.com/questions/115642/secp256k1-library-building-for-c
[4] Secp256k1 in secp256k1 – Rust https://tidelabs.github.io/tidechain/secp256k1/struct.Secp256k1.html
[5] [PDF] Implementation of PSEC-KEM (secp256r1 and secp256k1) on … https://cse.iitkgp.ac.in/~debdeep/osscrypto/psec/downloads/PSEC-KEM_prime.pdf
[6] GitHub – ludbb/secp256k1-py: Python FFI bindings for secp256k1 :dizzy: https://github.com/ludbb/secp256k1-py
[7] secp256k1 – PyPI https://pypi.org/project/secp256k1/
[8] secp256k1-zkp on Pypi https://libraries.io/pypi/secp256k1-zkp
[9] Crate bitcoinsecp256k1_scalarCopy item path https://docs.rs/bitcoinsecp256k1-scalar/latest/bitcoinsecp256k1_scalar/
[10] How to compile Secp256K1 .a static library for different architectures https://github.com/bitcoin-core/secp256k1/issues/1109
[11] secp256k1/src at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/tree/master/src
[12] README ¶ https://pkg.go.dev/github.com/ltcmweb/secp256k1
[13] libsecp256k1 https://packages.guix.gnu.org/packages/libsecp256k1/
[14] [PDF] Speed Optimizations in Bitcoin Key Recovery Attacks https://eprint.iacr.org/2016/103.pdf
[15] damus http://git.jb55.com/damus/file/nostrdb/secp256k1.h.html
[16] Using secp256k1 with wolfSSL: A Step-by-Step Guide https://wolfssl.com/using-secp256k1-with-wolfssl-a-step-by-step-guide
[17] q9f/secp256k1.cr – GitHub https://github.com/q9f/secp256k1.cr
[18] Failed to compile with secp256k1 library – Stack Overflow https://stackoverflow.com/questions/70462459/failed-to-compile-with-secp256k1-library
[19] Secp256k1 – bitcoin-s https://bitcoin-s.org/docs/next/secp256k1/secp256k1
[20] Secp256k1 – River https://river.com/learn/terms/s/secp256k1/
[21] Documentation ¶ https://pkg.go.dev/gitlab.com/yawning/secp256k1-voi/secec
[22] bitcoin-core-secp256k1 on CocoaPods https://libraries.io/cocoapods/bitcoin-core-secp256k1
[23] secp256k1/src/secp256k1.c at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/src/secp256k1.c
[24] GitHub – qdrvm/libsecp256k1: Optimized C library for EC operations on curve secp256k1 https://github.com/qdrvm/libsecp256k1
[25] Trying to attack SECP256K1 (2025) – LinkedIn https://www.linkedin.com/pulse/trying-attack-secp256k1-2025-sebastian-arango-vergara-s3fyc
[26] Secp256k1 – Bitcoin Wiki https://en.bitcoin.it/wiki/Secp256k1
[27] secp256k1 package – github.com/decred/dcrd/dcrec/secp256k1/v4 https://pkg.go.dev/github.com/decred/dcrd/dcrec/secp256k1/v4
[28] secp256k1/src/scalar_4x64_impl.h at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/src/scalar_4x64_impl.h
[29] What is the difference between secp256k1_ecmult_gen and secp256k1_ecmult? https://bitcoin.stackexchange.com/questions/103060/what-is-the-difference-between-secp256k1-ecmult-gen-and-secp256k1-ecmult
[30] GitHub – demining/Endomorphism-Secp256k1: Speed up secp256k1 with endomorphism https://github.com/demining/Endomorphism-Secp256k1
답글 남기기