Start · Sprachen · PHP · Referenz · sodium_crypto_box_seal

sodium_crypto_box_seal

Funktion

Verschlüsselt eine Nachricht anonym für einen Empfänger anhand dessen öffentlichen Schlüssels (Sealed Box / anonyme Public-Key-Verschlüsselung).

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_box_seal(string $message, string $recipient_public_key): string

Beschreibung

sodium_crypto_box_seal implementiert das Konzept der Sealed Box aus der libsodium-Bibliothek. Eine Nachricht wird mit dem öffentlichen Schlüssel des Empfängers verschlüsselt, ohne dass der Absender dabei eine Identität oder einen eigenen Schlüssel preisgibt. Das Ergebnis ist eine anonyme, verschlüsselte Nachricht, die nur der Empfänger mit seinem privaten Schlüssel entschlüsseln kann.

Intern erzeugt die Funktion ein ephemeres (einmaliges) Schlüsselpaar. Der öffentliche Teil dieses Paares wird zusammen mit dem Chiffretext übermittelt, damit der Empfänger den gemeinsamen Schlüssel (ECDH) rekonstruieren kann. Der private Teil des ephemeren Schlüsselpaars wird nach der Verschlüsselung sicher vernichtet, sodass der Absender nachträglich nicht mehr in der Lage ist, die eigene Nachricht zu entschlüsseln – echte Forward Anonymity des Senders.

Die Funktion eignet sich besonders für Szenarien, in denen ein Absender anonym bleiben soll, beispielsweise bei Formularen, Feedback-Systemen oder Whistleblower-Plattformen. Für bidirektionale, authentifizierte Kommunikation empfiehlt sich stattdessen sodium_crypto_box, das die Identität beider Seiten einbezieht.

Der erzeugte Chiffretext enthält einen Overhead von 48 Bytes (32 Bytes ephemeraler öffentlicher Schlüssel + 16 Bytes MAC-Tag) gegenüber der Klartextlänge.

Parameter

Name Typ Default Beschreibung
$message Pflicht string Die zu verschlüsselnde Klartextnachricht als Byte-String beliebiger Länge.
$recipient_public_key Pflicht string Der öffentliche Schlüssel des Empfängers als Byte-String der Länge SODIUM_CRYPTO_BOX_PUBLICKEYBYTES (32 Bytes). Kann mit sodium_crypto_box_keypair oder sodium_crypto_box_publickey erzeugt werden.

Rückgabewert

Typ
string
Beschreibung
Gibt den verschlüsselten Chiffretext als Byte-String zurück. Die Länge beträgt strlen($message) + SODIUM_CRYPTO_BOX_SEALBYTES (48 Bytes Overhead). Bei einem Fehler wird eine SodiumException geworfen.

Beispiele

Grundlegende anonyme Verschlüsselung und Entschlüsselung

<?php
// Schlüsselpaar des Empfängers erzeugen
$keypair = sodium_crypto_box_keypair();
$publicKey  = sodium_crypto_box_publickey($keypair);
$privateKey = sodium_crypto_box_secretkey($keypair);

// Absender verschlüsselt anonym
$message    = 'Geheime Nachricht vom anonymen Absender';
$ciphertext = sodium_crypto_box_seal($message, $publicKey);

echo 'Verschlüsselt (' . strlen($ciphertext) . ' Bytes): ' . base64_encode($ciphertext) . PHP_EOL;

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

if ($decrypted === false) {
    echo 'Entschlüsselung fehlgeschlagen!' . PHP_EOL;
} else {
    echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
}

// Schlüsselmaterial sicher löschen
sodium_memzero($privateKey);
sodium_memzero($keypair);
Verschlüsselt (87 Bytes): <base64-codierter Chiffretext> Entschlüsselt: Geheime Nachricht vom anonymen Absender

Anonymes Kontaktformular – öffentlichen Schlüssel aus Datei laden

<?php
// Empfänger-Schlüssel aus Konfiguration/Datei laden (nur public key wird verteilt)
$publicKeyBase64 = file_get_contents('/etc/myapp/recipient_public.key');
$publicKey = sodium_base642bin(trim($publicKeyBase64), SODIUM_BASE64_VARIANT_ORIGINAL);

// Benutzernachricht aus Formular
$userMessage = $_POST['message'] ?? '';

if ($userMessage === '') {
    exit('Keine Nachricht übermittelt.');
}

// Anonyme Verschlüsselung – kein Absender-Schlüssel nötig
$encrypted = sodium_crypto_box_seal($userMessage, $publicKey);

// Verschlüsselte Nachricht in Datenbank oder Datei speichern
$storable = sodium_bin2base64($encrypted, SODIUM_BASE64_VARIANT_ORIGINAL);
file_put_contents('/var/myapp/messages/' . uniqid('msg_', true) . '.enc', $storable);

echo 'Ihre Nachricht wurde sicher übermittelt.';

// Öffentlichen Schlüssel aus dem Speicher löschen (Best Practice)
sodium_memzero($publicKey);
Ihre Nachricht wurde sicher übermittelt.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Der private Schlüssel des Empfängers muss zu keinem Zeitpunkt dem Absender bekannt sein oder übertragen werden – nur der öffentliche Schlüssel wird benötigt.
  • Verwende stets sodium_memzero, um private Schlüssel nach Verwendung sicher aus dem Speicher zu entfernen.
  • Der Chiffretext authentifiziert den Empfänger, aber nicht den Absender. Ist eine Absenderauthentifizierung erforderlich, nutze sodium_crypto_box mit einem Schlüsselpaar des Absenders.
  • Die Funktion ist nicht für die Verschlüsselung sehr großer Datenmengen (z. B. Dateien mehrerer Megabytes) ausgelegt; für solche Fälle empfiehlt sich eine hybride Verschlüsselung (z. B. symmetrischer Schlüssel mit sodium_crypto_secretstream verschlüsseln, diesen Schlüssel dann mit sodium_crypto_box_seal versiegeln).
  • Seit PHP 7.2 ist die Sodium-Erweiterung im Core enthalten und muss nicht mehr separat installiert werden.