我正在写一个错误处理程序脚本,用于加密错误数据(文件,行,错误,消息等)并将序列化数组作为POST变量(使用curl)传递给一个脚本,然后在中央数据库中记录错误。使用mcrypt通过web服务传递数据失败
我测试在单个文件中我的加密/解密功能和所述数据被加密和解密的细:
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)中,数据未完全解密(两个文件对于密钥,密码和模式都具有相同的一组常量)。
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:[email protected]ªç`^;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的填充缺失的字节
- 我一直盯着它太久,错过了真正非常明显的东西
如果我关闭crypt功能(所以传输tx-> rx是未加密的),数据收到的罚款。
任何和所有帮助非常感谢!
谢谢,亚当
感谢您的建议,但我补充说,并没有解决问题。 – 2010-04-30 19:19:01