0

いくつかの Web に mcrypt スニペットがあります。

https://stackoverflow.com/a/11538728/408872

http://www.binrand.com/post/3810303-mcrypt-md5-how-to-create-an-online-encryption-decryption-web-page.html

http://www.techbees.org/best-way-to-use-php-to-encrypt-and-decrypt/

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

echo 'Encrypted:' . "\n";
var_dump($encrypted);

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // spaces are preserved

$string に余分なスペースが導入される理由を知っている人はいますか?

4

1 に答える 1

2

あなたが提供したソースはすべて、ほぼ同じコードを使用しています。彼らが互いにコードを盗んだとしか思えません。したがって、これを行っているのは複数のサイトではなく、単一のサイトである可能性が高く、何が起こっているのかを本当に理解していない他のサイトは、単にこれを継承していました.

暗号化する前に文字列にスペースを追加する正当な理由はありません。それによって暗号化の強度が向上するわけではなく、「より良く」なるわけでもありませ

私の推測では、これらの例では、 のような関数が暗号化されたストリームの内容trimに影響を与えないことを示すために行われていると思います。(個人的には、なぜこれを証明する必要があるのか​​ わかりません-私には完全に論理的です)

Base64 でエンコードされた暗号化されたデータ (おそらくフォーム送信から) を受け入れる場合は、送信されたデータをトリミングして、ユーザーがそこに残した残骸を削除する可能性が高くなります。暗号化されたデータをトリミングすると、元の平文。

編集:

この文字列が base64 でエンコードされていない場合、暗号文が完全に破損する可能性があることに注意してください。暗号文はバイナリ形式で表現されるため、最後に空白文字が含まれる可能性があり、これが削除されて破損する可能性があります。

編集2:

md5(key)キーとmd5(md5(key))初期化ベクトルの両方が、これを実装するためのひどいひどい方法です。

まず、AES 256 には 256 ビット キーが必要です。パスフレーズを使用する場合は、 を使用しますhash('sha256', $passphrase, true)。最終的trueには、結果を 16 進エンコードではなくバイナリとして返します。これは、キーで実際に可能な限り多くのエントロピーを取得するために重要です。

第二に、初期化ベクトルは再利用すべきではありませんmd5(md5(key))同じキーに対して常に同じ値を生成します。これにより、攻撃者が複数の暗号文を取得できた場合、暗号化が大幅に弱体化されます。

于 2012-11-21T12:37:04.117 に答える