在C ++中发出加密字符串并在PHP中解密

时间:2016-08-18 13:33:37

标签: php c++ mcrypt

我遇到了在C ++中加密字符串然后在PHP中解密的问题。在C ++方面,我认为一切都很顺利。下面是我的C ++代码。

unsigned char inbuffer[1024];

unsigned char outbuffer[1024];

unsigned char oneKey[] = "abc";
AES_KEY key;

AES_set_encrypt_key(oneKey, 128, &key);

string straa("hello world\n");
memcpy((char*)inbuffer, straa.c_str(), 13);

AES_encrypt(inbuffer, encryptedbuffer, &key);

LPCSTR pszSource = (LPCSTR)encryptedbuffer;
DWORD nDestinationSize;
if (CryptBinaryToString(reinterpret_cast<const BYTE*> (pszSource), strlen(pszSource), CRYPT_STRING_BASE64, nullptr, &nDestinationSize))
{
    LPTSTR pszDestination = static_cast<LPTSTR> (HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, nDestinationSize * sizeof(TCHAR)));
    if (pszDestination)
    {
        if (CryptBinaryToString(reinterpret_cast<const BYTE*> (pszSource), strlen(pszSource), CRYPT_STRING_BASE64, pszDestination, &nDestinationSize))
        {

            printf("OUT: %s", pszDestination); // Base64 encoded output of encrypted string


        }

    }
}

这是我的PHP代码:

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));
$out = openssl_decrypt(base64_decode("G6g0f/K7EzAw8fxn9BTFzw=="), 'AES-256-CBC', "abc", OPENSSL_RAW_DATA, $iv);

echo $out;

PHP代码没有输出。

C ++代码将输出以下内容:

OUT: G6g0f/K7EzAw8fxn9BTFzw==

1 个答案:

答案 0 :(得分:1)

CBC模式,PHP代码中使用的模式,确实需要iv,它必须与用于加密的模式相同,加密和解密的模式必须相同。对于CBC模式,您需要提供块大小的iv(AES为16字节)。加密密钥也应该是正确的大小。

未在C ++代码中明确设置iv,并且模式和填充使用默认值,驱动总是更好; icitly指定所有参数。对于每次加密,iv应该是随机的。

您可以考虑this SO answer,它是多语言和平台,并处理所有细节。