Signatur
Beschreibung
Diese Funktion konvertiert einen öffentlichen Schlüssel aus dem Ed25519-Signaturschema in das Curve25519-Format (auch X25519 genannt), das für den Diffie-Hellman-Schlüsselaustausch (sodium_crypto_box) verwendet wird. Damit ist es möglich, ein einziges Schlüsselpaar für beide Zwecke – digitale Signaturen und verschlüsselte Kommunikation – zu nutzen.
Ein typischer Anwendungsfall ist das sogenannte Hybrid Key Management: Nutzer tauschen öffentlich ihre Ed25519-Schlüssel für Identitäts- und Signaturzwecke aus. Wenn zwei Parteien zusätzlich eine verschlüsselte Nachricht senden möchten, können sie die Ed25519-Schlüssel in Curve25519-Schlüssel umrechnen, ohne ein separates Schlüsselpaar verwalten zu müssen.
Die Konvertierung ist mathematisch definiert und verlustfrei: Aus demselben Ed25519-Schlüsselpaar lässt sich jederzeit dasselbe Curve25519-Paar ableiten. Der umgekehrte Weg (Curve25519 → Ed25519) ist jedoch nicht möglich. Für den privaten Schlüssel steht die Schwester-Funktion sodium_crypto_sign_ed25519_sk_to_curve25519 zur Verfügung.
Die Funktion wirft eine SodiumException, wenn der übergebene Schlüssel die falsche Länge hat (SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES = 32 Byte).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | string | Ein gültiger öffentlicher Ed25519-Schlüssel als rohe Byte-Zeichenkette (genau SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES = 32 Byte). Typischerweise das Ergebnis von sodium_crypto_sign_keypair() in Kombination mit sodium_crypto_sign_publickey(). |
Rückgabewert
SODIUM_CRYPTO_BOX_PUBLICKEYBYTES = 32 Byte). Bei ungültigem Eingabe-Schlüssel wird eine SodiumException geworfen.Beispiele
Schlüsselkonvertierung und verschlüsselte Nachricht mit Ed25519-Schlüsseln
<?php
// Ed25519-Schlüsselpaare für Sender und Empfänger erzeugen
$senderKeypair = sodium_crypto_sign_keypair();
$receiverKeypair = sodium_crypto_sign_keypair();
$senderSignPk = sodium_crypto_sign_publickey($senderKeypair);
$senderSignSk = sodium_crypto_sign_secretkey($senderKeypair);
$receiverSignPk = sodium_crypto_sign_publickey($receiverKeypair);
$receiverSignSk = sodium_crypto_sign_secretkey($receiverKeypair);
// Konvertierung in Curve25519-Schlüssel für Verschlüsselung
$senderBoxSk = sodium_crypto_sign_ed25519_sk_to_curve25519($senderSignSk);
$senderBoxPk = sodium_crypto_sign_ed25519_pk_to_curve25519($senderSignPk);
$receiverBoxPk = sodium_crypto_sign_ed25519_pk_to_curve25519($receiverSignPk);
$receiverBoxSk = sodium_crypto_sign_ed25519_sk_to_curve25519($receiverSignSk);
// Nonce erzeugen
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
// Nachricht verschlüsseln (Sender → Empfänger)
$senderKeypairForBox = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$senderBoxSk,
$receiverBoxPk
);
$ciphertext = sodium_crypto_box('Geheime Nachricht', $nonce, $senderKeypairForBox);
// Nachricht entschlüsseln (Empfänger-Seite)
$receiverKeypairForBox = sodium_crypto_box_keypair_from_secretkey_and_publickey(
$receiverBoxSk,
$senderBoxPk
);
$plaintext = sodium_crypto_box_open($ciphertext, $nonce, $receiverKeypairForBox);
echo $plaintext;
Fehlerbehandlung bei ungültigem Schlüssel
<?php
try {
// Absichtlich ungültiger Schlüssel (zu kurz)
$invalidKey = 'zu-kurz';
$curve25519Pk = sodium_crypto_sign_ed25519_pk_to_curve25519($invalidKey);
} catch (SodiumException $e) {
echo 'Fehler: ' . $e->getMessage();
}
// Wichtig · Fallstricke
Sicherheitshinweis: Auch wenn die Konvertierung mathematisch korrekt und in libsodium offiziell unterstützt wird, empfehlen einige Kryptographen aus konzeptionellen Gründen, für Signatur und Verschlüsselung separate Schlüsselpaare zu führen. Die gemeinsame Nutzung eines Schlüsselpaares ist nur dann unproblematisch, wenn man sich der Implikationen bewusst ist.
Die Funktion verarbeitet ausschließlich rohe Bytes. Schlüssel, die z. B. als Hex-String oder Base64 vorliegen, müssen zuerst dekodiert werden (sodium_hex2bin() bzw. base64_decode()).
Ab PHP 8.0 und neueren libsodium-Versionen werden Typfehler als TypeError und ungültige Schlüssellängen als SodiumException geworfen.