서명마다 필요하던 비밀 난수를 없애, 난수 결함으로 개인키가 새는 경로를 막습니다.
ECDSA는 서명할 때마다 비밀 난수를 요구합니다. 이 값이 예측되거나 두 번 쓰이면 개인키가 그대로 복구됩니다. Ed25519는 이 값을 무작위로 뽑지 않고 개인키와 메시지로 계산하므로, 난수원이 끼어들 여지가 없습니다. 같은 키와 메시지는 언제나 같은 서명을 내기 때문에 규격에 인쇄된 서명과 바이트 단위로 대조할 수도 있습니다.
서명마다 필요한 값을 난수가 아니라 키와 메시지의 해시로 계산해 재사용 사고를 없앱니다.
공개키가 32바이트, 서명이 64바이트라 배포와 저장이 단순합니다.
새로 만드는 내부 경계에는 Ed25519가 낫지만, WebAuthn·OIDC처럼 외부 시스템과 맞물리는 곳에서는 ES256을 요구합니다.
ECDSA 서명에는 매번 새로운 비밀 난수 k가 필요합니다. k가 예측되면 개인키가 바로 복구되고, 서로 다른 두 메시지에 같은 k를 쓰면 두 서명만으로 개인키가 나옵니다. 2010년 PlayStation 3의 서명 키는 상수 k 때문에 통째로 공개됐고, 초기 안드로이드 비트코인 지갑들은 난수 결함으로 키를 잃었습니다. 알고리즘을 정확히 구현해도 난수원이 나쁘면 무너진다는 점이 이 설계의 약점입니다.
서명을 재현할 수 있으므로 규격에 실린 알려진 답과 직접 비교할 수 있습니다. ECDSA는 서명이 매번 달라서 검증을 통과하는지만 확인할 수 있습니다. 다만 결정론은 부채널 관점에서 장단이 있습니다. 같은 메시지를 반복해서 서명하는 환경이라면 결함 주입 공격을 따로 고려해야 합니다.
아래 증명은 글로 된 설명이 아닙니다. 버튼을 누르면 이 서버가 지금 직접 계산합니다.
Ed25519 서명은 결정론적이라 규격의 알려진 답과 바로 대조할 수 있습니다. ECDSA는 서명할 때마다 값이 달라서 이런 비교가 불가능합니다. 같은 키로 같은 메시지를 몇 번 서명해도 같은 64바이트가 나옵니다.
표준 문서에 실린 테스트 벡터를 그대로 넣어 같은 값이 나오는지 확인합니다.
검증은 공개키·메시지·서명 세 가지가 정확히 맞을 때만 통과합니다. 메시지를 한 바이트 바꾸거나 서명을 한 비트 뒤집으면 바로 거부되고, 다른 키로 만든 서명은 형식이 유효해도 통과하지 못합니다.
막아야 할 입력을 실제로 넣고 거부되는지 확인합니다.
규격 원문을 먼저 실었습니다. 사례는 이 분야에서 실제로 보안이 뚫린 일을 다룬 자료입니다.
Ed25519의 원문입니다. §7.1의 벡터를 증명에서 재현합니다.
ECDSA를 계속 써야 할 때 nonce 위험을 줄이는 방법입니다.
상수 nonce 하나 때문에 서명 개인키가 복구된 실제 사례입니다.
다음 단계
내부 서비스 사이의 신뢰 경계에 적용하고, ES256과 함께 쓰는 기간에는 검증기가 두 알고리즘을 모두 받게 합니다.