3

Blowfish で暗号化されたデータを復号化するための PHP スクリプトを作成することになっています。

復号化のために受信しているデータは、別のアプリケーションによって暗号化されています (アクセスできません)。

javascript スクリプト (blowfish.js) を使用してチェックすると、データは正常に復号化されます。

PHPでデータを復号化するにはどうすればよいですか?

mcryptPHPで関数を試しました。同じコードを使用して暗号化および復号化すると、コードは正常に機能します。暗号化されたコードを (別のアプリで) 復号化すると、ジャンクになります。

どのモードを設定すればよいかわかりません。

mcryptを使用せずに、以下のコードまたはPHP BlowFishコードを提案できますか?

<?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/>";

?>
4

3 に答える 3

1

ここには、実装が簡単な優れたソリューションがあります。

www.codewalkers.com: Blowfish を使用した暗号化と復号化

于 2012-01-19T19:27:35.200 に答える
1

復号化するときに使用するは、データを暗号化するときに使用する初期化ベクトル$ivと同じである必要があります。独自の関数は、IV を暗号文の先頭に追加することによってこの情報を転送します ( ) が、他のアプリケーションはそうしない場合があります。return $iv.$crypttext;

他のアプリが使用する IV を見つけて、それを独自のコードに渡す必要があります。decrypt関数は暗号文の先頭から IV を読み取るため、前に追加するだけです。

encryptまた、関数と他のアプリケーションで同じテキストを暗号化して、少しテストすることもできます。出力の長さが同じでない場合 (自分の出力の方が長い場合)、アプリは暗号文内に IV を含めていないため、別の方法でこの情報を取得する必要があります。

もちろん、使用する暗号モード (CFB) は、コードと他のアプリで同じでなければなりません。

于 2011-04-07T12:41:02.823 に答える