CryptCreateHashを使用して、MD5を求めます。
#include <tchar.h> #include <iostream> #include <string> #include <shlobj.h> #include <comdef.h> #include <comutil.h> #include <conio.h> std::string CreateMD5 ( std::string strString ) { _asm int 3; std::string strMD5; DWORD dwDataLen = strString.size() + 1; HCRYPTPROV hProv = NULL; if( !CryptAcquireContext( &hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0 ) ) { // デフォルトキーコンテナを作る if(!CryptAcquireContext( &hProv, // ハンドルが戻る NULL, // CSPを利用するユーザー名 // ログインユーザーの場合は NULL MS_DEF_PROV, // MicrosoftのデフォルトCSP PROV_RSA_FULL, // 利用方法(ハッシュ計算や案儀化の計算) CRYPT_NEWKEYSET)) // キーコンテントへのアクション { std::wcout << L"CryptAcquireContext()失敗" << std::endl; } } else { HCRYPTHASH hHash; if( !CryptCreateHash( hProv, // CSPのハンドル CALG_MD5, // ハッシュ計算のアルゴリズム 0, // 0, // &hHash )) { // ハッシュオブジェクトのハンドル } else { if( !CryptHashData( hHash // ハッシュオブジェクトのハンドル , (const BYTE*)strString.c_str() // 計算の元となるパスワードデータ , dwDataLen // パスワードのバイト長 , 0 )) // デフォルトのCSPを使う場合は、0 // m_passWord ="ERR_CryptHash"; { } else { HCRYPTKEY hKey; if( !CryptDeriveKey( hProv, // CSPのハンドル CALG_RC4, // 暗号化のアルゴリズム hHash, // 鍵に使用するハッシュオブジェクト CRYPT_EXPORTABLE, // 鍵の長さ &hKey )) // 暗号化用の鍵が戻る // m_passWord ="ERR_DeriveKey"; { } else { BYTE baBuf[ 256 ]; if( !CryptEncrypt( hKey, // 暗号化鍵オブジェクトのハンドル 0, // 暗号化だけの場合は、0 TRUE, // 大量のデータを扱う場合のみ変更 0, // baBuf, // データのポインタ &dwDataLen, // 平文のデータ長 _countof( baBuf ) )) // バッファのバイト長 // m_passWord ="ERR_Encrypt"; { } else { strMD5 = std::string( (CHAR*)baBuf, (CHAR*)&baBuf[ dwDataLen ] ); } } CryptDestroyKey(hKey); // 暗号化キー } } CryptDestroyHash(hHash); // Hash } CryptReleaseContext(hProv, 0); // CSP return strMD5; // 暗号化パスワードまたはエラーコード } /* MD5を求める */ int _tmain ( int argc , _TCHAR* argv[] ) { std::cout << CreateMD5("abcde") << std::endl; }