我的代码首先使用mcrypt_ecb
和hten
加密,然后使用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çæÇ|¤
答案 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)。