Start · Sprachen · PHP · Referenz · sodium_pad

sodium_pad

Funktion

Fügt einer Zeichenkette Fülldaten (Padding) bis zum nächsten Vielfachen der angegebenen Blocklänge hinzu, um die ursprüngliche Länge zu verschleiern.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_pad(string $string, int $length): string

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_box o. Ä.
  • 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

Typ
string
Beschreibung
Gibt die mit Padding versehene Zeichenkette zurück. Die Länge ist stets ein Vielfaches von 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;
Original-Länge: 10 Gepadded-Länge: 16 Nach Unpad: Hallo Welt Identisch: Ja

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;
Chiffrat (hex): <variiert je nach Schlüssel und Nonce> Entschlüsselt: Geheime Nachricht!

// 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.