2013-01-07 55 views
0

首先,請原諒的問題,它可能是一個簡單的問題,但我有麻煩了解的加密方法..mcrypt_encrypt亂碼

我使用下列功能加密/解密:

private function encodemc($value,$skey){ 
    if(!$value){return false;} 
    $skey = substr($skey, 2, 4); 
    $text = $value; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $skey, $text, MCRYPT_MODE_ECB, $iv); 
    return trim($this->safe_encode($crypttext)); // safe_encode adds another encoding using `base64_encode` 
} 

private function decodemc($value,$skey){ 
    if(!$value){return false;} 
    $skey = substr($skey, 2, 4); 
    $crypttext = $this->safe_decode($value); 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $skey, $crypttext, MCRYPT_MODE_ECB, $iv); 
    return trim($decrypttext); 
} 

$key看起來像這樣:570c45546dwq45gjk191

我將要加密的值傳遞給第一個函數,然後將其保存到數據庫,然後從數據庫中檢索它,然後解密並將其顯示爲html文本。

問題是某些文本沒有得到解密/加密的權利,並且它顯示在html頁面中,就好像它是錯誤的文本編碼。

怪異的部分是10個項目中,只有2或3個是亂碼,取決於密鑰。 另外,有時候只有一部分字符串會出現亂碼。

我發現是什麼原因造成的嘟are是一些隨機字母。例如,當使用上述密鑰時,字母S會破壞代碼並且文本會變成亂碼。

因此,我已將substr($skey, 2, 4);應用於密鑰以查看是否有任何更改。原來,如果我改變密鑰,破壞代碼的字符是不同的。

但即使使用長度爲1的鍵,問題仍然存在。

有什麼想法是什麼問題?

編輯:

下面的代碼的其餘部分。

private function safe_encode($string) { 
    $data = base64_encode($string); 
    $data = str_replace(array('+','/','='),array('-','_',''),$data); 
    return $data; 
} 

private function safe_decode($string) { 
    $data = str_replace(array('-','_'),array('+','/'),$string); 
    $mod4 = strlen($data) % 4; 
    if ($mod4) { 
     $data .= substr('====', $mod4); 
    } 
    return stripslashes(base64_decode($data)); 
} 
+1

我們還需要'safe_encode'和'safe_decode'函數的代碼。我打賭,這不是他們就是打破事情的'修剪'。 – Charles

+0

如果這兩個safe_en/decode函數只會執行base64編譯/解碼操作,那麼您將不會爲它創建函數,對嗎? – hakre

+1

'stripslashes'!如果你發現自己需要它,就會出現問題。 – Charles

回答

0

這似乎是一個非常奇怪的問題。

我沒有給你明確的答案,但這裏有幾件事你可以嘗試。

  1. 加密/解密不去數據庫。如果問題消失,那麼通過加密函數處理字符輸出的數據庫存在問題。
  2. 在加密之前修改該值。如果問題消失,則在加密後修剪是錯誤的。
  3. 刪除safe_encodesafe_decode的代碼。如果問題消失,那麼這些功能會添加/刪除重要的事情。

重要的是,您一次完成以上所有操作,因爲可能存在多個問題。如果上述步驟消除了這些問題,則一次重新引入一個問題,以確定哪些問題會導致問題。

+0

OP指出這些函數只是base64編碼。如果是這樣,你列出的要點是沒有意義的,也許不是3,但這聽起來更像是評論,而不是答案。是的,問題不完整,所以不完全是你的「錯誤」。 – hakre

+0

我嘗試過跳過'safe_decode/encode'功能,但他們的文字更加亂碼...... – ghego1