2016-08-18 57 views
1

我遇到了一個問題,它在C++中加密我的字符串,然後在PHP中解密。在C++方面,我認爲一切都很順利。以下是我的C++代碼。發出C++中的加密字符串並在PHP中解密

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== 
+0

我在這裏沒有幫助,因爲我沒有C++經驗,但我很感興趣(如果你有時間解釋),你在使用C++和PHP的組合嗎? –

+0

當然我有時間。我正在創建一個登錄客戶端,它將客戶端傳輸到AES中的服務器數據,以防止人們查看網絡流量。 –

+0

使用HTTPS保護客戶端到服務器的通信。 – zaph

回答

1

CBC模式,在PHP代碼中使用的模式,確實需要的IV,並且它必須是相同的所述一個用於加密,也模式加密和解密必須相同。對於CBC模式,您需要提供一個尺寸爲iv的塊(對於AES爲16字節)。加密密鑰也應該是正確的大小。

iv未在C++代碼中顯式設置,並且模式和填充使用默認值,所以最好逐出;只能指定所有參數。每個加密應該是隨機的。

你可能會考慮RNCryptor,這是多語言和平臺,並處理所有的細節。

相關問題