Ed25519 Sign
Sign a message with an Ed25519 private key.
Sign a message with an Ed25519 private key (RFC 8032). Free, offline, runs in your browser. Read more Show less
What is Ed25519 Sign?
This tool signs a message with an Ed25519 private key, producing a 64-byte signature. The signature proves that the holder of the private key approved the message, and can be verified by anyone with the corresponding public key.
Ed25519 is deterministic: signing the same message with the same private key always produces the same signature. This differs from ECDSA, which uses a random nonce - and whose security collapses if the nonce is ever reused. Determinism removes that entire class of bug.
How to sign
Enter the message, enter your 32-byte private key (hex or Base64), press Sign. The signature is 64 bytes, shown as hex (128 characters) or Base64.
To verify, use Ed25519 Verify with the same message, the signature, and the public key.
What actually gets signed
The bytes of your message, exactly as encoded. If you are signing text, the tool encodes it as UTF-8 by default. Change the encoding if your protocol specifies something else. Whitespace and line endings matter - a trailing newline changes the signature.
FAQ
Can I recover the public key from the signature?
No. Ed25519 signatures do not embed the public key. You must distribute it separately or include it in your protocol.
Is the signature secret?
No. Signatures are public. Anyone can verify them with the public key. Only the private key must be kept secret.
What message format should I use?
Whatever your protocol specifies. Common conventions: raw UTF-8 bytes, hex-decoded bytes, or a domain-separated prefix such as myapp-v1: before the message. Domain separation prevents cross-protocol attacks.
Ed25519 vs RSA signatures
Ed25519 signatures are 64 bytes and verify in microseconds. RSA-2048 signatures are 256 bytes and verify much more slowly. For new systems, Ed25519 is the better choice.
Command line equivalent
# OpenSSL 3.x
echo -n "hello" | openssl pkeyutl -sign -inkey private.pem -rawin -out sig.bin
xxd sig.bin | head
# Node with @noble/ed25519
node --input-type=module -e '
import * as ed from "@noble/ed25519";
const priv = Buffer.from("...hex private key...", "hex");
const msg = new TextEncoder().encode("hello");
const sig = await ed.signAsync(msg, priv);
console.log(Buffer.from(sig).toString("hex"));
'