Ed25519 서명·검증 (RFC 8032)
브라우저에서 Ed25519 키로 메시지에 서명하거나 서명을 검증하고, 시드에서 나온 공개 키와 R·S 값을 함께 봅니다.
사용법
- RFC 8032 벡터를 불러와 공개된 값과 같은 서명을 확인하고, 메시지에서 한 바이트만 바꿔 검증이 깨지는 것을 보세요.
- 직접 서명할 때는 시드나 PEM 키, 확장 키를 붙여넣거나 무작위 시드를 누른 뒤 메시지를 넣고 서명합니다.
- 메시지가 이진 데이터면 16진수를 체크하고, 입력한 글자의 UTF-8 바이트에 서명하려면 체크를 비워 둡니다.
- 남의 서명을 확인할 때는 검증으로 바꾼 뒤 공개 키, 메시지, 64바이트 서명을 붙여넣습니다.
- 직접 구현을 맞춰 볼 때는 R과 S, 정규 형식 안내를 읽어 보세요. 손으로 만든 구현이 갈라지는 지점입니다.
자세한 설명
펼치기접기
Ed25519 키로 메시지에 서명하거나, 공개 키로 서명을 검증합니다. 모든 계산은 이 탭 안에서 끝나고 바이트는 어디로도 나가지 않습니다. 비공개 키 입력란은 실제로 마주치는 세 가지 형태를 모두 받습니다. 테스트 벡터가 공개하는 32바이트 시드, openssl genpkey가 만드는 PKCS#8 키, 그리고 libsodium과 OpenSSH가 내놓는 64바이트 확장 키(시드 뒤에 공개 키가 붙은 형태)입니다. WebCrypto는 PKCS#8만 가져올 수 있어서, 시드는 앞에 붙는 고정된 16바이트 DER로 감싼 뒤 가져옵니다. 공개 키는 JWK로 내보내 얻습니다. 비공개 키에서 공개 키를 바로 구하는 호출이 없기 때문입니다. 64바이트 키의 뒤쪽이 시드에서 나오는 공개 키와 다르면 그 사실을 알려 줍니다. 그런 조합은 서명은 잘 되지만 어디서도 검증되지 않습니다. 검증은 예·아니오만 말하지 않습니다. 64바이트를 압축된 점 R과 리틀엔디언 스칼라 S로 나누고, S를 군의 위수와 비교합니다. S가 위수 이상인 서명은 검증식을 만족해도 RFC 8032에서는 무효입니다. S에 위수를 더해 하나의 서명을 둘로 만드는 오래된 가변성 기법이 여기서 통하지 않는 이유입니다. 서명은 결정적이므로 키와 메시지 하나에 서명은 하나뿐이고, 다시 서명하는 것은 비교일 뿐입니다. 공개 키는 점으로서 유효한지 검사하지 않습니다. 0이 32개인 값도 문제없이 들어오고 아무것도 검증하지 못하므로, 무효라는 결과는 키 자체가 키가 아니라는 뜻일 수도 있습니다.
자주 묻는 질문
어떤 키 형식을 붙여넣을 수 있나요?
32바이트 시드, PKCS#8 비공개 키, 그리고 시드 뒤에 공개 키가 붙은 64바이트 확장 키입니다. 각각 16진수, base64, base64url, PEM으로 넣을 수 있고 공백과 PEM 헤더 줄은 무시합니다. 16진수를 먼저 시도하므로 둘 다로 읽히는 문자열은 16진수로 봅니다. OpenSSH 비공개 키 파일은 다른 컨테이너여서 받지 않습니다. ssh-keygen으로 PKCS#8로 내보낸 뒤 넣으세요.
비공개 키만 넣었는데 왜 공개 키가 보이나요?
공개 키는 시드에서 결정되기 때문에, 붙여넣은 키가 의도한 키인지 가장 빠르게 확인하는 방법이 공개 키를 보는 것입니다. WebCrypto에는 공개 키를 유도하는 호출이 없어서, 가져온 비공개 키를 JWK로 내보내고 그 x 값을 공개 키로 표시합니다. 서명과 공개 키가 같은 구현에서 나온다는 뜻입니다.
S 검사는 무엇을 위한 것인가요?
RFC 8032은 S가 기준점의 위수보다 작아야 한다고 요구합니다. S에 위수를 더해도 검증식은 그대로 성립하므로, 범위 검사를 빠뜨린 구현은 그렇게 바꾼 쌍을 같은 메시지에 대한 두 번째 유효 서명으로 받아들입니다. 서명을 식별자로 쓰는 시스템이 여기서 깨집니다. 브라우저는 이 검사를 하므로 그런 서명은 여기서 무효로 나오고, 안내문이 어느 이유인지 알려 줍니다.
해시에 서명하는 것과 메시지에 서명하는 것이 같은가요?
다르고, 두 시스템이 어긋나는 흔한 원인입니다. Ed25519는 내부에서 SHA-512로 메시지를 해시하며 메시지 전체가 필요합니다. 직접 계산한 다이제스트에 서명하면 그 32~64바이트에 대한 유효한 서명이 나오지만 파일에 대한 서명은 아닙니다. 프로토콜이 미리 해시한다면 그 사실을 명시해야 하고 검증 측도 똑같이 해야 합니다. 그런 용도의 표준 변형이 Ed25519ph이고, 평범한 Ed25519와 같은 알고리즘이 아닙니다.
실제 서명 키에 써도 되나요?
브라우저 탭에서 돌아가고 입력값을 로컬 스토리지에 남기므로, 여기 붙여넣은 키는 그 컴퓨터의 디스크에 남은 키입니다. 형식을 이해하거나 벡터를 재현하거나 받은 서명을 확인하는 데는 괜찮습니다. 릴리스에 서명하거나 호스트를 인증하는 키라면 비공개 쪽은 하드웨어 토큰이나 검증된 도구에 두고, 여기에는 공개 키만 붙여넣으세요.
관련 도구
키쌍 생성기 (RSA·EC·Ed25519)
브라우저에서 RSA·ECDSA·ECDH·Ed25519·X25519 키쌍을 생성하고 PKCS#8/SPKI PEM 또는 JWK로 내보냅니다.
개발
scrypt 키 유도 (RFC 7914)
브라우저에서 scrypt로 비밀번호로부터 키를 유도하고, 메모리 비용과 PBKDF2·ROMix 중간 단계를 함께 보여 줍니다.
개발
JWK ↔ PEM 변환기
JWK이나 JWKS 전체를 PEM 공개키로, 또는 그 반대로 변환하고 각 키의 RFC 7638 thumbprint까지 브라우저에서 계산합니다.
개발
SSH 공개키 검사기
SSH 공개키와 authorized_keys, known_hosts 줄을 해석합니다. 알고리즘, 키 길이, SHA256·MD5 지문, 주석과 옵션을 보여 줍니다.
개발
PDF 서명하기
서명을 그리거나 입력하거나 이미지로 올려 PDF의 원하는 페이지에 넣고, 서명된 파일을 내려받습니다. 브라우저 안에서만 처리되어 업로드되지 않습니다.
파일
PGP 공개키 검사기
ASCII 아머 형식 OpenPGP 공개키를 해석합니다. 전체 지문, 키 ID, 알고리즘, 길이, 생성·만료일, 사용자 ID와 서브키를 보여 줍니다.
개발