2014-11-03 101 views
0

使用PHP加密mySQL中的信息時遇到問題。我使用下面的例子,最後我可以加密內容,但是當我在其他頁面解密時,會顯示一些奇怪的單詞。使用mySQL進行PHP加密和解密

請幫

我使用下面的函數來加密

<?php 
header("Content-Type:text/html; charset=utf-8"); 

$key = md5('test'); 

function encrypt($string, $key) { 
    $string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$string,MCRYPT_MODE_ECB))); 
    return $string; 
} 

//connection 
.... 
//connection 

mysqli_set_charset($con, 'utf8'); 

if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$name = mysqli_real_escape_string($con,$_POST['name']); 

$sql="INSERT INTO db (name) VALUES ('".encrypt($name,$key)."')"; 

if (!mysqli_query($con,$sql)) { 
    die('Error: ' . mysqli_error($con)); 
} 
?> 

並使用以下功能來解密

<?php 
header("Content-Type:text/html; charset=utf-8"); 

$key = md5('test'); 

function decrypt($string, $key) { 
    $string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,base64_encode($string),MCRYPT_MODE_ECB)); 
    return $string; 
} 

//connection 
.... 
//connection 

mysqli_set_charset($con, 'utf8'); 

if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

     $query = "SELECT * FROM db"; 
     $result = mysqli_query($con, $query); 

     while($row = mysqli_fetch_array($result)) { 
      echo $row['name'] ; 
      echo decrypt($row['name'],$key) ; 
     } 


?> 

輸入:TEST

和解密的結果:

K704rW4crOuvpDZe/yZ2ums0btlo8hvpeyJr91V+Ycg=�x�_L��kR�^О�dMFH��7*�%Ίֶ���M_<��w���W�^ ��3M�"��Rk�

+0

我原來的輸入 – userzero 2014-11-03 10:43:02

+0

的輸入: TEST | 輸出: UQJokP0OqdnWUj5fOkI7dST/DI5rbqNfCyutFK2QNVQ = |奇怪的話: E「RW,X%| R2>} n'w1y4 yO'0 |〜PL { XK; – userzero 2014-11-03 11:00:47

+1

應該不是你的解密函數使用'BASE64_DECODE()',而不是'BASE64_ENCODE()' – 2014-11-03 11:04:11

回答

0

這裏是encrypte的功能和decrypte字符串:

function encrypt_decrypt($action, $string) { 
$output = false; 

$encrypt_method = "AES-256-CBC"; 
$secret_key = 'This is my secret key'; 
$secret_iv = 'This is my secret iv'; 

// hash 
$key = hash('sha256', $secret_key); 

// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning 
$iv = substr(hash('sha256', $secret_iv), 0, 16); 

if($action == 'encrypt') { 
    $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv); 
    $output = base64_encode($output); 
} 
else if($action == 'decrypt'){ 
    $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv); 
} 

return $output; 
} 

,你這樣稱呼它:

如果你想

加密只是把它傳遞給第一個參數,並像這樣在第二PARAM字符串:

$encryptedString = encrypt_decrypt('encrypt', 'test'); 

,並decrypte:

$decrypte = encrypt_decrypt('decrypt', $encryptedString); 
+0

非常感謝第一但STANGE話變成這樣?!。 gsRdgNdjDi3r4YMnBGHw50OzeS0zqtwTUqppi4l3TKkcJpfxMkO75GBQE + 6 + 4u7oMy7wFXyHXr7B0EQIovxdPw == – userzero 2014-11-03 10:55:36

+0

看到我的編輯答案:) – 2014-11-03 11:31:45