2012-07-25 11 views
5

Im PHP documentation for mcrypt_get_iv_size wird angegeben, dass der Rückgabewert Null sein wird, wenn der Algorithmus/Blockmodus Kombination keine IV verwenden:Gibt PHPs mcrypt_get_iv_size tatsächlich Null zurück, wenn die IV nicht benötigt wird?

in Bytes

Gibt die Größe des Initialisierungsvektor (IV). Bei einem Fehler gibt die Funktion FALSE zurück. Wenn die IV in der angegebenen Chiffre/Modus-Kombination ignoriert wird, wird Null zurückgegeben.

wenn ich rufe diese Funktion mit MCRYPT_DES als Algo und MCRYPT_MODE_ECB als Modus kehrt 8 (acht) anstelle der erwarteten 0 (Null).

Es ist mein Verständnis, dass EZB nicht und kann nicht eine IV verwenden, und damit erwarte ich den Nullwert. Ist das falsch, ist die Dokumentation falsch oder fehlt mir etwas anderes?

Der folgende Ausschnitt zeigt das Problem:

<?php 
// I expect this call to return zero. 
$size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB); 
echo 'IV Size: ' . $size . PHP_EOL; 

Bitte beachten Sie, dass ich nicht wirklich EZB für reale Verschlüsselung verwenden, versuche ich einfach zu bestimmen, ob eine beliebige eine zuverlässige Art und Weise zu finden Algo/Modus erfordert eine IV. (Ich bemerke, dass die mcrypt-Bibliothek eine Funktion "mcrypt_enc_mode_has_iv" hat, aber es scheint keine äquivalente PHP-Funktion zu geben).

Ich verwende PHP v5.3.12 mit libmcrypt 2.5.8_1.

-Update mit möglicher Abhilfe:

Mit Blick auf der libmcrypt Quelle scheint es, als ob mcrypt_enc_get_iv_size() immer die Blockgröße für jeden Block Cipher-Modus zurück, aber falle zurück auf den Algorithmus für den Strom „zu fragen“ Modi.

int mcrypt_enc_get_iv_size(MCRYPT td) 
{ 
    if (mcrypt_enc_is_block_algorithm_mode(td) == 1) { 
     return mcrypt_enc_get_block_size(td); 
    } else { 
     return mcrypt_get_algo_iv_size(td); 
    } 
} 

Die mcrypt_get_algo_iv_size() Aufruf wird der Algorithmus Bibliothek _mcrypt_get_algo_iv_size() Funktion weitergeleitet. Hoffentlich bedeutet dies, dass ich, wenn ich den Fall der EZB manuell handle, das richtige Ergebnis für diejenigen Algorithmen liefern sollte, die eine IV im Stream-Modus erfordern.

Antwort

1

Sie haben Recht, EZB keine IV verwenden, wie es auch in der PHP documentation for mcrypt_get_iv_size darauf hingewiesen wird:

Einer der MCRYPT_MODE_modename Konstanten oder eine der folgenden Zeichenfolgen: „ECB“, „cbc "," cfb "," ofb "," nofb "oder" stream ". Die IV wird im ECB-Modus ignoriert, da dieser Modus sie nicht benötigt. Sie müssen sowohl bei der Verschlüsselung als auch bei der Entschlüsselung die gleiche IV (denken Sie an den Ausgangspunkt) haben, da sonst Ihre Verschlüsselung fehlschlägt.

Warum mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB) zurückgibt 8 ist ungerade. Vorsätzlich oder nicht, sollten Sie es ignorieren.

+1

Ich kann es nicht einfach ignorieren, da die EZB allein kein zuverlässiger Indikator dafür ist, ob eine IV erforderlich ist oder nicht (an anderer Stelle in der Dokumentation heißt es, dass einige Verschlüsselungen eine IV bei Verwendung des Stream-Modus erfordern). Ich denke, ich werde einen PHP-Fehlerbericht einreichen und sehen, ob sie den Code oder die Dokumentation ändern wollen :). Danke für Ihre Antwort. – jmalloc

+1

ECB als Block-Modus ist ein zuverlässiger Indikator. Dass Sie ECB verwenden, um einen anderen Modus zu implementieren, ändert diese Tatsache nicht. –

+1

Beachten Sie, dass ich alle für das Ändern des Ergebnisses der Methode und/oder der Dokumentation bin, obwohl ich mich dafür entscheiden würde, -1 zurückzugeben, um eine fehlgeschlagene schnelle Situation zu erstellen. –

Verwandte Themen