11

私は単純な承認スキームをいじっています。SSL やその他の HTTP 認証なしで行う最も簡単な方法は、共有キー暗号化だと思います。PHPマニュアルの簡単な例を採用して、次のことを思いつきました。

$text = "boggles the invisible monkey will rule the world";
$key = "This is a very secret key";

$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_ECB, $iv);

$iv = base64_encode($iv);
$enc = base64_encode($enc);

echo '<a href="temp2.php?iv='.$iv.'&text='.$enc.'">link</a><br />';

このリクエストを受け取るページ (temp2.​​php) は次のようになります。

$key = "This is a very secret key";

$iv = base64_decode($_GET["iv"]);
$enc = base64_decode($_GET["text"]);

$crypttext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv);

echo "$crypttext<br>";

これは非常に近いですが、正しくデコードされません-エコーします

boggles the invisible monkey will rule t—;eôügJë

ハングアップが何であるかわかりません。リクエストで文字が壊れているのではないかと考えて、urlencode/urldecode と htmlentities を試しましたが、違いはありませんでした。

私が見逃しているものは他にありますか?おそらくパディング?

ありがとう

4

1 に答える 1

29

暗号化されたテキストが次のようになることがあります。

Z5DlBqT8yEB4HKLkAlvfJoWaHgnNVLFh7jls6L85sLriedc82uFQxm+M62I41oB7

プラス記号が見えますか?URL のプラス記号はスペースに変換されます。

そのプラス記号を手動でスペースに変換し、結果を復号化すると、出力は、あなたが目撃した破損したジャンクです.

IV と暗号化されたテキストの両方をリンクに貼り付ける前にrawurlencode( not ) 実行する必要があります。 urlencodeこれにより、プラス記号が適切にエンコードされ、プロセス全体で保持されます。urldecode反対側の文字列は必要ありません (すべきではありません) 。PHP がこれを行ってくれます。

于 2011-04-22T17:12:48.747 に答える