C言語でlibmdを用いてSHA256を計算する

提供: C言語入門
移動: 案内検索
スポンサーリンク

C言語では、libmd(Message Digest Library, メッセージダイジェストライブラリ)を用いて、SHA256を計算できます。もちろん、OpenSSLでも計算できます。

読み方

libmd
りぶ えむでぃー
Message Digest Library
めっせーじ だいじぇすと らいぶらり

概要

このページの例は、 libmd が利用できる環境で有効です。FreeBSDでは、デフォルトで利用できます。

SHA256_Data()を利用するとメッセージから簡単にダイジェストを得ることができます。

char    *msg    = "data";
char    output[SHA256_DIGEST_STRING_LENGTH] = { 0 };
(void) printf ("%s\n", SHA256_Data (msg, strlen(msg), output) );

まとまったデータがなく、ストリーム的にダイジェストを計算しなければならないなら、以下のように書けます。

unsigned char   buf[SHA256_DIGEST_LENGTH] = { 0 };
SHA256_CTX      ctx;
 
SHA256_Init (& ctx);
SHA256_Update (& ctx, msg, strlen (msg) );
SHA256_Final (buf, &ctx);

画面に表示するために、アスキーのダイジェストが欲しいなら、 SHA256_Final()の代わりに、SHA256_End()を呼びます。SHA256_end()は、SHA256_Final()のラッパー関数になります。64+'\0'の65バイトの配列が必要です。

unsigned char   buf[SHA256_DIGEST_LENGTH] = { 0 };
char    output[SHA256_DIGEST_STRING_LENGTH] = { 0 };
 
SHA256_CTX      ctx;
 
SHA256_Init (& ctx);
SHA256_Update (& ctx, msg, strlen (msg) );
SHA256_End (&ctx, output);

ヘッダファイル

以下は、sha256.hからの抜粋になります。

FreeBSD release/10.0.0/lib/libmd/sha256.h
#ifndef _SHA256_H_
#define _SHA256_H_
 
#include <sys/types.h>
 
typedef struct SHA256Context {
        uint32_t state[8];
        uint32_t count[2];
        unsigned char buf[64];
} SHA256_CTX;
 
__BEGIN_DECLS
void    SHA256_Init(SHA256_CTX *);
void    SHA256_Update(SHA256_CTX *, const void *, size_t);
void    SHA256_Final(unsigned char [32], SHA256_CTX *);
char   *SHA256_End(SHA256_CTX *, char *);
char   *SHA256_File(const char *, char *);
char   *SHA256_FileChunk(const char *, char *, off_t, off_t);
char   *SHA256_Data(const void *, unsigned int, char *);
__END_DECLS
 
#endif /* !_SHA256_H_ */

ソースコード

// Last update: 2011/06/16 23:30:24
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
 
#include <sha256.h>
 
#ifndef SHA256_DIGEST_LENGTH
#define SHA256_DIGEST_LENGTH 32
#endif
#define SHA256_DIGEST_STRING_LENGTH 65
 
int
main (int argc, char *argv[])
{
        char    *msg    = "data";
 
        unsigned char   buf[SHA256_DIGEST_LENGTH] = { 0 };
        char    output[SHA256_DIGEST_STRING_LENGTH] = { 0 };
 
        SHA256_CTX      ctx;
 
        SHA256_Init (& ctx);
        SHA256_Update (& ctx, msg, strlen (msg) );
        SHA256_End (&ctx, output);
 
        (void) printf ("%s\n", output);
        (void) printf ("%s\n", SHA256_Data (msg, strlen(msg), output) );
 
        exit (EXIT_SUCCESS);
}

コンパイル

cc sha256.c -lmd

実行例

$ ./a.out
3a6eb0790f39ac87c94f3856b2dd2c5d110e6811602261a9a923d3bb23adc8b7
3a6eb0790f39ac87c94f3856b2dd2c5d110e6811602261a9a923d3bb23adc8b7
$ sha256 -s data
SHA256 ("data") = 3a6eb0790f39ac87c94f3856b2dd2c5d110e6811602261a9a923d3bb23adc8b7

関連項目




スポンサーリンク