Signatur
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
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;
}
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
falseniemals 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.