IOTAの署名とその承認の仕組み:ハッシュ関数 Curl

  • 6
    いいね
  • 1
    コメント

IOTAの電子署名と承認の仕組みについて図示されたものを日本語訳してみました。
なお、公式ソースコードはGitHubで公開されており、本記事はSigningという部分を図示したものです。JavaScriptならsigning.js、JavaならSigning.javaから見ることができます。(その他もありますがここでは省略)

追記:9/2,2017
本記事のIOTAのアルゴリズムは旧式のCurlというハッシュ関数について説明したものです。およそ一ヶ月前にIOTAはKerlというハッシュ関数に衣替えしました。ここoldSigning.jsでは旧式のCurl、singing.jsでは新たにKerlが使用されていることが分かると思います。
ただ、IOTA全てにKerlが採用された訳でなく、まだCurlは別の部分で使用されている様子。その早見表はこちら

アドレス生成

① シードから生成されるPrivate Keyを用意する。
② Private Keyを27個のセグメントに分割し、それぞれのセグメントごとを27回ハッシュ関数に通す。('L'は最後のセグメントのインデックス。)
③ ②で生成されたすべてのセグメントをまとめてハッシュ関数に通す。その結果得られた値をdigestと呼ぶ。
④ digestを2回ハッシュ関数に通す。その結果得られた値をアドレスと呼ぶ。

signature1-2.png

署名の方法

① Private Keyを(アドレス生成と同じやり方で)27個のセグメントに分割する。
② セグメントごとにN回分ハッシュ関数に通す。

Nの求め方
署名されるデータのi番目のTryteを見る(A〜Zか9、の全27種類)
9ならNi=27、AならNi=26(=27-1)、BならNi=25(=27-2) ... ZならNi=1(=27-26)としてi番目のセグメントをNi回ハッシュ関数に通す。

③ そのようにしてハッシュ関数で置き換えられたセグメントたちを順番に横に並べたものをSignature(署名)とする。

signature2-2.png

承認の方法(アドレスの逆生成)

① 署名を(アドレス生成と同じやり方で)27個のセグメントに分割する。
② セグメントごとにM回分ハッシュ関数に通す。

Mの求め方(基本的にNと類似)
署名されたデータのi番目ののTryteを見る(A〜Zか9、の全27種類)
AならMi=1、BならMi=2 ... としてi番目のセグメントをMi回ハッシュ関数に通す。
③ ②で生成されたすべてのセグメントをまとめてハッシュ関数に通す。その結果得られた値をdigestと呼ぶ。
④ digestを2回ハッシュ関数に通す。その結果得られた値がアドレスと一致したら承認される。

signature3-2.png

アドレス再利用のリスク

先日、IOTA Supportからウォレットの"タングルにアタッチ"機能とセキュリティの関係について記事が出され、個人的にいくつかの疑問点が払拭されたので説明する。まず、署名方法の中のNの求め方を見てほしい。

Nの求め方
署名されるデータのi番目のTryteを見る(A〜Zか9、の全27種類)
9ならNi=27、AならNi=26(=27-1)、BならNi=25(=27-2) ... ZならNi=1(=27-26)としてi番目のセグメントをNi回ハッシュ関数に通す。

データ内i番目のトライトがZなら、Prvate Key内のi番目のセグメントにハッシュ関数は一回しか通されない。もし、署名されるデータがZを多く含むものであった場合、電子署名はPrivate Keyの部分的な生データを総当たりで求められてしまう。つまり、同じアドレスを再利用して様々なデータにそのアドレス名義で署名を行えば行うほど、生のPrivate Keyがハックされてしまう可能性が高まる。

これを防ぐためにすることは、一度使ったアドレスは二度と使わない。ウォレットでお金を受け取る際は、"タングルにアタッチ(Attach to Tangle)"ボタンを押し、今まで使ったアドレスではない新しいアドレスに送金してもらうようにすることだ。

個人的にはどうしてこのような脆弱性のある署名アルゴリズムになったのか疑問が残る。
(追記)
utamaroさんからコメントいただいた通り、このアルゴリズムは量子コンピューティング耐性を持ち、かつ、小さなデバイスでも走らせられる要求メモリ量という利点が存在する。

最後に

 IOTAに関する話題は公式Slackで、また、日本人のチャンネルも#japaneseから参加できます(私は先週から参加したばかりの新参ですが偉そうにここで宣伝しちゃいます)。IOTAは本格運用が始まったとも準備段階とも言えないような、とにかく芽を出したばかりの暗号通貨ですが、ビットコインが今もめているスケーラビリティを解決する可能性を秘めたTangleという新しい分散型台帳を提案しており、今後も注視していきたいですね。

 ソースコードはあまり読めないので、基本的にはこれを日本語訳して本記事を書きました。そのため、間違いなどがある場合がございます。その際は、コメント欄でもTwitterからでもご報告お願いいたします。