![](/img/trans.png)
[英]Issue encrypting with PHP (openssl_encrypt), then decrypting with JS (CryptoJS)
[英]OpenSSL C++ Encrypting Issue
所以我想做的是在我的PC上有一個基於時間的加密密鑰,並讓服務器生成相同的加密密鑰。 除PC上的密碼外,我已經成功完成了此操作。 我正在嘗試在服務器和PC上的AES-256-CBC中加密文本。 在我的電腦上,我有:
std::string Encrypt( const unsigned char *szPlainText, const unsigned char *szKey, unsigned char *szIV, const int iTextLength )
{
unsigned char szOutput[ 16 ];
memset( szOutput, 0, sizeof( szOutput ) );
std::string strOutput { };
AES_KEY enc_key;
AES_set_encrypt_key( szKey, 256, &enc_key );
AES_cbc_encrypt( szPlainText, szOutput, iTextLength, &enc_key, (unsigned char*)szKey, AES_ENCRYPT );
strOutput.append( reinterpret_cast< const char* >( szOutput ) );
return strOutput;
}
std::string MD5Hash( const unsigned char *szPlainText, const int iCharacters )
{
unsigned char chDigest[ MD5_DIGEST_LENGTH ] { };
MD5( szPlainText, iCharacters, reinterpret_cast< unsigned char* >( &chDigest ) );
char mdString[ 33 ];
for ( int i = 0; i < MD5_DIGEST_LENGTH; i++ )
sprintf( &mdString[ i * 2 ], "%02x", ( unsigned int )chDigest[ i ] );
return mdString;
}
int main( )
{
const unsigned char *szPlainText = reinterpret_cast< const unsigned char* >( "test" );
std::string strCipher { };
std::string strResponseBuffer { };
std::string strEncryptionKey { };
strEncryptionKey = MD5Hash( reinterpret_cast< const unsigned char* >( std::to_string( int( std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now( ).time_since_epoch( ) ).count( ) / 10 ) ).c_str( ) ), std::to_string( int( std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now( ).time_since_epoch( ) ).count( ) / 10 ) ).length( ) );
strEncryptionKey = strEncryptionKey.substr( 0, 16 );
std::cout << "Our enc key before encryption: " << strEncryptionKey << std::endl;
strCipher = Encrypt( szPlainText, reinterpret_cast< const unsigned char* >( strEncryptionKey.c_str( ) ), ( unsigned char* )( strEncryptionKey.c_str( ) ), strlen(reinterpret_cast< const char* >( szPlainText ) ));
curl_global_init( CURL_GLOBAL_ALL );
void *vCurl = curl_easy_init( );
curl_easy_setopt( vCurl, CURLOPT_URL, strURL );
//curl_easy_setopt( vCurl, CURLOPT_POSTFIELDS, strPostData.c_str( ) );
curl_easy_setopt( vCurl, CURLOPT_WRITEFUNCTION, WriteCallback );
curl_easy_setopt( vCurl, CURLOPT_WRITEDATA, &strResponseBuffer );
curl_easy_perform( vCurl );
curl_easy_cleanup( vCurl );
std::cout << "Our time: " << std::chrono::duration_cast< std::chrono::seconds >( std::chrono::system_clock::now( ).time_since_epoch( ) ).count( ) / 10 << std::endl;
std::cout << "Our enc key: " << strEncryptionKey << std::endl;
std::cout << "Our cipher: " << strCipher << std::endl;
std::cout << "Our plain text: " << szPlainText << std::endl;
std::cout << strResponseBuffer << std::endl;
system( "pause" );
return 0;
}
在PHP代碼所在的服務器上,我有:
<?php
$encmethod = "AES-256-CBC";
$plaintext = "test";
$time = microtime(false);
$time = substr($time, 11, strlen($time) - 11);
$time = floor($time / 10);
$enckey = substr(md5($time), 0, 16);
$cipher = openssl_encrypt($plaintext, $encmethod, $enckey, 0, $enckey);
die("Server's time: ".$time."\r\n"."Server's enc key: ".$enckey."\r\n"."Server's cipher: ".base64_decode($cipher)."\r\n"."Server's plain text: ".$plaintext);
?>
我確實意識到我正在使用IV的加密密鑰。 我使用Base64解碼加密,因為默認情況下,PHP的OpenSSL顯然對密碼進行了編碼。 我不明白的是我得到的輸出:
Our enc key before encryption: bd40cb464c24382e
Our time: 151693026
Our enc key: ▐τA╕cæσ@c¿svcî
Our cipher: ▐τA╕cæσ@c¿svcî╠╠╠╠HÇ~╖D·█
Our plain text: test
Server's time: 151693026
Server's enc key: bd40cb464c24382e
Server's cipher: nr"δµûa¢╝│)║\ß■V
Server's plain text: test
Press any key to continue . . .
這是每10秒更改一次,因為這是基於此。 似乎正在發生加密之后,我的加密密鑰正在加密,我不知道密碼應該是什么樣。 每次更改加密時,都會出現4個重復字符╠╠╠╠。 如果有人知道我在做什么錯,我將不勝感激。
該錯誤來自錯誤的投射。 在這行代碼中:
strCipher = Encrypt(
szPlainText,
reinterpret_cast< const unsigned char* >( strEncryptionKey.c_str( ) ),
( unsigned char* )( strEncryptionKey.c_str( ) ),
strlen(reinterpret_cast< const char* >( szPlainText ) ));
第二個演員陣容有點濫用。 顯然,該函數需要一個非常量緩沖區。 您應該在那里提供一個單獨的16字節工作數組的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.