2010-04-30 78 views
2

我正在写一个错误处理程序脚本,用于加密错误数据(文件,行,错误,消息等)并将序列化数组作为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是未加密的),数据收到的罚款。

任何和所有帮助非常感谢!

谢谢,亚当

回答

1

我想通了 - 不得不base64_encode加密后的数据,然后base64_decode解密之前。

感谢那些为我而思考的人!

3

加密的数据是二进制的,但你没有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); 
+0

感谢您的建议,但我补充说,并没有解决问题。 – 2010-04-30 19:19:01

1

对这个问题,我的回答没有问题。 Base64_encode仍然不安全,并且对于较长的字符串而言,存在空格和加号的问题。我发现this函数有帮助:

<?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); 
} 
?> 

希望这有助于某人。