Signatur
Beschreibung
sodium_crypto_sign_ed25519_sk_to_curve25519() konvertiert einen geheimen Schlüssel des Ed25519-Signaturschemas in den entsprechenden geheimen Schlüssel für das Curve25519-Elliptic-Curve-Diffie-Hellman-Protokoll (X25519). Dies ermöglicht es, ein einziges Schlüsselpaar sowohl für digitale Signaturen als auch für verschlüsselte Kommunikation zu verwenden.
Typischerweise werden für Signaturen und für Schlüsselaustausch getrennte Schlüsselpaare verwendet. Diese Funktion — zusammen mit sodium_crypto_sign_ed25519_pk_to_curve25519() — erlaubt jedoch die Wiederverwendung eines Ed25519-Schlüsselpaares in beiden Kontexten, was die Schlüsselverwaltung vereinfacht.
Einsatzgebiet ist zum Beispiel ein System, das zunächst nur Signaturen verwendet und später auch verschlüsselte Kommunikation benötigt, ohne neue Schlüsselpaare generieren und verteilen zu müssen. Der so gewonnene Curve25519-Schlüssel kann direkt mit Funktionen wie sodium_crypto_box() oder sodium_crypto_kx() genutzt werden.
Wichtiger Hinweis: Obwohl die mathematische Konvertierung sicher ist, ist es aus kryptografischer Sicht generell ratsam, für unterschiedliche Zwecke getrennte Schlüsselpaare zu verwenden. Die gemeinsame Nutzung desselben Schlüsselmaterials für Signatur und Verschlüsselung sollte nur nach sorgfältiger Abwägung erfolgen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | string | Der geheime Ed25519-Schlüssel (64 Bytes), wie er z. B. von sodium_crypto_sign_keypair() oder sodium_crypto_sign_secretkey() erzeugt wird. Dieser Schlüssel enthält sowohl den eigentlichen Geheimschlüssel als auch den öffentlichen Schlüssel. |
Rückgabewert
sodium_crypto_box_keypair_from_secretkey_and_publickey() oder sodium_crypto_kx_keypair() eingesetzt werden. Bei einem ungültigen Schlüssel wird eine SodiumException ausgelöst.Beispiele
Ed25519-Schlüsselpaar in Curve25519-Schlüsselpaar umwandeln
<?php
// Ed25519-Schlüsselpaar für Signaturen erzeugen
$signKeypair = sodium_crypto_sign_keypair();
$signSecretKey = sodium_crypto_sign_secretkey($signKeypair);
$signPublicKey = sodium_crypto_sign_publickey($signKeypair);
// Geheimen und öffentlichen Schlüssel in Curve25519-Format konvertieren
$curve25519SecretKey = sodium_crypto_sign_ed25519_sk_to_curve25519($signSecretKey);
$curve25519PublicKey = sodium_crypto_sign_ed25519_pk_to_curve25519($signPublicKey);
echo 'Curve25519 Secret Key (hex): ' . sodium_bin2hex($curve25519SecretKey) . PHP_EOL;
echo 'Curve25519 Public Key (hex): ' . sodium_bin2hex($curve25519PublicKey) . PHP_EOL;
echo 'Schlüssellänge (Secret): ' . strlen($curve25519SecretKey) . ' Bytes' . PHP_EOL;
echo 'Schlüssellänge (Public): ' . strlen($curve25519PublicKey) . ' Bytes' . PHP_EOL;
Signatur und verschlüsselte Kommunikation mit einem Schlüsselpaar
<?php
// Ein einziges Ed25519-Schlüsselpaar für beide Zwecke nutzen
$aliceSignKP = sodium_crypto_sign_keypair();
$aliceSignSK = sodium_crypto_sign_secretkey($aliceSignKP);
$aliceSignPK = sodium_crypto_sign_publickey($aliceSignKP);
$bobSignKP = sodium_crypto_sign_keypair();
$bobSignSK = sodium_crypto_sign_secretkey($bobSignKP);
$bobSignPK = sodium_crypto_sign_publickey($bobSignKP);
// Konvertierung in Curve25519-Schlüssel
$aliceBoxSK = sodium_crypto_sign_ed25519_sk_to_curve25519($aliceSignSK);
$aliceBoxPK = sodium_crypto_sign_ed25519_pk_to_curve25519($aliceSignPK);
$bobBoxPK = sodium_crypto_sign_ed25519_pk_to_curve25519($bobSignPK);
// Nachricht mit sodium_crypto_box verschlüsseln
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$keypairForEncryption = sodium_crypto_box_keypair_from_secretkey_and_publickey($aliceBoxSK, $bobBoxPK);
$message = 'Geheime Nachricht an Bob';
$encrypted = sodium_crypto_box($message, $nonce, $keypairForEncryption);
echo 'Verschlüsselt (hex): ' . sodium_bin2hex($encrypted) . PHP_EOL;
// Bob entschlüsselt
$bobBoxSK = sodium_crypto_sign_ed25519_sk_to_curve25519($bobSignSK);
$bobKeypair = sodium_crypto_box_keypair_from_secretkey_and_publickey($bobBoxSK, $aliceBoxPK);
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $bobKeypair);
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweis: Die Verwendung desselben Schlüsselmaterials für Signaturen (Ed25519) und Verschlüsselung (Curve25519) ist zwar mathematisch korrekt implementiert, wird von einigen Kryptografie-Experten dennoch als nicht ideale Praxis angesehen. In sicherheitskritischen Anwendungen empfiehlt es sich, für jeden Zweck separate Schlüsselpaare zu erzeugen.
Der übergebene $key-Parameter muss exakt SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (64 Bytes) lang sein. Ein zu kurzer oder beschädigter Schlüssel führt zu einer SodiumException. Schlüsselmaterial sollte niemals im Klartext gespeichert oder übertragen werden — stattdessen sodium_memzero() verwenden, um Schlüssel nach Gebrauch sicher aus dem Speicher zu löschen.