2011-04-11 92 views

回答

16

你不能。從documentation

注:沒有解密功能,因爲crypt()使用單向算法。

閱讀文檔幫助;)

+1

如果你想加密/解密,結賬[使用PHP來加密和解密的最佳方式?(http://stackoverflow.com/questions/1289061/best-way-to-use-php-to-encrypt-and-解密)。 – Konerak 2011-04-11 11:45:27

4

地穴是一個單向散列,你不能解密。

如果你想它比較對另一個字符串,你可以隱窩太然後比較兩個字符串加密後。

0

由於隱窩()產生一個散列解密是不可能的。如果您需要猜測原始數據(「名稱」),則可以使用蠻力算法和巨大字典的組合。

+0

即使如此,你會努力獲得的任何地方,所以所有的暴力破解你將不會得到遠隱窩會隨機創建鹽。 – 2012-07-11 04:57:42

2

使用雙向散列

嘗試mcrypt

tutorial

+0

只挑選提供的算法中的一個(這裏)(http://www.php.net/manual/en/refs.crypto.php) – diEcho 2011-04-11 11:45:08

0

我找到mcrypt的一個例子,創建兩個功能,文本或二進制文件:

function MyDecrypt($input,$key){  
     /* Open module, and create IV */ 
     $td = mcrypt_module_open('des', '', 'ecb', ''); 
     $key = substr($key, 0, mcrypt_enc_get_key_size($td)); 
     $iv_size = mcrypt_enc_get_iv_size($td); 
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
     /* Initialize encryption handle */ 
     if (mcrypt_generic_init($td, $key, $iv) != -1) { 
      /* 2 Reinitialize buffers for decryption */ 
      mcrypt_generic_init($td, $key, $iv); 
      $p_t = mdecrypt_generic($td, $input); 
       return $p_t; 
      /* 3 Clean up */ 
      mcrypt_generic_deinit($td); 
      mcrypt_module_close($td); 
     } 
} // end function Decrypt() 


function MyCrypt($input, $key){ 
    /* Open module, and create IV */ 
    $td = mcrypt_module_open('des', '', 'ecb', ''); 
    $key = substr($key, 0, mcrypt_enc_get_key_size($td)); 
    $iv_size = mcrypt_enc_get_iv_size($td); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    /* Initialize encryption handle */ 
    if (mcrypt_generic_init($td, $key, $iv) != -1) { 
     /* 1 Encrypt data */ 
     $c_t = mcrypt_generic($td, $input); 
     mcrypt_generic_deinit($td); 
      return $c_t; 
     /* 3 Clean up */ 
     mcrypt_generic_deinit($td); 
     mcrypt_module_close($td); 
    } 
} 

對於實施例隱窩的字符串:

$original_text = "Hello world !"; 
    $password = "abc123"; 
echo '<p>Original_text: '.$original_text.'</p>'; 
    $crypted_text = MyCrypt($original_text,$password); 
echo '<p>Crypted_text: '.$crypted_text.'</p>'; 
    $decrypted_text= MyDecrypt($crypted_text,$password); 
echo '<p>Decrypted_text: '.$decrypted_text.'</p>'; 

echo '<p>And if I try with a wrong password?</p>'; 
    $wrong_decrypted_text= MyDecrypt($crypted_text,"wrong_pw"); 
echo '<p>Decrypted with wrong password: '.$wrong_decrypted_text.'</p>'; 

我希望有幫助

+0

注意,DES是遠遠不安全和更強的替代方案應當優選的(比方說,AES) ;而且使用ECB也是一個壞主意 - CBC對於大多數應用程序來說更安全。 – tucuxi 2015-05-25 15:54:44

0

你不能真正地將其解密,因爲有(無限)許多字符串,從而crypt($input) == crypt("name") - 但你可以通過蠻力試錯,找到一些這些字符串的

如果你知道或懷疑原始字符串是很短的字典中的單詞,你會發現這產生相同的輸出很短的字典中的單詞,那麼你已經「解密」的原始字符串。

md5和許多較弱的散列函數襲擊經常這樣。

-2
<?php 

$hashed_password = crypt('mypassword'); // let the salt be automatically generated 

/* You should pass the entire results of crypt() as the salt for comparing a 
    password, to avoid problems when different hashing algorithms are used. (As 
    it says above, standard DES-based password hashing uses a 2-character salt, 
    but MD5-based hashing uses 12.) */ 
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { 
    echo "Password verified!"; 
} 

?> 
+0

這不是根據要求「解密」。 – deceze 2018-01-22 11:50:42