【发布时间】:2017-02-13 18:11:59
【问题描述】:
我正在尝试使用 OPENSSL 库对 C++ 库和 PHP 服务器之间的通信进行加密和解密。我想使用 Blowfish CBC 算法,但 C++ 代码和 PHP 代码之间的结果似乎不同。 C++ 代码取自这里:
这是 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 输出是这样的:
x9jDa2WMwvQ=
78396A446132574D7776513D
这是c++代码:
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";
C++ 输出是这样的:
EfRhhWqGmSQ=
11F461856A869924
有人可以帮我理解我做错了什么吗?任何帮助将不胜感激。
谢谢!
编辑 1: 在 jww 的 回答之后,我设法修复了 C++ 代码,并且效果很好。我错过了 EVP_CIPHER_CTX_set_key_length 但是,我无法让 PHP 代码返回相同的内容,最终我们决定转向 AES,它现在可以完美运行。谢谢!
【问题讨论】:
-
您可能想快速查看 OpenSSL wiki 上的 EVP Symmetric Encryption and Decryption。事实上,您可能应该使用经过身份验证的加密,因为它提供 机密性和真实性。请参阅 OpenSSL wiki 上的 EVP Authenticated Encryption and Decryption。
-
感谢您的建议。我会调查的。但就目前而言,要更改 PHP 端点以使用不同的加密方式并不容易。
-
Blowfish 不再被认为是安全的,甚至它的发明者现在也使用 AES。
标签: php c++ openssl blowfish cbc-mode