私が取り組んでいるプロジェクトでは、NSIS と PHP の間で互換性のある方法で Blowfish を使用して文字列を暗号化および復号化する必要があります。
現時点では、NSIS 用のBlowfish++ プラグインmcrypt
と PHP のライブラリを使用しています。問題は、両方で同じ出力を生成できないことです。
NSIS Blowfish++ プラグインから始めましょう。基本的に API は次のとおりです。
; Second argument needs to be base64 encoded
; base64_encode("12345678") == "MTIzNDU2Nzg="
blowfish::encrypt "test@test.com***" "MTIzNDU2Nzg="
Pop $0 ; 0 on success, 1 on failure
Pop $1 ; encrypted message on success, error message on failure
それが CBC、ECB、CFB などであるかどうかについての言及はありません。私は、ほとんど文書化されていないソースを読んでもわかるほど Blowfish に精通していません。ECB は IV を必要としないとPHPmcrypt
のドキュメントに書かれているので、ECB だと思います。
また、ソース コードを読んで、Blowfish++ プラグインが 2 番目の引数を Base64 でデコードして暗号化することも知りました (理由はわかりません)。また、Base64 でエンコードされた文字列も返します。
PHP 側では、基本的に次のコードを使用して暗号化しています。
$plainText = "test@test.com***";
$cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');
$iv = '00000000'; // Show not be used anyway.
$key = "12345678";
$cipherText = "";
if (mcrypt_generic_init($cipher, $key, $iv) != -1)
{
$cipherText = mcrypt_generic($cipher, $plainText);
mcrypt_generic_deinit($cipher);
}
echo base64_encode($cipherText);
ただし、これらすべてを実行すると、それぞれから次の出力が得られます。
NSIS: GyCyBcUE0s5gqVDshVUB8w==
PHP: BQdlPd19zEkX5KT9tnF8Ng==
私は何を間違っていますか?NSIS プラグインは ECB を使用していませんか? そうでない場合、それは IV に何を使用していますか?