题
我正在编写一个错误处理程序脚本,该脚本将加密错误数据(文件,行,错误,消息等),并将序列化数组作为邮政变量(使用卷发)传递到脚本,然后将中央db中的错误记录。
我已经在单个文件中测试了我的加密/解密功能,并且数据已加密和解密良好:
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?†÷>c×åóéè+„N
Decrypted: d41d8cd98f00b204e9800998ecf8427e
问题是,当我将加密函数放在我的发送文件(TX.PHP)和接收文件(RX.PHP)中的解密时,数据尚未完全解密(两个文件都有相同的键常数,用于键, Cypher和模式)。
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);
我怀疑的事情可能导致这一点:
- 卷发请求的编码
- 与McRypt Padding缺少字节有关
- 我盯着它太久了,错过了真的很明显的东西
如果我关闭隐窝功能(因此未加密传输TX-> rx),则收到数据罚款。
所有人都非常感谢!
谢谢,亚当
解决方案 2
我发现了 - 必须 base64_encode
加密后的数据,然后 base64_decode
解密之前。
感谢那些代表我思考的人!
其他提示
加密数据是二进制数据,但您没有编码URL。在卷发中执行此操作
$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);
这两个答案对我来说都不可能。 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);
}
?>
希望这对某人有帮助。
不隶属于 StackOverflow