わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

MD5を求める

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;
}




実行結果








わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。