C言語でMD5ダイジェスト計算のサンプル

top20190606_md5

同じフォルダにあるtarget.isoというファイルのMD5ダイジェストを計算するサンプルです。よくわかってない部分もありますが、とりあえずメモ程度に残しておきます。

ソースコード

短いので添付せずにそのまま。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

int main(){

	FILE *fp;
	MD5_CTX c;
	unsigned char md[MD5_DIGEST_LENGTH];
	char mdString[(MD5_DIGEST_LENGTH*2)+1];
	int i, r, bytes;

	/* ここを大きくすると高速になる代わりにメモリを消費する  */
       /* 体感としては512を超えたあたりからはそんなに変わらない */
	char buffer[8192];

	/* MD5用の何かを初期化する(わかってない */
	r = MD5_Init(&c);

	/* ファイルをオープン */
	fp = fopen("target.iso", "r");

        /* オープンできなかった場合エラーにする */
	if(fp == NULL ){
		printf("Cannot file open\n");
		return(-1);
        }

	/* packet_sizeずつ読み込んでMD5を更新して行く */
        while( ( bytes = fread(buffer, 1,  sizeof(buffer), fp)) != 0 ){
                r = MD5_Update(&c, buffer, bytes);
        }

	/* 読取り完了、クローズ */
        fclose(fp);

        r = MD5_Final(md, &c);

	/* MD5を文字列に変換する */
        for(i = 0; i < MD5_DIGEST_LENGTH; i++)
                sprintf(&mdString[i * 2], "%02x", (unsigned int)md[i]);

	/* 表示部分 */
        printf("MD5: %s\n", mdString);

        return(0);

}

コンパイル・実行方法

md5.cにソースを保存した場合、下記の方法でコンパイルします。

$ gcc -lcrypto md5.c

特に引数はないので、実行はシンプルに

$ ./a.out

top20190606_md5