[C言語] ファイルのSHA256ハッシュを取得するサンプルコード

sha256 プログラミング

ファイルのハッシュをSHA256で計算するには、ファイルを丸ごとバッファに格納してOpenSSLのSHA256()を呼んでも構いませんが、ファイルサイズが大きいとメモリが確保できない恐れがあります。
そういう場合には、少しずつバッファに入れてSHA256_Update()に渡すといいですね。

#include "openssl/sha.h"

#define BUFLEN 16384

/****************************************************************************/
/* ファイルのSHA256ハッシュを取得する                                       */
/****************************************************************************/
static short getSHA256hash(char *filePath)
{
	unsigned long	ulTotalFileSize;
	unsigned long	ulReadedFileSize, ulReadSize;
	SHA256_CTX		ctx256;
	unsigned char	buf[BUFLEN];
	unsigned char	ucHash[SHA256_DIGEST_LENGTH];
	int size;
	FILE *fp;
	fpos_t sz;
	int i;
	
	fp = fopen( filePath, "rb" );
	if( fp == NULL ){
		printf( "%sファイルが開けません\n", filePath );
		return -1;
	}

	/* ファイルのサイズを取得 */
	fseek( fp, 0, SEEK_END );
	fgetpos( fp, &sz );
	printf( "%s ファイルのサイズ: %d バイト", filePath, sz );
	
	ulTotalFileSize = sz;
	
	/* ファイルポインタを先頭に戻す */
	rewind( fp );

	SHA256_Init(&ctx256);

	/* ファイルをバッファに少しずつ読み込み、SHA256でハッシュ計算をおこなう */
	ulReadedFileSize = 0;
	while( ulReadedFileSize < ulTotalFileSize ) {
		if( (ulTotalFileSize - ulReadedFileSize) > BUFLEN ) {
			ulReadSize = BUFLEN;
		} else {
			ulReadSize = ulTotalFileSize - ulReadedFileSize;
		}
		if((size = read(&fp, buf, ulReadSize)) != ulReadSize)
		{
			printf("error : read file.(size=%d)\n",size);

			fclose(&fp);
			return -1;
		}
		ulReadedFileSize	+= ulReadSize;
		SHA256_Update(&ctx256, (unsigned char*)buf, ulReadSize);
	}
	fclose(&fp);
	
	if( ulReadedFileSize != ulTotalFileSize ) {
		printf("error : read file. ulReadedFileSize is wrong.\n");
		return -1;
	}
	
	SHA256_Final(ucHash, &ctx256);

	// ハッシュ値を出力
	for(i = 0; i < SHA256_DIGEST_LENGTH; i++) {
		printf("%02X",ucHash[i]);
	}
}

コメント

タイトルとURLをコピーしました