ERC-2333 BLS12-381 키 생성 표준 (BLS12-381 Key Generation)
Review · 계정·지갑 · 2019-09-30 작성
비밀 시드 하나에서 트리 구조로 BLS12-381 키를 사실상 무제한 파생하는 방법을 정합니다. 파생 과정에 양자컴퓨터에도 안전한 비상 백업 서명 수단이 함께 만들어집니다.
왜 필요한가
이더리움 비컨 체인은 BLS12-381이라는 타원곡선으로 서명하는데, 기존에 널리 쓰이던 키 파생 표준인 BIP32는 이 곡선에 맞지 않습니다. BIP32는 곡선의 차수보다 큰 값을 무효한 키로 버리는데, BLS12-381의 개인키 부분군 차수와 사용되는 엔트로피 크기를 따지면 BIP32로 만든 키의 54% 이상이 무효가 됩니다. 또 사용자들이 키를 만들기 시작한 뒤에 표준이 나오면 도구마다 방식이 갈라져 키 관리 시스템 간 이동이 어려워집니다. 마지막으로, 양자컴퓨터가 갑자기 발전해 BLS12-381이 안전하지 않게 되는 상황에 대비하려면 미리 공유된 공개키로 새 서명 체계로 갈아탈 수 있는 장치가 필요합니다. 이 표준은 이 세 문제를 한 번에 풉니다.
심층 설명
트리 구조와 경로 표기
키는 트리의 시드와 경로로 정해집니다. 뿌리인 마스터 키는 m으로 쓰고 깊이는 /로 구분합니다. 마스터 키의 첫 자식은 m / 0이고, 형제들은 0 <= i < 2**32 범위의 m / i입니다. 자식 키를 만드는 데는 부모의 개인키와 자식의 인덱스만 있으면 되므로, 조상 키 하나만 알면 그 아래 가지 전체를 파생할 수 있습니다. 어떤 경로를 어떤 용도로 쓸지는 별도 표준이 정하도록 열어 두었습니다.
derive_master_SK: 마스터 키 생성
입력은 트리 전체의 엔트로피 원천인 seed로, 256비트 이상의 옥텟 문자열이어야 합니다. 절차는 SK = HKDF_mod_r(seed) 한 줄입니다. 시드는 니모닉에서 파생하는 것이 이상적이며, BIP-39의 mnemonic_to_seed 방식을 쓰도록 의도되어 있습니다. 테스트 케이스 0은 니모닉 "abandon ... about"과 패스프레이즈 "TREZOR"로 시드를 만들어 니모닉부터 자식 키까지 전체 스택을 검증할 수 있게 합니다.
derive_child_SK: 자식 키 파생
부모 개인키 parent_SK와 인덱스 index(0 <= index < 2^32)를 받아 자식 개인키를 돌려줍니다. 절차는 두 단계입니다. 먼저 parent_SK_to_lamport_PK(parent_SK, index)로 압축 램포트 공개키를 얻고 이를 HKDF_mod_r에 넣어 자식 키를 만듭니다. 즉 모든 자식 키는 램포트 중간 키를 거쳐 만들어지며 이 설계가 양자내성 백업을 공짜로 끼워 넣는 핵심입니다.
램포트 중간 키의 생성 과정
IKM_to_lamport_SK는 비밀 문자열 IKM과 salt를 받아 RFC5869의 HKDF-Extract와 HKDF-Expand(SHA256)로 늘린 뒤 32옥텟씩 잘라 255개짜리 램포트 개인키 배열을 만듭니다. parent_SK_to_lamport_PK는 salt = I2OSP(index, 4), IKM = I2OSP(parent_SK, 32)로 두고 IKM과 그 비트를 뒤집은 not_IKM 각각에서 램포트 키 lamport_0, lamport_1을 만든 뒤 510개 조각을 모두 SHA256으로 해시해 이어 붙이고 다시 SHA256으로 눌러 32옥텟 압축 공개키를 얻습니다. HKDF가 입력 길이의 255배까지만 늘릴 수 있어 조각이 255개이며 그 결과 램포트 백업 서명의 보안 강도는 127.5비트입니다.
HKDF_mod_r: BLS 개인키 부분군으로 해싱
HKDF_mod_r은 256비트 이상의 비밀 입력을 BLS12-381 개인키 부분군의 원소(0 <= SK < r)로 바꿉니다. salt는 20옥텟 ASCII 문자열 "BLS-SIG-KEYGEN-SALT-"에서 시작해 결과가 0이면 salt를 다시 해시해 반복하고 출력 길이는 L = ceil((3 * ceil(log2(r))) / 16) = 48입니다. 이 함수는 IETF BLS 서명 표준 초안의 KeyGen과 같아 같은 시드에서 같은 키가 나오고 많은 암호학자의 검토를 거쳤습니다. 모듈로 편향이 있지만 48바이트 출력이 곡선 차수보다 2^128배 이상 커서 무시할 수준으로 봅니다. 표준 초안이 바뀌며 2020년 9월 17일에 이 함수가 갱신되었으므로 구현 시 최신 버전인지 확인해야 합니다.
양자내성 백업의 작동 방식과 대가
램포트 서명은 안전한 해시 함수만 있으면 되는 단순한 양자내성 서명이라 백업 수단으로 채택되었습니다. 어떤 BLS 키의 램포트 공개키를 공개할 때는 그 공개키가 BLS 개인키의 원상(pre-image)임을 보여 검증하는데, 이 과정에서 BLS 개인키가 드러나므로 램포트 서명은 한 번만 쓸 수 있고 그 뒤 해당 BLS 키는 더 이상 신뢰할 수 없습니다. 대신 백업 키를 따로 저장할 필요가 없다는 장점이 있습니다. 새 서명 체계로 한 번 이주하는 용도로만 설계되었기에 램포트 키의 큰 크기도 문제가 되지 않는다고 봅니다.
하드닝 키만 지원, BIP32/44 경로와 비호환
BIP32와 BIP44는 하드닝 키와 비하드닝 키를 모두 두지만 이 표준은 하드닝 키만 제공합니다. 비하드닝 키는 잔액이 여러 계정에 흩어져도 부담이 없는 UTXO 시스템에서 주로 유용하고 그 밖에서는 쓸모가 적으며 비하드닝 파생을 가능하게 하는 군 연산 자체가 양자컴퓨터에 취약하기 때문입니다. 따라서 비하드닝 키를 쓰는 BIP32/BIP44 스타일 경로와는 호환되지 않습니다. secp256k1 키용이 아니므로 그 밖의 하위 호환성 문제는 없습니다.
제안 상태: Review
이 문서의 상태는 Review로, 아직 확정되지 않아 내용이 바뀔 수 있는 제안입니다. 실제로 BLS 서명 표준 초안의 변경에 맞춰 2020년 9월에 키 파생 방법이 한 차례 갱신된 이력이 있습니다.