両方ともOPENSSLライブラリを使用してC++ライブラリとPHPサーバ間の通信を暗号化および復号化しようとしています。私はBlowfish CBCアルゴリズムを使用したいと思いますが、C++コードとPHPコードの結果が異なるようです。 C++コードは、ここから取り出される:OPENSSL Blowfish CBC暗号化はPHPとは異なります。
<?php
function strtohex($x)
{
$s='';
foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return($s);
}
$encryptedMessage = openssl_encrypt("input", "BF-CBC", "123456", 0, "initvect");
echo $encryptedMessage;
echo "\n";
echo strtohex($encryptedMessage);
PHP出力これで:
bool do_encrypt(const char *in, unsigned char *out, int *outlen, unsigned char *key, unsigned char *iv)
{
int buflen, tmplen;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_bf_cbc(), nullptr, key, iv);
if (!EVP_EncryptUpdate(&ctx, out, &buflen, (unsigned char*)in, strlen(in)))
{
return false;
}
if (!EVP_EncryptFinal_ex(&ctx, out + buflen, &tmplen))
{
return false;
}
buflen += tmplen;
*outlen = buflen;
EVP_CIPHER_CTX_cleanup(&ctx);
return true;
}
unsigned char output[2048] = { 0 };
int outLen;
auto result = do_encrypt("input", output, &outLen, (unsigned char*)"123456", (unsigned char*)"initvect");
BIGNUM *outputStr = BN_new();
BN_bin2bn(output, outLen, outputStr);
cout << base64_encode(output, outLen) << "\n";
cout << BN_bn2hex(outputStr) << "\n";
:
x9jDa2WMwvQ=
78396A446132574D7776513D
これは、C++コードである
これは、PHPコードであります
C++出力は次のとおりです。
EfRhhWqGmSQ=
11F461856A869924
誰かが私が間違っていることを理解できるように助けてくれますか?どんな助力も非常に高く評価されます。
ありがとうございます!
編集1: 私はJWWの答えた後にC++コードを修正するために管理し、それがうまく働きました。 EVP_CIPHER_CTX_set_key_lengthしかし、私はPHPコードを返すことはできませんでしたが、最終的にはAESに移行することにしましたが、今は完璧に動作します。ありがとう!
あなたは、OpenSSLのwiki上の[EVP対称の暗号化と復号化](http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)で簡単に見を持っている場合があります。実際には、機密性と信頼性の両方を提供するため、おそらく認証された暗号化を使用するべきです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww
提案していただきありがとうございます。私はそれを調べます。しかし今のところ、PHPエンドポイントを変更して別の暗号化を使用するのは容易ではありません。 – saw66
ブローフィッシュはもはやセキュアであるとは考えられていません。その発明者でもAESが使用されています。 – zaph