Start · Sprachen · PHP · Referenz · sodium_crypto_box_seal_open

sodium_crypto_box_seal_open

Funktion

Entschlüsselt eine anonyme Public-Key-Nachricht (Sealed Box), die mit <code>sodium_crypto_box_seal()</code> verschlüsselt wurde.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_box_seal_open(string $ciphertext, string $key_pair): string|false

Beschreibung

sodium_crypto_box_seal_open() entschlüsselt eine sogenannte Sealed Box – eine anonyme, asymmetrisch verschlüsselte Nachricht. Der Absender verwendet dabei ausschließlich den öffentlichen Schlüssel des Empfängers, ohne seine eigene Identität preiszugeben. Die Funktion ist die Gegenstelle zu sodium_crypto_box_seal().

Zum Entschlüsseln wird das vollständige Schlüsselpaar des Empfängers benötigt (bestehend aus öffentlichem und privatem Schlüssel), das typischerweise mit sodium_crypto_box_keypair() oder sodium_crypto_box_keypair_from_secretkey_and_publickey() erzeugt wird. Intern leitet libsodium aus dem ephemeren öffentlichen Schlüssel des Senders (der im Ciphertext eingebettet ist) und dem privaten Schlüssel des Empfängers einen gemeinsamen Sitzungsschlüssel ab.

Sealed Boxes eignen sich besonders für Szenarien, in denen der Absender anonym bleiben soll oder gar nicht bekannt ist – z. B. bei verschlüsselten Kontaktformularen, anonymen Bug-Reports oder der sicheren Übertragung von Secrets an einen Server.

Die Funktion liefert false zurück, wenn die Authentifizierungsprüfung fehlschlägt (d. h. der Ciphertext manipuliert wurde oder der falsche Schlüssel verwendet wird). Der Rückgabewert sollte daher immer explizit mit === false geprüft werden.

Parameter

Name Typ Default Beschreibung
$ciphertext Pflicht string Der verschlüsselte Ciphertext, der zuvor mit sodium_crypto_box_seal() erzeugt wurde. Enthält neben den verschlüsselten Daten auch den ephemeren öffentlichen Schlüssel des Senders und einen MAC.
$key_pair Pflicht string Das vollständige Schlüsselpaar des Empfängers als binärer String (öffentlicher + privater Schlüssel). Erzeugt z. B. mit sodium_crypto_box_keypair() oder geladen mit sodium_crypto_box_keypair_from_secretkey_and_publickey().

Rückgabewert

Typ
string|false
Beschreibung
Gibt den entschlüsselten Klartext als Binär-String zurück, oder false wenn die Authentifizierung fehlschlägt (falscher Schlüssel, manipulierter Ciphertext oder ungültige Eingabe).

Beispiele

Grundlegendes Ver- und Entschlüsseln einer Sealed Box

<?php
// Schlüsselpaar des Empfängers erzeugen
$recipientKeypair = sodium_crypto_box_keypair();
$recipientPublicKey = sodium_crypto_box_publickey($recipientKeypair);

// Absender verschlüsselt anonym mit dem öffentlichen Schlüssel des Empfängers
$plaintext = 'Geheime Nachricht vom anonymen Absender';
$ciphertext = sodium_crypto_box_seal($plaintext, $recipientPublicKey);

// Empfänger entschlüsselt mit seinem vollständigen Schlüsselpaar
$decrypted = sodium_crypto_box_seal_open($ciphertext, $recipientKeypair);

if ($decrypted === false) {
    echo 'Entschlüsselung fehlgeschlagen!';
} else {
    echo $decrypted;
}
Geheime Nachricht vom anonymen Absender

Schlüsselpaar aus gespeichertem privatem Schlüssel laden und entschlüsseln

<?php
// Gespeicherten privaten Schlüssel laden (z. B. aus Datei oder Umgebungsvariable)
$storedSecretKeyHex = getenv('RECIPIENT_SECRET_KEY_HEX');
$secretKey = sodium_hex2bin($storedSecretKeyHex);

// Öffentlichen Schlüssel aus dem privaten Schlüssel ableiten
$publicKey = sodium_crypto_box_publickey_from_secretkey($secretKey);

// Schlüsselpaar zusammensetzen
$keypair = sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey);

// Ciphertext kommt z. B. aus einer POST-Anfrage
$ciphertext = base64_decode($_POST['encrypted_data'] ?? '');

$decrypted = sodium_crypto_box_seal_open($ciphertext, $keypair);

if ($decrypted === false) {
    http_response_code(400);
    echo json_encode(['error' => 'Ungültige oder manipulierte Nachricht']);
} else {
    // Klartext verarbeiten
    $data = json_decode($decrypted, true);
    echo 'Empfangene Daten: ' . htmlspecialchars($data['message'] ?? '');
}

// Sicherheitshalber Schlüssel aus dem Speicher löschen
sodium_memzero($secretKey);

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Den privaten Schlüssel niemals im Klartext in der Versionskontrolle, in Logs oder in HTTP-Antworten speichern. Umgebungsvariablen oder dedizierte Secret-Manager verwenden.
  • Nach Verwendung des privaten Schlüssels diesen mit sodium_memzero() aus dem Arbeitsspeicher löschen.
  • Die Rückgabe von false niemals ignorieren – sie zeigt eine fehlgeschlagene Integritätsprüfung an. Solche Fehler sollten geloggt, aber dem Client gegenüber nicht zu detailliert kommuniziert werden (Timing- und Informationsleck-Angriffe).
  • Der Ciphertext ist um SODIUM_CRYPTO_BOX_SEALBYTES (48 Bytes) länger als der Klartext (32 Bytes für den ephemeren öffentlichen Schlüssel + 16 Bytes MAC).
  • Sealed Boxes bieten keine Authentizität des Absenders – wenn die Herkunft der Nachricht überprüft werden muss, sollte stattdessen sodium_crypto_box() verwendet werden.