Start · Sprachen · PHP · Referenz · sodium_crypto_sign_ed25519_pk_to_curve25519

sodium_crypto_sign_ed25519_pk_to_curve25519

Funktion

Wandelt einen öffentlichen Ed25519-Schlüssel in einen kompatiblen öffentlichen Curve25519-Schlüssel (X25519) um.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_ed25519_pk_to_curve25519(string $key): string

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

Typ
string
Beschreibung
Gibt den korrespondierenden öffentlichen Curve25519-Schlüssel als rohe Byte-Zeichenkette zurück (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;
Geheime Nachricht

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();
}
Fehler: sodium_crypto_sign_ed25519_pk_to_curve25519(): Argument #1 ($key) must be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes long

// 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.