Как расшифровать используя алгоритм Blowfish в php? - PullRequest
3 голосов
/ 07 апреля 2011

Я должен написать скрипт PHP для расшифровки зашифрованных данных Blowfish.

Данные, которые я получаю для расшифровки, зашифрованы другим приложением (у меня нет доступа к нему).

Данные хорошо расшифровываются, когда я проверяю их с помощью сценария JavaScript (blowfish.js).

Как мне расшифровать данные в php?

Я пробовал функцию mcrypt в PHP. Код работает нормально, если я шифрую и дешифрую, используя один и тот же код. Если я расшифрую зашифрованный код (в другом приложении), это приведет к ненужному.

Не знаю, какой режим установить.

Может кто-нибудь предложить код, приведенный ниже, или код PHP BlowFish без использования mcrypt?

<?php

class Encryption
{
    static $cypher = 'blowfish';
    static $mode   = 'cfb';
    static $key    = '12345678';

    public function encrypt($plaintext)
    {
        $td = mcrypt_module_open(self::$cypher, '', self::$mode, '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, self::$key, $iv);
        $crypttext = mcrypt_generic($td, $plaintext);
        mcrypt_generic_deinit($td);
        return $iv.$crypttext;
    }

    public function decrypt($crypttext)
    {
        $plaintext = "";
        $td        = mcrypt_module_open(self::$cypher, '', self::$mode, '');
        $ivsize    = mcrypt_enc_get_iv_size($td);
        $iv        = substr($crypttext, 0, $ivsize);
        $crypttext = substr($crypttext, $ivsize);
        if ($iv)
        {
            mcrypt_generic_init($td, self::$key, $iv);
            $plaintext = mdecrypt_generic($td, $crypttext);
        }
        return $plaintext;
    }
}



$encrypted_text = Encryption::encrypt('this text is unencrypted');
 echo "ENCRY=".$encrypted_text;echo "<br/>";

////I am using this part(decryption) coz data already encryption 
// Encrypted text from app 
$encrypted_text = '29636E7ADA7081E7F5D73121C45E20D5';
// Decrypt text
$decrypted_text = Encryption::decrypt($encrypted_text);
  echo "ENCRY=".$decrypted_text;echo "<br/>";

?>

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

$iv, который вы используете при дешифровании, должен совпадать с Вектором инициализации , используемым при шифровании данных. Ваши собственные функции передают эту информацию, добавляя IV к зашифрованному тексту (return $iv.$crypttext;), но другое приложение может этого не делать.

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

Кроме того, вы можете немного протестировать, зашифровав тот же текст с помощью вашей функции encrypt и другого приложения. Если выходные данные не имеют одинаковую длину (ваш собственный размер больше), то приложение не включает в себя IV внутри зашифрованного текста, и вы должны получить эту информацию другим способом.

И, конечно, используемый режим шифрования (CFB) должен быть одинаковым между вашим кодом и другим приложением.

1 голос
/ 19 января 2012
0 голосов
/ 07 апреля 2011

Существует библиотека PEAR для создания надстроек blowfish, которые позволяют вам выбирать погоду для использования MCRYPT Libs или чисто нативного PHP:

Библиотеку можно посмотреть здесь: Crypt_Blowfish 1.1.0RC2

Выберите файл PHP.php, который покажет вам исходный код, чтобы сделать это жестко запрограммированным в нативном PHP.

...