nem,nem2のデジタル署名はEd25519?

みなさんこんにちは。nem advent calendar 2019 12/20号です。

自分勝手ですがqiitaではなく自身のブログに記事書かせていただいたことお詫び申し上げます。

advent calendar記事としてどんなこと書くか悩みましたが、「わかりやすく優しい記事」というのはさすがNEM界隈、すでに充実しているので、マニアックな立ち回りでこの記事を書こうと思います。

さて、みなさんはnem,nem2のデジタル署名の方式をご存知でしょうか?

nem,nem2のデジタル署名の方式は「Ed25519」であると、公式にも書いてます。

https://nemtech.github.io/ja/concepts/cryptography.html

私も、説明にはよく「Ed25519」であると言います。

ですがこれ、めちゃめちゃ厳密に言うと、ちょっと違います。

Ed25519とは?

https://ed25519.cr.yp.to/

https://en.wikipedia.org/wiki/EdDSA#Ed25519

完結に言うと、Ed25519は、「ハッシュ関数としてSHA-512(SHA-2)を、楕円曲線としてCurve25519を利用したエドワーズ曲線デジタル署名アルゴリズムである」と言えます。

つまり、

「ハッシュ関数SHA-512はEd25519の構成要素である」

[latex]{Ed25519}\ni {SHA512}[/latex]

「楕円曲線Curve25519はEd25519の構成要素である」

[latex]{Ed25519}\ni {Curve25519}[/latex]

ということになります。

nemのハッシュ関数は?

さて、

https://nemtech.github.io/ja/concepts/cryptography.html

この記事を読むと、「nem2はKeccak512を、mijin2はSHA3-512を、ハッシュ関数として利用する」ということがわかります。

つまり、ハッシュ関数としてSHA-512(正確に言うとSHA2-512)を使わないのですね。

ということは、

[latex]{SHA512} \notin {nemの署名アルゴリズム} [/latex]

つまり

[latex]{nemの署名アルゴリズム}\neq {Ed25519}[/latex]

となります。

じゃあどう言えばいいか?

「Ed25519」というのは正確には「Curve25519 & SHA512」なるデジタル署名アルゴリズムであるいうことになります。

nemのデジタル署名方式は「広義のEd25519」といっても間違いではないが、

  • nem2は「Curve25519 & Keccak512」
  • mijin2は「Curve25519 & SHA-512」

なる独自の署名アルゴリズムを使っている、というのが正確であるということになります。

Ed25519を自称すると起こりうる問題

Ed25519を実装したソフトウェアライブラリがあります。NaCl(塩化ナトリウムの記号、つまり塩なのでソルトと読む)と呼ばれています。

http://tweetnacl.cr.yp.to/

https://www.npmjs.com/package/tweetnacl

「これらのライブラリを使って、nemのトランザクションのデジタル署名を実装するかー」と思い立つと、爆死します

https://github.com/nemtech/nem2-sdk-typescript-javascript/blob/master/src/core/crypto/nacl_catapult.ts

↑Ed25519のうち、ハッシュ関数をKeccak512やSHA3-512に置き換えたnem2-sdk独自実装のこのコードを転用しなければいけません。

なぜそんなめんどくさいことをやるのか?

みなさんここで思うと思います。

nemのコア開発者はなんでハッシュ関数部分を独自実装してまでハッシュ関数を違うものにしたかったの?

と。

おそらく、単純に、SHA2よりSHA3のほうが最新でセキュアで、SHA2よりも長く生きられる(SHA2はSHA3よりも、古くなってセキュリティ的に危険であると勧告される時期が間違いなくはやくくる)からだと考えられます。

nemコア開発者の意識の高さが読み取れます。