2016-07-07 47 views
-2

在php中我想加密和解密數據。我不想使用特殊字符。我只有6-8位數的字母和數字。對於加密和解密,我已經做了這個功能,但有時它不能解密加密的數字,也有它的特殊字符的長度。Php加密,解密沒有特殊字符和數字長度應該是6-8

function random_password($length = 8) { 
$password = ""; 
$possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ"; 
$maxlength = strlen($possible); 
if ($length > $maxlength) { 
    $length = $maxlength; 
    } 

$i = 0; 

while ($i < $length) { 
    $char = substr($possible, mt_rand(0, $maxlength-1), 1); 
    if (!strstr($password, $char)) { 
    $password .= $char; 
    $i++; 
     } 
    } 

return $password; 

}

function encrypt($plaintext, $salt) { 
    $td = mcrypt_module_open('cast-256', '', 'ecb', ''); 
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    mcrypt_generic_init($td, $salt, $iv); 
    $encrypted_data = mcrypt_generic($td, $plaintext); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    $encoded_64 = base64_encode($encrypted_data); 
    return trim($encoded_64); 
} 

function decrypt($crypttext, $salt) { 
    $decoded_64=base64_decode($crypttext); 
    $td = mcrypt_module_open('cast-256', '', 'ecb', ''); 
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    mcrypt_generic_init($td, $salt, $iv); 
    $decrypted_data = mdecrypt_generic($td, $decoded_64); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 
    return trim($decrypted_data); 
} 
+1

我認爲在這個問題上的一般建議是**而不是**滾動自己的加密。對不起,我不能比這更有幫助。 –

+2

從頭開始:加密的用例是什麼,它將接受哪些可能的輸入,您想要生成的輸出是什麼以及爲什麼? – deceze

+1

6-8位數字聽起來不太安全。 – apokryfos

回答

2

我有兩個語句,然後這麼多問題

  1. 你寫的加密代碼不安全,所以不要使用它。並且請告訴您在哪裏發現他們分發不安全加密代碼的代碼。
    • 我的意思是,在ECB模式下的CAST-256 ...有IV嗎?並使用MCRYPT_RAND?完全沒有認證?沒有安全專家會簽署。
  2. 在函數random_password()中使用mt_rand()也是有關的。你沒有使用CSPRNG。

你到底在問什麼?

我不想使用特殊字符。我只有6-8位數的字母和數字。

所以,你希望輸出大小在6-8之間(爲什麼是這個變量?)數字長,只有字母數字字符?

2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ

爲什麼沒有元音?

你想在這裏解決什麼問題?

你爲什麼不使用defuse/php-encryption並使用你想要的密碼?或者完全避開密碼並使用其基於密鑰的加密功能(默認)?

我推薦使用安全的PHP加密庫而不是自己寫。

並且請告知您的發佈的加密代碼中的安全錯誤的來源。使用該代碼的人越少,互聯網就越安全。

+1

也許微軟也應該被告知,他們正在託管示例代碼:[「如何使用Visual C#加密和解密文件」](https://support.microsoft.com/en-us/kb/307010),它使用DES。 – zaph

+0

@zaph我留下一個措辭強烈的「反饋」,以字面意思是「從軌道上摧毀它」開始:P –

+1

太棒了!問題是,舊的答案留在周圍,加密的新開發人員無法知道要使用什麼,並經常撿起最糟糕的基地,不知道發生了什麼。 – zaph