logo
  • Home
  • ソフトウェア
    • アタッシェケースアイコン
      アタッシェケース

      ファイル暗号化ツール(Windows)

    • MarkDown#Editorアイコン
      MarkDown#Editor

      Markdownデュアルエディタ(Windows)

    • OutlineTextアイコン
      OutLineText

      Markdownによるアウトライナー(macOS)

    • OutlineTextアイコン
      BossComing

      一瞬で偽デスクトップに差し替え(Windows)

  • 開発ツール
    • Png2WinIco

      PNGからWindowsICOファイル生成(Windows)

    • SHCode-JP-Zen-Haku

      プログラミング用等幅フォント(Windows, macOS)

    • 秀丸エディタ・日付挿入マクロ

      柔軟な日付挿入可能な「秀丸エディタ」専用マクロ

    • 秀丸エディタ・Markdown強調表示定義ファイル

      「秀丸エディタ」専用の強調表示定義ファイル

  • このサイトについて
  • ブログ
  1. Home
  2. Blog
2019年07月02日 17:33 更新

SHA-3(Keccak)をC++に実装してみる

hibara

2012年10月30日 18:33 SHA-3 プログラミング

先だってNISTにより選定された SHA-3(Keccak)を「アタッシェケース」への実装の検討と、テストをしています。

ソースコードは以下にあり、

http://keccak.noekeon.org/files.html

今日時点での最新は、

Reference and optimized code in C

Version 3.2

となっているようです。

そこから必要なファイルを C++Builder 2010 のプロジェクトに追加して、正しい値を返すかテストしました。結論から言うと、うまくインプリメントできました。

こんな感じです。

ScreenShot00

その成果は、プロジェクトファイル一式としてGitHubにアップロードしておきます。

https://github.com/hibara/KeccakTest

ライセンスはGPLv3ライセンスとします。ご自由にどうぞ。

ソースはダウンロードして、C++Builder 2010 以降で読み込んでビルドすれば動くと思います。

とはいえ、ちょっとはまったので、補足としてここでメモしておきます。

おそらく一番シンプルに実装するには、以下のNIST用Interfaceのヘッダから使うのが良いでしょう。「Sources」フォルダーの中にある、

KeccakNISTInterface.h

です。

これをインクルードすると、SHA-1やMD5でやっていた流れでハッシュ値を出すことができますし、ソースを流用できます。

ただ、中身を見ると以下のように関数名がシンプルすぎて、C++Builder上では名前の衝突が起きます。

[cpp]

HashReturn Init(hashState *state, int hashbitlen);
HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen);
HashReturn Final(hashState *state, BitSequence *hashval);
HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval);

[/cpp]

ですので、僕の場合は、

[cpp]

#ifdef __cplusplus
extern "C" { // ←これも忘れずに
#endif

HashReturn KeccakInit(hashState *state, int hashbitlen);
HashReturn KeccakUpdate(hashState *state, const BitSequence *data, DataLength databitlen);
HashReturn KeccakFinal(hashState *state, BitSequence *hashval);
HashReturn KeccakHash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval);

#ifdef __cplusplus
}
#endif

[/cpp]

などと、関数名のリネームしています。

次に、出力できるbitオプションは以下の通りです。

  • SHA3-224(bit)
  • SHA3-256(bit)
  • SHA3-384(bit)
  • SHA3-512(bit)

これらの指定は、Initのときに引数として与えます。

なお、ソース冒頭の BitSequence result[64]; は最大の512bitを格納できるよう、多めにとってあるので、ここは32バイトでもかまいません。

ここでの例は、256bitで指定されていますが、GitHubに上げているものは変数指定となっています。

[cpp]

// Keccak result
BitSequence result[64]; //256bitなら32バイトでO.K.

// result hex string
char hashval[1024];
for (int i = 0; i < 1024; i++){
hashval[i] = NULL;
}

// Keccak return value
HashReturn ret;
// Keccak hash state structure
hashState st;

if ( (ret = KeccakInit(&st, 256)) != 0 ){
KeccakUpdate(&st, Edit1->Text.t_str(), Edit1->Text.Length()*8); // ←ビット! KeccakFinal(&st, result);
//文字列として出力する
BinToHex( result, hashval, 256);
return((String)hashval));
}

[/cpp]

このソースでの注意点は、Update関数のサイズ指定が“ビット”であること。ここを「バイト」にしていて小一時間ほど悩みました。まあ、元のソースコードにあるコメントアウトをよく読めってことなんですが・・・

ちなみに、ファイルの場合は、ほとんどSHA-1などの処理と変わりません。Updateにどんどん読み込んだバッファを詰め込んで、終わったらFinalで結果を出力する、という流れです。こちらはGitHubのコードを参照ください。

引き続きテストを続けます。

もしソース上で何かあれば、GitHub上からでもかまいませんので、ご一報くださると幸いです。

 


コメントする     返信コメントをキャンセル(閉じる)

メールアドレスが公開されることはありません。

これらの HTML タグと属性を使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。

HiBARA blog

日々の開発作業で気づいたこと共有を。同じところで躓いている人が、 検索で辿り着けたら良いな、というスタンスで記事を書くので不定期更新になります。

Post Categories

  • BizSpark (1)
  • C# (10)
  • C++ (2)
  • C++Builder (2)
  • C++Builder XE4 (1)
  • CoffeeScript (3)
  • DynamoDB (2)
  • Electron (1)
  • Inno Setup (3)
  • iPhone (1)
  • JavaScript (11)
  • jQuery (3)
  • Mac OSX (2)
  • Markdown (2)
  • MarkDown#Editor (5)
  • PHP (7)
  • Qt (5)
  • SHA-3 (2)
  • Smarty (2)
  • アタッシェケース (23)
  • など (2)
  • フォント (1)
  • プログラミング (33)
  • 未分類 (1)

Tags

  • DLL
  • exe
  • Inno Setup
  • NuGet
  • signtool
  • コードサイニング証明
  • サテライトアセンブリ
  • マージ
  • 光コラボレーション
  • 株式会社CL

© 2011-2023 M.Hibara

Facebook icon
Twitter icon
GitHub icon
Qiita icon