SHA-256 ハッシュ計算

RAND_bytes() で作ったデータを入力しても,コードの正確性は測れない.次の情報を入手したから,これに沿う結果が得られるかを確認する.RFC を参照するべきだろうが,test vector を記載した文書を見つけることができなかった.

SHA-256 Test Vector

The Wikipedia entry for the SHA-256 algorithm provides a SHA-256 text vector for "The quick brown fox jumps over the lazy dog". The hash value (in hexidecimal format) is:

        d7a8fbb3 07d78094 69ca9abc b0082e4f 8d5651e4 6d3cdb76 2d02d0bf 37c9e592
http://www.chilkatsoft.com/js-sha256-hash.asp

コーディング

OpenSSL でのハッシュ計算は,データを一辺に入力するほか,逐次入力することもできる.両方を試すコードを書いた.

sha256.cpp
#ifdef _DEBUG
#pragma comment(lib, "libeay32MDd.lib")
#pragma comment(lib, "ssleay32MDd.lib")
#else
#pragma comment(lib, "libeay32MD.lib")
#pragma comment(lib, "ssleay32MD.lib")
#endif

#include <openssl/sha.h>
#include <openssl/rand.h>
#include <stdio.h>
#include <stdlib.h>

void showHexString( unsigned char *hex, size_t n )
{
	for ( size_t i = 0; i < n; i++ )
	{
		printf("%02x", hex[i] );
	}
	printf("\n");
}

int main ( int argc, char *argv[] )
{
	// ハッシュを求めたいデータ
	char *textvector = "The quick brown fox jumps over the lazy dog";

	// ハッシュ計算
	unsigned char hash[SHA256_DIGEST_LENGTH];
	SHA256( (unsigned char *)textvector, strlen(textvector), hash );
	showHexString( hash, SHA256_DIGEST_LENGTH ); // 表示

	// ハッシュを求めたいデータを逐次送る場合
	char *fragment[] = {"The ","quick ","brown ","fox ","jumps ","over ","the ","lazy ","dog"};
	size_t numword = sizeof(fragment) / sizeof(fragment[0]); // 分割個数

	// ハッシュ計算
	SHA256_CTX ctx;
	SHA256_Init( &ctx );
	for ( size_t i = 0; i < numword; i++ )
	{
		SHA256_Update( &ctx, (unsigned char *)fragment[i], strlen(fragment[i]) );
	}
	int ret = SHA256_Final( hash, &ctx );
	showHexString( hash, SHA256_DIGEST_LENGTH ); // 表示

	return 0;
}

結果

SHA256_Final() は ret に 1 を返した.画面表示は次のとおり.

d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

冒頭で示した情報と一致した.使い方を間違えているなんて事はないようだ.