← 목록
기타 2026-07-10 3KB 읽기 3분

ECC(타원곡선) 점연산 + ECDSA — bignum P3 위 keystone 후속

개요

libs/bignum.한선(임의정밀도 큰수, P3) 위에 실제 secp256k1(비트코인/ 이더리움 서명곡선) 타원곡선 점연산과 ECDSA 서명/검증을 순수 한선씨로 구현. 교육/키스톤 목적(상수시간 아님). C 소스 무접촉, libs 신규 파일만.

무엇을 했는지

  • 신규 libs/타원곡선.한선 (pkg/libs와 하드링크 자동 동기):
  • 모듈러 산술: EC_모드, EC_모듈러역원(이진 확장유클리드 HAC 14.61)
  • 점연산: EC_점덧셈/EC_점두배/EC_점스칼라곱(double-and-add), affine
  • 곡선: EC_secp256k1, EC_토이곡선, EC_온커브검사
  • ECDSA: EC_ECDSA키생성, EC_서명, EC_검증
  • 검증(전부 Python 독립구현 정확 일치):
  • 토이곡선 y²=x³+2x+2 mod 17: 2G=(6,3), 3G=(10,6) ✅
  • secp256k1 2G/3G 좌표 4개 전부 Python·OpenSSL 대조 ✅
  • ECDSA 왕복: Q,r,s Python 일치 + 자기서명 검증=1(유효) ✅
  • 위조방지: 변조 메시지 → 검증 -1(무효) ✅ (r+1 변조 케이스는 타임아웃 전 미출력)
  • 성능 실측: 모듈러역원 ~0.3s, 점연산 ~1.5–2s, 스칼라곱(27비트) ~27s,
  • 검증(2×256비트 스칼라곱) ~5–8분.

    발견한 VM 함정 (후속 라이브러리 공통)

    1. 페르마 소정리 역원(a^(p-2))은 256비트 지수 반복이 배열힙 144M셀을 단
    1회 호출로 소진(OOM) → 이진 확장유클리드로 교체.
    1. VM 배열/맵 힙은 자동 GC 없는 bump(배열1개≈4097셀, 맵1개≈1459셀).
    메모리마커/복원(730/731), 맵힙마커/복원(734/735) 수동 회수. 점연산 함수를 반환 직전 마커복원+문자열재구성으로 "힙 중립"화.
    1. 매 스텝 문자열 직렬화는 문자열 핸들 상한(48만, exit43) 과소모 →
    메모리마커() 정수조회로 배열힙 증가만 감시, 임계(1500만) 초과 시에만 직렬화하는 적응형 체크포인트.

    관련 파일

    • /Users/ef/CrownyOS/crownyc/libs/타원곡선.한선 (신규, ≈21.5KB)
    • /Users/ef/CrownyOS/crownyc/docs/한선씨-P4보완-20260710/ECC검증.md (검증 로그)
    • 기반(수정 없음): libs/bignum.한선
    • Python 오라클: scratchpad/ecc/ref.py (OpenSSL 파싱 매개변수)

    잔여 이슈

    • 상수시간 아님(사이드채널). Jacobian 좌표 미구현(성능). Ed25519 별도 과제.
    • 실 TLS/지갑 미연동, DER/compressed pubkey 직렬화 미구현.
    • 검증이 유독 느림: u1/u2는 개인키가 작아도 항상 256비트 → 개선하려면
    Jacobian+windowed NAF 필요(후속).