2016-05-09 13 views
2

を暗号化するためにphpseclib AESを使用したページは何も前http://phpseclib.sourceforge.net/crypt/examples.htmlはので、ここで[OK]を文字列

<?php 
include('Crypt/AES.php'); 
include('Crypt/Random.php'); 

$cipher = new Crypt_AES(); // could use CRYPT_AES_MODE_CBC 
// keys are null-padded to the closest valid size 
// longer than the longest key and it's truncated 
//$cipher->setKeyLength(128); 
$cipher->setKey('abcdefghijklmnop'); 
// the IV defaults to all-NULLs if not explicitly defined 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 

$size = 10 * 1024; 
$plaintext = str_repeat('a', $size); 

echo $cipher->decrypt($cipher->encrypt($plaintext)); 
?> 

からのサンプルコードです、なぜライン//$cipher->setKeyLength(128);はコメントアウトされていますか?

キーを '1234568790'に設定したい場合は、何かすべきことはありますか?これは、上記の例のキーの長さ(abcdefghijklmnop)よりもはるかに短いためです。

最後に、暗号化したいプレーンテキストが短い場合は、「my name is james bond」のようなものがありますが、余計なことはありますか?上記のコードから、それは平文の長さは何も前に、10×1024(なぜですか?)

+0

プレーンテキストは10x1024であってはなりません。例として、10KBのサイズ(したがって10x1024)の文字列を作成しました。 128ビットのキーとは、128/8バイト= 16バイトを意味し、1文字あたり2バイトで8文字になります。 256ビットキー= 32バイト= 16文字(したがってabcdefghijklmnopは16文字です)。私はあなたが見つけたその特定のライブラリに徹底的に慣れているわけではありません - 私は純粋なPHPライブラリよりもopenssl拡張を好みます。あなたのコメントのために – Mjh

+0

@Mjhありがとう。しかし、この例では、128ビットに設定するとabcdefghijklmnopというキーが表示されます... 128ビットのキーでは16文字です – imin

+1

これらの文字は使用する必要はありません。キーはまた、(ハッシュを介して)16進形式に変換することができ、対応する量のバイトを使用することができる。個人的には、私が使用する鍵は常にランダムに作成され、次にハッシュされます。使用されるハッシュ関数は、暗号のブロックサイズに応じて選択されます。暗号化は複雑な獣であり、正しく実装されていないことがよくあります(訓練された暗号者は私が投稿したコメントに間違いを見つけるでしょう)。暗号化をさらに進める前に[このブログ](http://www.cryptofails.com/)をお勧めします。最初からすぐにそれを行うのが最善です。 – Mjh

答えて

3

する必要がありそうですので、なぜライン//$cipher->setKeyLength(128);はコメントアウトされていますか?

phpseclibに1737バイトのキーをsetKeyで渡したとします。あなたは何をすべきだと思いますか? 1.0および2.0バージョンでは、setKeyLengthが呼び出されていない場合、キーは24バイト(たとえば、192ビット)にヌルパディングされます。しかし、setKeyLengthの場合、16バイトに切り捨てられます。マスターブランチ(私が理解するように、最終的に3.0ブランチになります)では、キーの長さが有効でないと例外がスローされます。このバージョンでは、たとえば、コードの一部でキー長を128ビットとして設定し、実際にコードの別の部分にキーを設定する場合は、setKeyLengthを呼び出すことが望ましい場合があります。すなわち、長さのチェックやphpseclibの長さチェックができます。

私のキーを '1234568790'に設定したい場合、私は何をすべきですか?これは、上記の例のキーの長さ(abcdefghijklmnop)よりもはるかに短いためです。

1234568790は有効なキーではありません。それは80バイトの長さです。最小のAESサポートキーは128ビットです。たぶん、setKey('1234568790')の代わりにsetPassword('1234568790')のようなことをするとよいでしょう。 setPasswordは、キー派生関数を使用してパスワードからキーを生成します。

phpseclib 1.0と2.0 setKeyでは、それはキーとして受け入れられません。それは単にキーをヌルパッドするだけです。キーが実際には十分に長くないので、マスターブランチのotohは例外をスローします。

最後に、暗号化したいプレーンテキストが短い場合、「my name is james bond」のようなものがありますか?上記のコードから、平文の長さは10 x 1024である必要があります(理由は?)

10 * 1024は一例です。 phpseclibは、デフォルトでは、文字列を十分に長くするためにPKCS7パディングを使用します。例えば。あなたの文字列は21バイト(私が正しく数えた場合)です。したがって、$cipher->encrypt('my name is james bond')と呼ぶ場合、chr(11)はphpseclibによって平文に11回追加され、文字列は暗号化されます。これは、ブロックアルゴリズムが平文をブロック長の倍数にする必要があるためです。そのため、暗号文の長さは32バイトになります。 $cipher->decrypt('...')を呼び出すと、元の21バイトの文字列が返されます。私はPKCS7パディングについてさらに詳しく説明することができましたが、私はあなたの直ぐ質問に答えてきたと思います。

+0

うわー。非常に有益。どうもありがとう。 – imin

関連する問題