2012-03-22 23 views
0

Microsoft Visual C++ 6.0で開発された暗号化クラスがあり、正常に動作しています。 Microsoft Visual Studio 2008にコードを移行しましたが、このクラスは動作していますが、動作は異なります。VC++ 6.0とVS 2008のWindows暗号化サービスの相違点

特定の文字列を暗号化に渡すと、Visual C++ 6.0でコンパイルされたコードで生成された暗号化結果はVisual Studio 2008と異なり、発生しません。

なぜこのようなことが起こっているのか理解できたら助かりますか?使用されているWindowsサービスの

暗号化機能:

HCRYPTPROV hProv; 
HCRYPTHASH hHash; 
HCRYPTHASH hKey; 
CString strDataKey; 
DWORD dwSize; 
DWORD dwSizeEncrypted; 
BYTE * aszEncryptedBuffer; 

.........(その他のコード.....).......

CryptAcquireContext (& hProv, NULL, MS_STRONG_PROV, PROV_RSA_FULL, 0); 

CryptCreateHash (hProv, CALG_MD5, 0, 0, & hHash); 

CryptHashData (hHash, (const unsigned char *) strDataKey, dwSize, 0); 

CryptDeriveKey (hProv, CALG_RC2, hHash, CRYPTDERIVEKEY_FLAG, & hKey); 

aszEncryptedBuffer = new BYTE[dwSizeEncrypted]; 

memcpy(aszEncryptedBuffer,"Data to be encrypted",dwSize); 

CryptEncrypt (hKey, 0, TRUE, 0, aszEncryptedBuffer, & dwSize, dwSizeEncrypted); 
ありがとうございます。

答えて

2
CryptHashData (hHash, (const unsigned char *) strDataKey, dwSize, 0); 

これはあなたがそこにいるキラーキャストです。 CStringにはconst TCHAR*の変換演算子がありますが、const unsigned char*の変換演算子はありません。これは事故で動作する傾向がありますが、あなたは簡単に運が足りなくなります。キャスト付きの文字列表現から別の文字列表現に変換することはできません。たとえば、CStringがUnicode文字列を格納する場合です。これは、デフォルトのVS2008プロジェクト設定で行います。プロジェクト+プロパティ、一般、文字セットオプション。また、実際の変換を行うには、wcstombs()またはWideCharToMultiByte()も考慮してください。変換するコードページは結果の文字列に影響を及ぼします。

関連する問題