수십 년 동안 풀리지 않던 NIST 타원곡선 매개변수의 출처를 Anthropic이 추적했다. 분석 결과, 여러 곡선의 시드는 암호학적 해시가 아니라 1990년대 C 라이브러리에 있던 난수 생성기와 유닉스 타임스탬프로 만들어졌다. 이 발견은 ECDSA의 취약점이나 새로운 공격을 뜻하지 않는다. 오히려 곡선이 의도적으로 약화됐다는 우려를 줄이는 단서지만, 일부 시드와 기준점의 생성 방식은 여전히 설명되지 않았다.

오랫동안 의문으로 남은 시드

ECDSA는 널리 쓰이는 타원곡선 암호 표준이다. NIST는 2000년 디지털 서명 표준 FIPS 186-2의 일부로 여러 크기와 보안 수준의 표준 곡선을 채택했다. 소수체와 이진체 위의 곡선 명세에는 계수 b를 정하는 데 쓰이는 ‘시드’가 실렸지만, 시드를 어떻게 만들었는지는 설명되지 않았다. 예를 들어 NIST P-256의 시드는 C49D3608 86E70493 6A6678E1 139D26B7 819F7E90이며, NSA가 출처 설명 없이 제공해 의문이 이어졌다.

과거에는 NSA에서 오래 일한 Jerry Solinas가 재치 있는 문구를 해시해 시드를 만들었다는 추측도 있었다. 그러나 그 가설을 바탕으로 한 탐색은 성과가 없었고, Solinas가 2023년 사망한 뒤에도 당시 동료들에게서 답을 얻지 못해 궁금증은 남았다. Anthropic은 이 질문을 다시 살펴보기로 했다.

시드는 타임스탬프 기반 난수 출력이었다

2026년 10월, Anthropic의 한 직원이 단서를 주지 않은 채 내부 연구 모델에 시드 생성 방식을 찾아보도록 했다. Claude는 30분도 안 되어 NIST의 P-192, P-224, P-256, P-384, P-521 시드의 기원을 찾아냈다. 다섯 시드는 해시 알고리즘의 결과가 아니라, 유닉스 타임스탬프로 초기화한 C 라이브러리의 lrand48 난수 생성기 출력이었다.

이 방식은 타임스탬프 t로 난수 생성기를 초기화하고, 반복할 때마다 20바이트 후보 시드를 뽑는다. 후보가 차례로 이어지는 구조라 P-256에서는 표준 시드가 나올 때까지 1,842번 반복했다. 누구나 재현할 수 있는 단순한 생성 절차라는 점에서, 시드가 어떻게 만들어졌는지 알 수 없다는 불확실성이 줄었다.

오래된 생성기의 흔적을 찾아내다

문구를 해시했다는 소문을 더 찾는 대신 Claude는 당시 곡선을 만든 프로그램이 어떤 소프트웨어를 썼을지 추론했다. 1990년대 C 라이브러리의 의사난수 생성기는 출력에 알아볼 수 있는 규칙이 남을 만큼 약했다. Claude는 공개된 시드를 한 비트씩 훑으며, 인접한 조각들이 당시 생성기의 연속 출력과 일치하는지 34가지 생성기와 출력 조각 조합으로 검사했다.

일부 시드에서 32비트 단어의 최상위 비트가 계속 0인 패턴이 드러났다. 열 개의 시드 중 네 개는 20개 단어 모두에서 이 패턴을 보였는데, 우연히 나타날 확률은 1/5810이었다. lrand48이 48비트 상태의 최상위 31비트만 반환한다는 특징과 맞아떨어졌다. 첫 단어에서 숨겨진 17비트 값 2¹⁷가지를 시도하고 뒤따르는 네 단어를 확인하자, 네 시드 모두에서 상태를 복구할 수 있었다.

시드가 가리킨 날짜와 남은 설명

소수곡선 시드도 같은 생성기에서 나왔지만 출력의 일부 비트만 포함했다. Claude는 격자 문제를 푸는 Lenstra–Lenstra–Lovász(LLL) 기저 축약 알고리즘을 사용해 잘린 출력에서 생성기 상태를 복구했다. 그 결과 NIST 소수곡선 시드 다섯 개와 ANSI X9.62 표준 예시의 시드 다섯 개가 모두 lrand48() >> 23 패턴으로 설명됐다. 복구한 48비트 상태는 각 시드의 160비트를 재생성했다.

상태를 거슬러 올라가 srand48 초기화 형태를 찾자, 소수곡선 열 개의 초기값은 1997년 5월부터 1998년 4월 사이의 유닉스 타임스탬프였다. 네 이진곡선의 초기화 값은 1984년 2월로 읽혔다. 타임스탬프를 두 배로 하면 P-224 생성 약 2주 뒤인 1998년 4월 17일과 맞는다. 프로그램이 시계 값을 절반으로 사용했을 가능성이 있지만, 확정된 설명은 아니다. 다섯 번째 이진 시드 B-163은 시도한 방법으로 복구되지 않았다.

일부 기준점의 생성법도 밝혀졌다

각 곡선에는 공개키 계산의 기준이 되는 고정점 G도 있다. 시드를 알아냈다고 G의 생성법까지 자동으로 밝혀지는 것은 아니지만, Claude는 1997년 5월에 만들어진 여섯 곡선의 기준점에서 공통 절차를 찾았다. 대상은 P-192와 ANSI X9.62의 prime192v2, prime192v3, prime239v1, prime239v2, prime239v3이다.

기준점은 FreeLIP의 난수 생성기를 작은 정수로 초기화하고, 출력 일곱 개를 버린 뒤, 26비트 출력으로 소수 p에 대한 x좌표 후보를 만들어 곡선 위에 놓일 때까지 반복하는 방식으로 생성됐다. P-192에 쓰인 초기값은 20000이었다. 나머지 초기값은 prime239v1~v3에 각각 20420, 20507, 20509였고 prime192v2와 v3에는 20512와 20517이었다. 반면 P-224, P-256, P-384, P-521의 기준점과 NIST 이진곡선의 기준점은 설명되지 않았다.

정리

이번 분석은 ECDSA 곡선의 암호를 깨거나 취약점을 발견한 것이 아니다. Anthropic은 오히려 단순하고 재현 가능한 시드 생성 과정이 의도적 백도어 의혹을 덜 그럴듯하게 만든다고 설명한다. 다만 일부 후보 곡선이 선택 과정에서 건너뛰어진 이유, B-163 시드의 출처, 여러 기준점의 생성 방식은 여전히 미해결이다. 시드 발견에 걸린 포상금 36,864달러는 Internet Security Research Group에 기부될 예정이다.

출처 바로가기