ソフトな忘却力(34) MD5ハッシュを計算してみる、OpenSSL

Joseph Halfmoon

別シリーズ記事(ESP32版MicroPython)にてMD5がサポートされてなかったです。もったいなくもSHA256ハッシュの計算を実施。別にMD5に何か格別の思い入れがあるわけではないのですが、一応計算方法を確認しておくかと。Linux上での作業なので大仰にもOpenSSLを利用です。あるもんは何でも使え?

※「ソフトな忘却力」投稿順 Index はこちら

※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。

Linux上であれば、わざわざプログラムを書かなくても md5sum という立派なコマンドがあるので、それで計算すれば済みます。自前で書いてみるのは忘却力に対する儚げな抵抗なんであります。

OpenSSLのMD5

お手元のLinux環境にはまず間違いなくOpenSSLなどインストールされており、それを呼び出せばMD5の計算などお茶の子サイサイだと思います。御本家ドキュメントが以下に

MD5

別シリーズの記事でもやったように、ハッシュを求めるデータがメモリ上にそろっていないのであれば、以下のような手順となります。

    1. MD5_CTX構造体確保する
    2. MD5_Init関数で上記構造体を初期化する
    3. MD5_Update関数でデータが到来するたび、チビチビと追加する
    4. 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

実際にビルドして「テキトー」な文字列を食わせて結果を求めている様子が以下に。md5Results

念のため、md5sumコマンドに同じ文字列を食わせてみた結果が以下に(上記の「テキトー」文字列は引数のテキストファイルの中に格納されとります。)md5sumResult

計算は出来てるみたいね。当たり前か。OpenSSLにお願いしているのだもの。割鶏牛刀。

ソフトな忘却力(32) NCURSES、New Cursesライブラリを使ってみる へ戻る