別シリーズ記事(ESP32版MicroPython)にてMD5がサポートされてなかったです。もったいなくもSHA256ハッシュの計算を実施。別にMD5に何か格別の思い入れがあるわけではないのですが、一応計算方法を確認しておくかと。Linux上での作業なので大仰にもOpenSSLを利用です。あるもんは何でも使え?
※「ソフトな忘却力」投稿順 Index はこちら
※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。
Linux上であれば、わざわざプログラムを書かなくても md5sum という立派なコマンドがあるので、それで計算すれば済みます。自前で書いてみるのは忘却力に対する儚げな抵抗なんであります。
OpenSSLのMD5
お手元のLinux環境にはまず間違いなくOpenSSLなどインストールされており、それを呼び出せばMD5の計算などお茶の子サイサイだと思います。御本家ドキュメントが以下に
別シリーズの記事でもやったように、ハッシュを求めるデータがメモリ上にそろっていないのであれば、以下のような手順となります。
-
- MD5_CTX構造体確保する
- MD5_Init関数で上記構造体を初期化する
- MD5_Update関数でデータが到来するたび、チビチビと追加する
- MD5_Finalでハッシュのお答えを得る
しかしま、今回はコマンドライン引数として与えられた文字列のMD5を求めるという刹那的プログラムといたしました。それもあって、
そのものずばりのMD5関数
を利用させていただきました。メモリ上にデータがそろっているのならば、引数そろえて計算お願いすれば一撃でハッシュが求まるもの。
実験したソース
今回実験した「刹那的な」ソースが以下に。コマンドライン上の最初の引数に与えた文字列のMD5ハッシュを求め、16進数表示するもの。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/md5.h> int main(int argc, const char *argv[]) { if (argc < 2) { exit(EXIT_FAILURE); } size_t nLen = strlen(argv[1]); if (nLen < 1) { exit(EXIT_FAILURE); } unsigned char md[MD5_DIGEST_LENGTH]; MD5((unsigned char*)argv[1], (unsigned long)nLen, md); printf("MD5: "); for (int idx=0; idx<MD5_DIGEST_LENGTH; idx++) { printf("%02X", md[idx]); } printf("\n"); return EXIT_SUCCESS; }
ビルドして実行
ビルドのコマンドラインはこんな感じ。
$ gcc -g -O0 -Wall -o md5 md5.c -lcrypto
実際にビルドして「テキトー」な文字列を食わせて結果を求めている様子が以下に。
念のため、md5sumコマンドに同じ文字列を食わせてみた結果が以下に(上記の「テキトー」文字列は引数のテキストファイルの中に格納されとります。)
計算は出来てるみたいね。当たり前か。OpenSSLにお願いしているのだもの。割鶏牛刀。