「C言語でlibmdを用いてSHA256を計算する」の版間の差分
提供: C言語入門
(ページの作成:「C言語では、libmd(Message Digest Library, メッセージダイジェストライブラリ)を用いて、SHA256を計算できます。もちろん、OpenSSLでも...」) |
(相違点なし)
|
2015年8月16日 (日) 02:17時点における最新版
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