Signatur
Beschreibung
sodium_unpad() ist das Gegenstück zu sodium_pad() und entfernt das ISO/IEC 7816-4-Padding von einem zuvor aufgefüllten String. Die Funktion gibt den ursprünglichen, ungepaddeten String zurück, sofern das Padding korrekt und konsistent zur angegebenen Blockgröße ist.
Padding wird in der Kryptographie häufig eingesetzt, um die tatsächliche Länge einer Nachricht zu verschleiern, bevor sie verschlüsselt wird. Angreifer könnten sonst aus der Länge des Chiffretexts Rückschlüsse auf den Klartext ziehen. sodium_unpad() sollte daher nach der Entschlüsselung aufgerufen werden, um den Originalinhalt wiederherzustellen.
Der Parameter length muss exakt derselbe Blockgrößen-Wert sein, der auch beim Aufruf von sodium_pad() verwendet wurde. Stimmt die Blockgröße nicht überein oder ist das Padding ungültig, wirft die Funktion eine SodiumException.
Diese Funktion ist Teil der Libsodium-Integration in PHP und setzt voraus, dass die sodium-Erweiterung geladen ist. Sie steht seit PHP 7.2 nativ zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string Pflicht | string | Der gepaddte String, von dem das Padding entfernt werden soll. Muss mit sodium_pad() erstellt worden sein. |
|
| $length Pflicht | int | Die Blockgröße in Bytes, die beim Padding verwendet wurde. Muss einen Wert >= 1 haben und identisch mit dem Wert sein, der bei sodium_pad() angegeben wurde. |
Rückgabewert
SodiumException, wenn das Padding ungültig ist oder der length-Parameter nicht zur Blockgröße passt.Beispiele
Padding hinzufügen und wieder entfernen
<?php
$originalMessage = 'Hallo Welt';
$blockSize = 16;
// Padding hinzufügen
$padded = sodium_pad($originalMessage, $blockSize);
echo 'Gepaddete Länge: ' . strlen($padded) . ' Bytes' . PHP_EOL;
// Padding wieder entfernen
$unpadded = sodium_unpad($padded, $blockSize);
echo 'Original: ' . $unpadded . PHP_EOL;
echo 'Längen stimmen überein: ' . (strlen($unpadded) === strlen($originalMessage) ? 'Ja' : 'Nein') . PHP_EOL;
Praxisbeispiel: Verschlüsselung mit Padding zum Schutz der Nachrichtenlänge
<?php
$blockSize = 32;
$key = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$plaintext = 'Geheime Nachricht';
// Padding vor der Verschlüsselung anwenden
$padded = sodium_pad($plaintext, $blockSize);
// Verschlüsseln
$ciphertext = sodium_crypto_secretbox($padded, $nonce, $key);
// Entschlüsseln
$decryptedPadded = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
if ($decryptedPadded === false) {
throw new RuntimeException('Entschlüsselung fehlgeschlagen!');
}
// Padding nach der Entschlüsselung entfernen
$decrypted = sodium_unpad($decryptedPadded, $blockSize);
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
// Wichtig · Fallstricke
Ausnahmebehandlung: sodium_unpad() wirft eine SodiumException, wenn das Padding nicht korrekt ist. Der Aufruf sollte daher immer in einem try/catch-Block erfolgen, um ungültige oder manipulierte Eingaben sicher abzufangen.
Blockgröße: Die Blockgröße muss beim Entpadden exakt derselbe Wert sein wie beim Padden. Eine falsche Blockgröße führt zu einer Ausnahme oder zu einem falschen Ergebnis. Es empfiehlt sich, die Blockgröße als Konstante zu definieren.
Sicherheit: Das Padding sollte immer vor der Verschlüsselung und das Entpadden immer nach der Entschlüsselung erfolgen. Das Padding eines Klartexts nach der Entschlüsselung zu prüfen kann für Padding-Oracle-Angriffe anfällig sein, wenn die Fehlerbehandlung nicht zeitkonstant ist.