2

エラーデータ(ファイル、行、エラー、メッセージなど)を暗号化し、シリアル化された配列を(curlを使用して)POST変数としてスクリプトに渡し、エラーを中央データベースに記録するエラーハンドラースクリプトを作成しています。

暗号化/復号化機能を単一のファイルでテストしたところ、データは正常に暗号化および復号化されました。

define('KEY', 'abc');
define('CYPHER', 'blowfish');
define('MODE', 'cfb');


function encrypt($data) {
    $td = mcrypt_module_open(CYPHER, '', MODE, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, KEY, $iv);
    $crypttext = mcrypt_generic($td, $data);
    mcrypt_generic_deinit($td);
    return $iv.$crypttext;
}

function decrypt($data) {
    $td = mcrypt_module_open(CYPHER, '', MODE, '');
    $ivsize = mcrypt_enc_get_iv_size($td);
    $iv = substr($data, 0, $ivsize);
    $data = substr($data, $ivsize);
    if ($iv)
    {
        mcrypt_generic_init($td, KEY, $iv);
        $data = mdecrypt_generic($td, $data);
    }
    return $data;
}

echo "<pre>";
$data = md5('');
echo "Data: $data\n";
$e = encrypt($data);
echo "Encrypted: $e\n";
$d = decrypt($e);
echo "Decrypted: $d\n";

出力:

Data: d41d8cd98f00b204e9800998ecf8427e
Encrypted: ê÷#¯KžViiÖŠŒÆÜ,ÑFÕUW£´Œt?†÷&gt;c×åóéè+„N
Decrypted: d41d8cd98f00b204e9800998ecf8427e

問題は、送信ファイル (tx.php) に暗号化関数を配置し、受信ファイル (rx.php) に復号化関数を配置すると、データが完全に復号化されないことです (両方のファイルにキーの定数の同じセットがあり、サイファーとモード)。

Data before passing: a:4:{s:3:"err";i:1024;s:3:"msg";s:4:"Oops";s:4:"file";s:46:"/Applications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Data decrypted: Mª4:{s:3:"err";i:1024@7OYªç`^;g";s:4:"Oops";s:4:"file";sôÔ8F•Ópplications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}

真ん中のランダムな文字に注意してください。

私のカールはかなり単純です:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);

これを引き起こしている可能性があると思われるもの:

  • curl リクエストのエンコーディング
  • 不足しているバイトをパディングする mcrypt と関係がある
  • 私はあまりにも長い間それを見つめていて、本当に本当に明白なものを見落としていました

暗号化機能をオフにすると (転送 tx->rx は暗号化されません)、データは正常に受信されます。

ありとあらゆる助けが大歓迎です!

ありがとう、アダム

4

3 に答える 3

3

暗号化されたデータはバイナリですが、URL エンコードされていません。これを CURL で行い、

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
于 2010-04-30T19:15:38.987 に答える
1

私はそれを理解しました-base64_encode暗号化後、base64_decode復号化する前にデータを取得する必要がありました。

私に代わって考えてくれた人に感謝します!

于 2010-04-30T19:44:15.547 に答える
1

この答えも私にとっては大丈夫ではありませんでした。Base64_encode はまだ安全ではなく、スペースや長い文字列のプラス記号に問題があります。この機能が役立つことがわかりました:

<?php 
function urlsafe_b64encode($string)
{
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_','.'),$data);
    return $data;
}
function urlsafe_b64decode($string)
{
    $data = str_replace(array('-','_','.'),array('+','/','='),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}
?>

これが誰かに役立つことを願っています。

于 2010-10-29T12:45:04.050 に答える