2014-04-12 104 views
0

我有我第一次使用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çæÇ|¤ 

回答

0

mcrypt_ecb的輸出是二進制數據,其字節可以包含任意值。如果您想將它作爲url參數傳輸,您必須先對其進行編碼。一般的問題是,url參數解析假設url的某種結構。例如,如果您編寫http://localhost/scale/check.php?mac=abc123&foo=bar,則PHP將看到兩個參數,第一個參數爲mac,值爲abc123,第二個參數爲foo,值爲bar。但是,就像您將密文連接到url一樣,即使您確實想要使用abc123&foo=bar的值mac,也可能會得到相同的url。爲了防止這種混淆,必須對所有值進行編碼,以便不出現某些字符。在你的例子中,空間似乎是有問題的。

你可以在這裏找到一些url編碼的背景:https://en.wikipedia.org/wiki/Percent-encoding

順便說一句:如果你只發布minimal example你的問題,通常會很感激。鑑於您在傳輸數據方面存在問題,您可以刪除所有加密代碼。但正如我現在所看到的,我不禁注意到算法DES和分組密碼模式ECB通常是非常不安全的選擇。如果要在傳輸過程中保護數據,則可以使用https連接(注意「s」代表「安全」,這會強制您的http客戶端使用TLS連接到服務器)來避免所有usual issues with home grown crypto schemes

相關問題