2014-11-01 29 views
0

我有以下的加密功能,我試圖扭轉,但它好像我錯過了什麼反向加密代碼的PHP

$ceva = "123456"; 
function encrypt($plaintext,$textHos) { 
    $textLen=str_pad(dechex(strlen($plaintext)),8, '0', STR_PAD_LEFT); 
    $salt='WSj2g7jTvc8ISmL60Akn'; 
    $textHosHash=hash('sha256',$salt.$textHos); 
    $textHos= md5($textHos,true); 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $textHos, 
           $plaintext, MCRYPT_MODE_CBC,$iv); 

    $ciphertext = $iv . $textHosHash . $textLen . $ciphertext; 
    $ciphertext_base64 = base64_encode($ciphertext); 
    return $ciphertext_base64; 
} 
$data = encrypt($ceva,$textHos); 

什麼,我試圖做的是:

$data = 'HpOrKcKS1hwAiFfpbZnijmZmZjg1OWMzOWFlNzRiMzU2Y2JiMTQ5OTY4MTI3MWNiYjQzYjBkMTAyNDUzM2ZhNGJjZmZhNzQ4M2QxN2M0ZGYwMDAwMDAwNu6mYaA+BBBVfbFXChMm/BE='; 
$textHos = 'MCRYPT_RIJNDAEL_128'; 
$salt='WSj2g7jTvc8ISmL60Akn'; 
$textHosHash=hash('sha256',$salt.$textHos); 
$textHos= md5($textHos,true); 
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
$textHosHash=hash('sha256',$salt.$textHos); 
$base64de = base64_decode($data); 
$mdecrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $textHos, $base64de, MCRYPT_MODE_CBC,$iv); 

然後我因爲我的思想被凍結而停止。 有什麼想法?

回答

0

我不會爲您編寫代碼,但我會概述步驟。要解密您必須顛倒您所做的加密步驟,首先要做的事情。所以,讓我們看看密文,並試試看。

我們沒有在加密側的最後一件事是的Base64編碼,所以我們做的解密側的第一件事就是BASE64 解碼它。這會給我們一串字節,這個字節是作爲iv,密鑰散列,原始明文的8個字符的十進制ASCII長度和密文連接而創建的。所以現在你必須提取這些領域。幸運的是,你知道前三個字段的確切長度。

IV:16個字符
密鑰散列:64個字符(十六進制ASCII,代表32個字節)
明文長度:8個字符(十進制ASCII)
密文:一切的遺留

在你的代碼正試圖創建一個新的隨機四解密。這是錯誤的,您必須恢復用於加密的原始IV,並使用該IV來解密。另外,由於您傳輸了密鑰的散列,因此您應該散列正在使用的解密密鑰,並確保它與使用密文發送的散列相匹配。您現在擁有了解密文所需的一切。結果將是一個填充明文。最後,使用明文長度去除可能添加的任何填充。

+0

謝謝格雷格,其實這就是我試圖做的 – SamerBakkar 2014-11-02 10:33:21

0

你錯過了這部分的加密功能:

$ciphertext = $iv . $textHosHash . $textLen . $ciphertext;

運行`mcrypt_decrypt」你需要剝去這些東西離數據的前前。