2009-04-29 52 views
4

在功能上需要關鍵不mcrypt的libraly在PHP如何在PHP中沒有的mcrypt庫加密字符串

function encrypt($str, $pass){ 
     $str_arr = str_split($str); 
     $pass_arr = str_split($pass); 
     $add = 0; 
     $div = strlen($str)/strlen($pass); 
     while ($add <= $div) { 
      $newpass .= $pass; 
      $add++; 
     } 
     $pass_arr = str_split($newpass); 
     foreach($str_arr as $key =>$asc) { 
      $pass_int = ord($pass_arr[$key]); 
      $str_int = ord($asc); 
      $int_add = $str_int + $pass_int; 
      $ascii .= chr($int_add); 
     } 
     return $ascii; 
    } 

    function decrypt($enc, $pass){ 
     $enc_arr = str_split($enc); 
     $pass_arr = str_split($pass); 
     $add = 0; 
     $div = strlen($enc)/strlen($pass); 
     while ($add <= $div) { 
      $newpass .= $pass; 
      $add++; 
     } 
     $pass_arr = str_split($newpass); 
     foreach($enc_arr as $key =>$asc) { 
      $pass_int = ord($pass_arr[$key]); 
      $enc_int = ord($asc); 
      $str_int = $enc_int - $pass_int; 
      $ascii .= chr($str_int); 
     } 
     return $ascii; 
    } 

在這個加密字符串我性格不行我測試了

+0

你說什麼?需要此問題的更多信息。 – 2009-04-29 04:52:12

回答

4

此代碼是相當低效,我並不感到驚訝,它沒有給出預期的結果。

echo RotEncrypt('cheese', 'pie') . "\n<br>\n" 
    .RotDecrypt(RotEncrypt('cheese', 'pie'), 'pie'); 
// ÓÑÊÕÜÊ 
// cheese 

function RotEncrypt($str, $pass){ 
    $pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT)); 
    $stra = str_split($str); 
    foreach($stra as $k=>$v){ 
    $tmp = ord($v)+ord($pass[$k]); 
    $stra[$k] = chr($tmp > 255 ?($tmp-256):$tmp); 
    } 
    return join('', $stra); 
} 
function RotDecrypt($str, $pass){ 
    $pass = str_split(str_pad('', strlen($str), $pass, STR_PAD_RIGHT)); 
    $stra = str_split($str); 
    foreach($stra as $k=>$v){ 
    $tmp = ord($v)-ord($pass[$k]); 
    $stra[$k] = chr($tmp < 0 ?($tmp+256):$tmp); 
    } 
    return join('', $stra); 
} 

經過測試,它似乎很適合我。

無論哪種方式,我覺得我應該警告你,這是一種非常不安全的加密形式,大多數密碼使用相同的字符集和相當小的長度範圍,這使得該系統非常容易受到人們能夠工作密碼的準確度相當好。

+0

不行,爲什麼? – 2009-04-29 07:49:19

6

這裏的另一種方法:

$key = 'the quick brown fox jumps over the lazy '; 
$string = 'Hey we are testing encryption'; 

echo enc_encrypt($string, $key)."\n"; 
echo enc_decrypt(enc_encrypt($string, $key), $key)."\n"; 

function enc_encrypt($string, $key) { 
    $result = ''; 
    for($i = 0; $i < strlen($string); $i++) { 
     $char = substr($string, $i, 1); 
     $keychar = substr($key, ($i % strlen($key))-1, 1); 
     $char = chr(ord($char) + ord($keychar)); 
     $result .= $char; 
    } 

    return base64_encode($result); 
} 

function enc_decrypt($string, $key) { 
    $result = ''; 
    $string = base64_decode($string); 

    for($i = 0; $i < strlen($string); $i++) { 
     $char = substr($string, $i, 1); 
     $keychar = substr($key, ($i % strlen($key))-1, 1); 
     $char = chr(ord($char) - ord($keychar)); 
     $result .= $char; 
    } 

    return $result; 
} 

再次,不要期望這是非常安全的。

+0

太酷了!謝謝 – trante 2012-06-01 17:22:19

+0

那麼urlencoding在加密函數開頭的字符串和解密函數開始處的urldecoding呢?其他結果可以包含「+」,「=」和「/」字符。 – trante 2012-06-01 18:07:05

+0

我想更好的辦法是,添加** $ string = urldecode($ string); **到** enc_decrypt **並添加**返回urlencode(base64_encode($ result)); **到** enc_encrypt ** – trante 2012-06-01 18:14:46

1

在我的Prestashop 1.4.4.1使用jlogsdon enc_encryptenc_decrypt包裹從Rijndael的類encryptdecrypt方法,女巫使用mcrypt的。 我沒有檢查enc_encryptenc_decrypt是否給出了與mcrypt_encryptmcrypt_decrypt相同的結果,但它們似乎在預置1.4.4.1中起作用。非常感謝。

相關問題