LoginSignup
5
6

More than 5 years have passed since last update.

[C++]HMACをC++で書いてみた

Last updated at Posted at 2014-07-04

C++でHMAC(メッセージ認証のための鍵付ハッシング)の実装を書いてみました。
Githubにコードを置いたので、実際のコードはここを見てください。
https://github.com/chromabox/hashcodes

ライセンスは一応MITライセンスになってます。
一応テストはしましたが、未保証です。

事の経緯

HMACの実装自体も、ライブラリも巷にあふれているんですが、HMACの仕様書を見てちょっと真面目に書き直したくなったので、せっかくだからテンプレートなどを使って書き直してみたかったという感じです。

周りに読める人が少ないということで、あまりテンプレートは使ってこなかったのですが、たまに使わないと忘れてしまうので、今回は良い題材になりました。

使い方

今のところg++にのみ対応しています。STLも必須です。
コンパイルオプション等はMakefileを見てください。

使い方はテストコードを見れば大体分かるのですが、HMAC-SHA1を算出する場合は次のようにします。

#include "hmac.hpp"

void test()
{
    using namespace std;
    string digest;
    string key("keykey");
    string data("abcdefg");
    hmac_sha1::create_digest(data.c_str(),data.size(),key.c_str(),key.size(),digest);
    cout << digest << endl;
}

ダイジェストはstring以外にもstd::uint8_t型を渡すことも出来ますが、hmac_sha1の場合はsha1::DIGEST_LENGTHのサイズ以上でないといけません。
また、同様にMD5用の実装であるhmac_md5もあります。

おまけとして、sha1、md5の値算出も出来ます。
sha1値を求める場合は以下のようにします。

#include "sha1.hpp"

void test()
{
    using namespace std;
    sha1 hasher;
    string digest;
    string data("abcdefg");

    hasher.update(data.c_str(),data.size());
    hasher.final(digest);
    cout << digest << endl;
}

TODO

  • SHA2xx系ハッシュ関数の追加
  • 他の言語に対する実装(手始めにpureなCかな)
  • MSVCでコンパイルできるようにする

参考文献など

RFC 2104 HMAC:メッセージ認証のための鍵付ハッシング (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2104JA.html

RFC 1321 MD5 メッセージダイジェストアルゴリズム (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC1321JA.html

RFC 3174 US Secure Hash Algorithm 1 (SHA1) (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC3174JA.html

RFC 2202 HMAC-MD5 と HMAC-SHA-1 のためのテストケース (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2202JA.html

boostのSHA1の実装
boost/uuid/sha1.hpp

linuxのSHA1の実装
linux/crypto/sha1_generic.c

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6