当我使用file_get_contents PHP时,mcrypt_ecb没有正确解密

时间:2014-04-12 21:50:58

标签: php encryption

我的代码首先使用mcrypt_ecbhten加密,然后使用file_get_contents将值发送到另一个页面。但是当我回显接收数据时,它只会打印一半。我在下面附上了我的代码和结果:

客户

$mac="B8-AC-6F-2D-5C-23";
// encrpt the max address
$key_value = pack('H*', "bcb04b7e103a0c"); 
$plain_text = $mac; 
$encrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $plain_text, MCRYPT_ENCRYPT); 
echo ("<p><b> Text after encryption : </b>"); 
echo ( $encrypted_text ); 

// send encrypted mac address to bridge for verification
$response = file_get_contents('http://localhost/scale/check.php?mac='.$encrypted_text);
print_r( $response );

主机

    if (isset($_GET['mac']) && $_GET['mac']) {
    $mac = $_GET['mac'];
    echo "<br/>";
    echo $mac;
    //decrypted recieve data 
    $key_value = pack('H*', "bcb04b7e103a0c");
    /* @var $encrypted_text type */
    $encrypted_text = $mac;
    $decrypted_text = mcrypt_ecb(MCRYPT_DES, $key_value, $encrypted_text, MCRYPT_DECRYPT);
   echo ("<p><b> Text after decryption : </b>");
   echo ( $decrypted_text ); 
}

结果:

B8-AC-6F-2D-5C-23
Text after encryption : 5"ÆfÛkã–]» º"÷5Ù(Ÿ©U
_5"ÆfÛk_ã–]»

Text after decryption : 9Bþ‚î10tçæÇ|¤

1 个答案:

答案 0 :(得分:0)

mcrypt_ecb的输出是二进制数据,其字节可以包含任意值。如果要将其作为url参数传输,则必须先对其进行编码。一般问题是url参数解析假定url的某个结构。例如,如果您编写http://localhost/scale/check.php?mac=abc123&foo=bar,则PHP将看到两个参数,第一个参数为mac,其值为abc123,第二个参数为foo且值为bar。但是,在您将密文与网址连接的方式中,即使您真的打算使用值为mac的参数abc123&foo=bar,也可能会使用相同的网址。为防止此类混淆,必须对所有值进行编码,以便不显示某些字符。在你的例子中,空间似乎有问题。

您可以在此处找到关于网址编码的一些背景知识:https://en.wikipedia.org/wiki/Percent-encoding

顺便说一句:如果您只发布问题minimal example,我们会非常感激。鉴于您在传输数据时遇到问题,您可以删除所有加密代码。但正如我现在所看到的那样,我不禁注意到算法DES和分组密码模式ECB通常是一种非常不安全的选择。如果您想在传输过程中保护数据,可以使用https连接来避免所有usual issues with home grown crypto schemes(注意“s”表示“安全”,这会强制您的http客户端使用连接到服务器TLS)。