プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

MD2/MD4/MD5ハッシュの計算(128ビット)

2008年05月14日 09時12分00秒 | アルゴリズム関連

MD2/MD4/MD5ハッシュの計算は次の手順で行えます。(戻る)

  1. 鍵コンテナの取得(CryptAcquireContext)
  2. ハッシュ値の生成(CryptCreateHash)
  3. ハッシュ値の追加(CryptHashData)
  4. ハッシュ値の取得(CryptGetHashParam)
  5. ハッシュ値の破棄(CryptDestroyHash)
  6. 鍵コンテナの破棄(CryptReleaseContext)

プロトタイプ宣言

BOOL CryptAcquireContext(
    HCRYPTPROV*     phProv,
    LPCTSTR         pszContainer,
    LPCTSTR         pszProvider,
    DWORD           dwProvType,
    DWORD           dwFlags
);

BOOL CryptReleaseContext(
    HCRYPTPROV      hProv,
    DWORD           dwFlags
);

BOOL CryptCreateHash(
    HCRYPTPROV      hProv,
    ALG_ID          Algid,
    HCRYPTKEY       hKey,
    DWORD           dwFlags,
    HCRYPTHASH*     phHash
);

BOOL CryptDestroyHash(
    HCRYPTHASH      hHash
);

BOOL CryptHashData(
    HCRYPTHASH      hHash,
    BYTE*           pbData,
    DWORD           dwDataLen,
    DWORD           dwFlags
);

BOOL CryptGetHashParam(
    HCRYPTHASH      hHash,
    DWORD           dwParam,
    BYTE*           pbData,
    DWORD*          pdwDataLen,
    DWORD           dwFlags
);

使い方

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <wincrypt.h>

// マクロ関数
#define getStrMD2(s,hash)  getStrHash(s,hash,CALG_MD2)
#define getStrMD4(s,hash)  getStrHash(s,hash,CALG_MD4)
#define getStrMD5(s,hash)  getStrHash(s,hash,CALG_MD5)

// 文字列のMD2/MD4/MD5コードを計算
extern bool getStrHash( const char string[], char hash[16], ALG_ID algID )
{
    bool         bRet = false;
    HCRYPTPROV  hProv = NULL;   // 鍵コンテナ
    HCRYPTHASH  hHash = NULL;   // ハッシュ・オブジェクト
    LPBYTE      pbHash = (LPBYTE)hash;
    DWORD       dwHashLen = 16;
    
    ZeroMemory( pbHash, dwHashLen );
    
    if ( CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET) ){
        if ( CryptCreateHash(hProv,algID,0,0,&hHash) ){
            if ( CryptHashData(hHash,(LPBYTE)string,(DWORD)strlen(string),0) ){
                if ( CryptGetHashParam(hHash,HP_HASHVAL,pbHash,&dwHashLen,0) ){
                    bRet = true;
                }
            }
            CryptDestroyHash( hHash );
        }
        CryptReleaseContext( hProv, 0 );
    }
    return bRet;
}

// メイン関数
int main( void )
{
    char  hash[ 16 ];
    char  buff[ 256 ];
    char *find;
    
    while ( fgets(buff,sizeof(buff),stdin) != NULL ){
        if ( (find = strchr(buff,'\n')) != NULL ){
            *find = '\0';
        }
        if ( getStrMD5(buff,hash) ){
            for ( int i = 0 ; i < 16 ; i++ ){
                printf( "%02X", (BYTE)hash[i] );
            }
            printf( ":%s\n", buff );
        }
    }
    return 0;
}
  • 文字列を入力します。
  • またはパイプやリダイレクションを利用して入力させます。
  • 出力は128ビットの16進32桁と文字列が標準出力に表示されます。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ファイルのCRC32の計算 | トップ | ファイルのMD2/MD4/MD5ハッシ... »
最新の画像もっと見る

コメントを投稿

アルゴリズム関連」カテゴリの最新記事