SHA-256 ハッシュ計算
RAND_bytes() で作ったデータを入力しても,コードの正確性は測れない.次の情報を入手したから,これに沿う結果が得られるかを確認する.RFC を参照するべきだろうが,test vector を記載した文書を見つけることができなかった.
http://www.chilkatsoft.com/js-sha256-hash.aspSHA-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
コーディング
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
冒頭で示した情報と一致した.使い方を間違えているなんて事はないようだ.