Шифрование Blowfish в php

Я пишу шифрование для своего приложения и веб-сайта, но я не знаю, как правильно зашифровать строку в php. Расшифровка уже сделана этим кодом:

function decrypt_blowfish($data,$key){
$iv=pack("H*" , substr($data,0,16));
$key=pack("H*" , $key);
$x =pack("H*" , substr($data,16)); 
$res = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $x , MCRYPT_MODE_CBC, $iv);
return $res;
}

Я пробовал с простым:

function encrypt_blowfish($data,$key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv);
    return $crypttext;
}

Но он возвращает странные символы ASCI вместо правильного кода иглобрюха. Может ли кто-нибудь объяснить мне, почему, и что я делаю неправильно? заранее спасибо

C.H.


person Charlie Hopperson    schedule 16.11.2012    source источник


Ответы (1)


function decrypt_blowfish($data,$key){
    $iv=pack("H*" , substr($data,0,16));
    $x =pack("H*" , substr($data,16)); 
    $res = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $x , MCRYPT_MODE_CBC, $iv);
    return $res;
}

function encrypt_blowfish($data,$key){
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC, $iv);
    return bin2hex($iv . $crypttext);
}

$string = encrypt_blowfish('hello world', 'abc123');
echo 'ENCRYPTED: ' . $string . "\n";
echo 'DECRYPTED: ' . decrypt_blowfish($string, 'abc123');

Попробуй это. В функции расшифровки вы конвертируете из шестнадцатеричного в двоичный, поэтому ожидается, что будет передано шестнадцатеричное значение. Ваша функция шифрования выводит двоичный код, поэтому вам нужно преобразовать его в шестнадцатеричный формат с указанным выше изменением.

person cryptic ツ    schedule 16.11.2012
comment
Спасибо. Это определенно решение части проблемы, но decrypt_blowfish(encrypt_blowfish(test,$blowfish_key),$blowfish_key); возвращает некоторые символы ASCI вместо строкового теста. Может быть, вы знаете, почему? - person Charlie Hopperson; 17.11.2012
comment
Вам нужно передать IV функции расшифровки, которая ожидает, что он будет объединен с зашифрованной строкой, поэтому... return bin2hex($iv . $crypttext); - person cryptic ツ; 17.11.2012
comment
Функция расшифровки также, похоже, преобразует ключ из шестнадцатеричного в двоичный. Это означает, что функция шифрования также должна принимать его как двоичный файл, вы делаете это или вводите символы ASCII? В противном случае ключи не будут совпадать. - person cryptic ツ; 17.11.2012
comment
Я исправил это и опубликовал как ответ. =о) - person cryptic ツ; 17.11.2012
comment
Как использовать это шифрование и дешифрование? функция шифрования ничего не возвращает. Требуются ли какие-либо другие файлы? - person alamelu; 22.08.2016