私はPHPスクリプトを使用して、以下の方法で文字列の基本的な暗号化を行います:
<?php
$key = 'secretkey';
$string = $_GET['str'];
if ($_GET['method'] == "decrypt")
{
$output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}
if ($_GET['method'] == "encrypt")
{
$output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
echo $output;
?>
文字列を暗号化するURLの例は次のようになります。
Encrypt.php?method = encrypt&str =クイックフォックス
これは暗号化された文字列としてこれを返します:
LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =
文字列を復号化するには、次のように「メソッド」クエリを「復号化」に変更するだけです。
Encrypt.php?method = decrypt&str = LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =
唯一の問題は、暗号化された文字列が復号化されると、次のように返されることです。
¬ƒ§rYV}̳5Äš・nßì(ñïX8Þ; b
問題を、暗号化された文字列に含まれるプラス記号に絞り込みました。 PHPのGETメソッドは、プラス記号を空白スペースに変換するようです。このバグを検索したところ、すでに報告されていることがわかりました here 。そのページに記載されているさまざまな方法を試しましたが、成功しませんでした。私が得た最も近いものはこれを使うことです:
$fixedstring = str_replace(" ", "+", $string);
そして、暗号化メソッドで$ fixedstringを使用すると、問題は、復号化時にすべての空白スペースがプラス記号に変換されることです。何か案は?
POSTの方が理にかなっていますが、特定の理由でGETを使用しています。詳細は省略します。
そのバグレポート全体を読むと、 RFC 2396 への参照が表示されます。 +は予約済みであると述べています。 PHPは、エンコードされていない+記号をスペースに変換するときに正しく機能します。
ユーザーに返すときにurlencode()を使用できます。したがって、ユーザーが暗号化解除のために暗号文を送信すると、それをurldecode()できます。 PHPは、GET文字列を介して受信した場合にも、自動的にこれを実行します。
ボトムライン:+はPHPにエンコードされた値として送信する必要があります:%2B
これは古い質問であることは承知していますが、GET文字列に+記号を使用した同様の問題の解決策を探していました。私はこのページに出くわし、思いついた解決策を共有したいと思いました。
<?php
$key = 'secretkey';
$string = $_GET['str'];
if ($_GET['method'] == "decrypt")
{
$string = urlencode($string);
$string = str_replace("+", "%2B",$string);
$string = urldecode($string);
$output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
}
if ($_GET['method'] == "encrypt")
{
$output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
}
echo $output;
?>
暗号化された文字列をクエリ文字列に配置する前に、 urlencode()
を使用する必要があります。これにより、特殊文字(+
を含む)が「エスケープ」され、 urldecode()
解読する前に、元の形式に戻します。
上記の答えはどれもうまくいきませんでした。
rawurldecode()
そして
rawurlencode()
「+」記号を含む文字列変数を使用してPHPスクリプトにURLを渡そうとしたときに同じ問題が発生しました。これを動作させることができました。
encodeURIComponent([string])
例えば:
var modelString = "SEACAT+PROFILER";
modelString = encodeURIComponent(modelString);
//"SEACAT%2BPROFILER"
%2B
は、正しい値をPHP GETに@hobodaveが言ったように渡して、正しいデータセットを返します。
これがこのような何かに出会った他の誰かを助け、上記の例に少し異なる見方が必要になったことを願っています。