Signatur
Beschreibung
sodium_pad ergänzt eine beliebige Zeichenkette mit Padding-Bytes, sodass die resultierende Länge ein Vielfaches von length ist. Intern wird das ISO/IEC 7816-4-Padding-Schema verwendet: Ein 0x80-Byte wird angehängt, gefolgt von so vielen 0x00-Bytes wie nötig, um die Blockgrenze zu erreichen.
Das Verfahren ist besonders wichtig in der Kryptographie, wenn Nachrichten vor der Verschlüsselung auf eine einheitliche (oder zumindest nicht verrätliche) Länge gebracht werden sollen. Unterschiedlich lange Klartexte können andernfalls durch die Länge des Chiffretexts Metadaten preisgeben, selbst wenn der Inhalt sicher verschlüsselt ist.
Nach der Verschlüsselung und Übertragung kann das Padding mit sodium_unpad wieder entfernt werden, sofern die ursprüngliche Blocklänge bekannt ist. Beide Funktionen sind konstante Zeit (constant-time), um Timing-Seitenkanäle zu vermeiden.
- Sinnvoll vor der Verschlüsselung mit
sodium_crypto_secretbox,sodium_crypto_boxo. Ä. - Auch nützlich, wenn Protokolle feste Nachrichtengrößen erfordern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Die zu füllende Zeichenkette. Kann beliebige Binärdaten enthalten. | |
| $length Pflicht | int | Die gewünschte Blockgröße in Bytes. Die Ausgabe wird stets ein Vielfaches dieses Werts sein. Muss eine positive ganze Zahl sein (typisch: 16, 32, 64). |
Rückgabewert
length. Bei ungültigem length-Wert (≤ 0) wird eine SodiumException ausgelöst.Beispiele
Einfaches Padding und anschließendes Entfernen
<?php
$message = 'Hallo Welt';
$blockSize = 16;
$padded = sodium_pad($message, $blockSize);
echo 'Original-Länge: ' . strlen($message) . PHP_EOL;
echo 'Gepadded-Länge: ' . strlen($padded) . PHP_EOL;
// Padding wieder entfernen
$unpadded = sodium_unpad($padded, $blockSize);
echo 'Nach Unpad: ' . $unpadded . PHP_EOL;
echo 'Identisch: ' . ($message === $unpadded ? 'Ja' : 'Nein') . PHP_EOL;
Padding vor der symmetrischen Verschlüsselung
<?php
$plaintext = 'Geheime Nachricht!';
$blockSize = 32;
$key = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Länge vor Verschlüsselung verschleiern
$padded = sodium_pad($plaintext, $blockSize);
$ciphertext = sodium_crypto_secretbox($padded, $nonce, $key);
echo 'Chiffrat (hex): ' . bin2hex($ciphertext) . PHP_EOL;
// Entschlüsselung
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
$original = sodium_unpad($decrypted, $blockSize);
echo 'Entschlüsselt: ' . $original . PHP_EOL;
// Wichtig · Fallstricke
Blockgröße beachten: Wenn die Eingabe bereits ein Vielfaches von length ist, wird trotzdem ein vollständiger Padding-Block angehängt (d. h. die Ausgabe ist dann um genau length Bytes länger). Dies ist notwendig, damit sodium_unpad das Padding immer eindeutig erkennen kann.
Kein Ersatz für Verschlüsselung: Padding allein verschlüsselt keine Daten. Es verschleiert lediglich die genaue Klartextlänge. Die Funktion muss in Kombination mit kryptographischen Primitiven verwendet werden.
Fehlerbehandlung: Bei einem ungültigen length-Wert (z. B. 0 oder negativ) wird eine SodiumException geworfen. Diese sollte stets abgefangen werden.