2012年7月10日火曜日

OpenSSLを使ったファイルハッシュ計算方法

openssl.exeを使った方法と、C++でライブラリを呼び出して計算してみる2パターンをメモ。

【SHA1の場合】
openssl.exe sha1 [ファイル名]

Visual Studioを使ったC++(コンソールアプリ)のサンプルは下記のような感じになります。
サンプルではWindows8 RP版のisoイメージのファイルハッシュを計算してテストしてみました。
#include "stdafx.h"
#include "Hash.h" // OpenSSLのinclude

#define TARGET_FILE "E:\\Windows8-ReleasePreview-32bit-Japanese.iso"
#define BUFSIZE (1024 * 16) // OpenSSLの定義と同じ

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char sha1hash[SHA_DIGEST_LENGTH] = { 0 };
    unsigned char buf[BUFSIZE];
    DWORD dwStart = 0;
    DWORD dwEnd = 0;

    // SHA1 using OpneSSL lib
    printf("Calculate file hash for sha1\n");
    dwStart = ::GetTickCount();
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    CFile file(TARGET_FILE, CFile::modeRead);
    UINT nRead = 0;

    do{
        nRead = file.Read(buf, BUFSIZE);
        if(nRead > 0){
            SHA1_Update(&ctx, buf, nRead);
        }
    }while(nRead == BUFSIZE);
 
    SHA1_Final(sha1hash, &ctx);
    dwEnd = ::GetTickCount() - dwStart;

    printf("SHA1(%s)= ", TARGET_FILE);
    for(int i = 0; i < SHA_DIGEST_LENGTH; i++){
        printf("%.2x",sha1hash[i]);
    }
    printf("\n");
    printf("Elapsed Time(ms) = %d\n", dwEnd);

    return 0;
}
※OpenSSLライブラリとは、stdafx.hで下記のように書くか、設定画面でリンクの設定をしてください。
// OpenSSL lib
#pragma comment(lib, "openssl/lib/libeay32.lib")
#pragma comment(lib, "openssl/lib/ssleay32.lib")

【MD5の場合】
openssl.exe md5 [ファイル名]

ソースの方はMD5_~に変わるだけで、あとは全く同じなので省略します。

0 件のコメント:

コメントを投稿