Garip kodu geri MCRYPT_DECRYPT

3 Cevap

Ben şifrelemek değerini dönerseniz o zaman bir işlevi çağırarak dize geri şifresini dizisini şifrelemek için çalıştı, ben bütün şifrelemek yaparsa doğru değeri döndürmek ve fonksiyonunda kez anda şifresini gibi oluyor, ancak, daha sonra işlevini çağırın yine bana biraz garip kodu dönecektir şifresini çözmek için.

Örnek 1:

public main()
{
    $dataArray = array("one"=>1, "two"=>2, "three"=>3);
    $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key);
    var_dump($a);
}

public function encryptDecryptInfo($text,$key)
{
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, 
    $text= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv);       
}

Bu bana string(27) "{"one":1,"two":2,"three":3}" olduğu doğru değeri dönecektir

Örnek 2:

public main()
{
    $dataArray = array("one"=>1, "two"=>2, "three"=>3);
    $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key,"encrypt");       
    $b = $this->encryptDecryptInfo($a,$this->key,"decrypt");
    var_dump($b);
}

public function encryptDecryptInfo($text,$key,$type)
{
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
    if($type == "encrypt")
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
    else return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv);      
}

Ben bu şekilde kodumu yaparsanız Ancak, bana bu gibi garip değeri dönecektir string(27) "�ÔérôŸY éXgíœÈÐN*é౜CµÖ".

Bunun neden Deos herkes biliyor musun? Şifrelemek ve kodlama şifresini hem de örnek 1 ve örnek 2 için aynıdır, ama neden yerine örneğin garip kodu dönecektir? Bu sorunu düzeltmek için herhangi bir şekilde?

3 Cevap

Bunu burada UTF için sorun göz kodlama olduğunu düşünüyorum - http://php.net/manual/en/function.base64-encode.php yorumlarda UTF8 güvenli bir kodlama fonksiyonu var.

Sol parametreleri geçen ve sağa kodlama değişiyor ve siz çeviri gevşek. PHP hoşgeldiniz :)

Sen şifre çözme için aynı IV kullanmanız gerekir. Sadece örneğin, şifreli veri ile birlikte kaydedin:

if($type == "encrypt") {
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
    return base64_encode($iv . '@@' .
        mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
} else {
    list($iv, $data) = explode('@@', base64_decode($text));
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CFB, $iv);      
}

Ben benzer bir sorunu vardı. Veritabanında ben aslında 16 karakter kurmak. Ben şifrelemek değişti, ben bütün şifreli değer kaydedilmiş değildi böylece numarasını değiştirmek için unuttum. Ben bu düzeltilmiş kez normal karakterleri döndü :)