
GPU 가속 Pollard's Kangaroo 알고리즘을 사용하여 secp256k1에서 타원 곡선 이산 로그 문제(ECDLP)를 해결하며, Vulkan, Metal 및 DX12 백엔드를 지원합니다.
secp256k1에서 타원 곡선 이산 로그 문제(ECDLP)를 해결하기 위한 GPU 가속 Pollard의 캥거루 알고리즘.
--benchmark로 하드웨어 테스트, --save-benchmarks로 결과 기록기존의 대부분 캥거루 구현(JeanLucPons/Kangaroo, RCKangaroo 등)은 CUDA를 통해서만 NVIDIA GPU를 지원합니다. 이 구현은 WebGPU/wgpu를 사용하여 Vulkan, Metal, DX12를 통한 크로스 플랫폼 GPU 컴퓨트를 제공합니다.
paru -S kangaroo
cargo install kangaroo
git clone https://github.com/oritwoen/kangaroo
cd kangaroo
cargo build --release
cargo build --release --features boha
kangaroo --pubkey <PUBKEY> --start <START> --range <BITS>
--target 또는 --pubkey 중 하나가 필수입니다.
데이터 제공자(boha) 사용:
# boha 데이터를 사용하여 퍼즐 해결 (자동: pubkey, start, range)
kangaroo --target boha:b1000/66
# 범위 재정의 (더 작은 부분 검색)
kangaroo --target boha:b1000/66 --range 60
# 사용 가능한 퍼즐 나열
kangaroo --list-providers
수동 매개변수:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
모듈러 제약 조건 포함 (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
이렇게 하면 탐색 공간이 약 60배 줄어듭니다. 부분 키 구조가 알려져 있을 때 유용합니다 (예: 예측 가능한 단계 패턴으로 생성된 키).
Pollard의 캥거루 알고리즘은 O(√n) 시간 내에 이산 로그 문제를 해결합니다. 여기서 n은 검색 범위입니다. 작동 방식:
구별점(Distinguished Points, DP) 최적화: 모든 방문 지점을 저장하는 대신, x-좌표가 특정 개수의 선행 제로 비트를 가진 지점만 저장합니다. 이렇게 하면 메모리 사용량이 크게 줄어들면서도 충돌 감지가 가능합니다.
예상 연산: ~2^(range_bits/2)
파일에 접근하지 않고 하드웨어를 테스트하려면 kangaroo --benchmark를 실행하세요. kangaroo --benchmark --save-benchmarks를 사용하여 BENCHMARKS.md를 업데이트할 수 있습니다.
| 사용 사례 | 예시 |
|---|---|
| 부분 키가 디코딩됨 | 퍼즐이 약 240비트를 제공하고, 나머지 약 16비트를 찾아야 함 |
| 키가 알려진 범위 내에 있음 | 키가 X와 Y 사이라는 것을 알고 있음 |
| 근접 해 검증 | 후보가 있고, 그 주변 ±N 비트를 검색 |
유용하지 않은 경우:
use kangaroo::{KangarooSolver, GpuContext, GpuBackend, parse_pubkey, parse_hex_u256, verify_key};
fn main() -> anyhow::Result<()> {
let pubkey = parse_pubkey("03...")?;
let start = parse_hex_u256("8000000000")?;
let ctx = pollster::block_on(GpuContext::new(0, GpuBackend::Auto))?;
let mut solver = KangarooSolver::new(
ctx,
pubkey.clone(),
start,
40, // range_bits
12, // dp_bits
1024, // num_kangaroos
)?;
loop {
if let Some(key) = solver.step()? {
if verify_key(&key, &pubkey) {
println!("찾음: {}", hex::encode(&key));
break;
}
}
}
Ok(())
}
Kangaroo는 퍼즐 소스를 위한 외부 데이터 제공자를 지원합니다. 제공자는 공개 키, 키 범위 및 기타 퍼즐 메타데이터를 제공합니다.
boha는 비트코인 퍼즐 트랜잭션(b1000)을 포함한 암호화 퍼즐 데이터를 제공합니다.
boha 지원으로 빌드:
cargo build --release --features boha
사용법:
# 특정 퍼즐 해결
kangaroo --target boha:b1000/66
# 해결 가능한 퍼즐 나열 (미해결이며 공개 키가 알려진 것)
kangaroo --list-providers
제공자는 범위 재정의를 검증합니다. 퍼즐의 키 범위를 벗어나서 검색할 수 없습니다.
src/
├── main.rs # CLI 진입점
├── lib.rs # 라이브러리 진입점 + Args + run()
├── solver.rs # GPU 솔버 조정
├── cli.rs # CLI 유틸리티 (tracing, 진행률 표시줄)
├── benchmark.rs # 내장 벤치마크 스위트
├── modular.rs # 모듈러 제약 조건 변환
├── math.rs # 256비트 연산, DP 마스크 생성
├── convert.rs # GPU↔CPU용 Limb/바이트 변환
├── provider/
│ ├── mod.rs # 제공자 시스템 인터페이스
│ └── boha.rs # boha 제공자 (기능 게이트)
├── cpu/
│ ├── cpu_solver.rs # 순수 CPU 솔버 (테스트/비교용)
│ ├── dp_table.rs # 구별점 충돌 감지
│ └── init.rs # 캥거루 초기화 + 점프 테이블
├── crypto/
│ └── mod.rs # k256/secp256k1 래퍼
├── gpu/
│ ├── pipeline.rs # 컴퓨트 파이프라인 설정
│ └── buffers.rs # GPU 버퍼 관리
├── gpu_crypto/
│ ├── context.rs # GPU 컨텍스트 + 백엔드 선택
│ └── shaders/ # WGSL 셰이더 라이브러리
│ ├── field.wgsl # secp256k1 필드 연산
│ └── curve.wgsl # 자코비안 점 연산
└── shaders/
└── kangaroo_affine.wgsl # 메인 캥거루 컴퓨트 셰이더
MIT 라이선스 - 자세한 내용은 LICENSE를 참조하세요.
| 인자 | 기본값 | 설명 |
|---|
-t, --target | - | 데이터 제공자 대상 (예: boha:b1000/135) |
-p, --pubkey | - | 대상 공개 키 (압축 16진수, 33바이트) |
-s, --start | 0 | 검색 범위 시작 (16진수, 0x 접두사 없음) |
-r, --range | 32 | 검색 범위 비트 (키는 [start, start + 2^range - 1] 사이) |
-d, --dp-bits | auto | 구별점 비트 수 |
-k, --kangaroos | auto | 병렬 캥거루 수 |
--gpu | 0 | GPU 장치 인덱스 |
--backend | auto | GPU 백엔드: auto, vulkan, dx12, metal, gl |
-o, --output | - | 결과를 저장할 파일 |
-q, --quiet | false | 최소 출력, 찾은 키만 출력 |
--max-ops | 0 | 최대 연산 수 (0 = 무제한) |
--cpu | false | GPU 대신 CPU 솔버 사용 |
--json | false | 벤치마크 결과를 JSON 형식으로 출력 |
--benchmark | false | 벤치마크 스위트 실행 |
--save-benchmarks | false | --benchmark 사용 시 벤치마크 결과를 BENCHMARKS.md에 저장 |
--mod-step | 1 | 모듈러 단계 M (16진수): k ≡ R (mod M)만 검색 |
--mod-start | 0 | 모듈러 나머지 R (16진수): 0 ≤ R < M |
--list-providers | false | 제공자의 사용 가능한 퍼즐 나열 |