ペアリング暗号ライブラリmclを使ってみる


初めに

インターネット上で安全な通信をするために、秘密鍵暗号や公開鍵暗号が使われています。最近では公開鍵暗号の一つとして楕円曲線暗号が使われることも多くなりました。

ここではそういった通常の公開鍵暗号ではなく、より機能が豊富なペアリング暗号を扱います。身近にペアリング暗号が使われているケースはまだあまりないのですが、いろいろ面白いことが実現できます。最近では完全匿名性を実現したと言われる分散型暗号通貨Zcashで使われています。
ペアリング暗号の詳細は拙著『クラウドを支えるこれからの暗号技術』(秀和システム)をごらんください。

さて、ペアリングは面白いことができるのですが実装するのが難しくなかなか気軽に試せません。そこで使いやすくて高速なライブラリmclを開発しています。そのライブラリを試してみようというのが本題です。

ちなみに「高速」と書きましたが、どれぐらいの性能かというとx64環境では筑波大学が開発しているTEPLAというペアリングライブラリの5.6倍ぐらい速いです。詳細はBenchmarkをごらんください。

mclのインストール

mclがサポートする環境

  • 64bit Windows上のVisual Studio
  • Linux上のx86/x64用gcc, clang
  • Linux上の32bit/64bit ARM用gcc

mclはC++で記述されています。WindowsやLinuxのx64だけでなくスマートフォンなどで普及が進んでいる64bit ARMにも対応しているのが特長です。

チェックアウト

Linuxの場合、次のディレクトリ構成でチェックアウトしてください。

git clone https://github.com/herumi/mcl

外部ライブラリとしてOpenSSLGMPを使います。
apt install libgmp-dev(Ubuntuの場合)などとしてインストールしてください。

Windowsでは外部ライブラリのコンパイル済みバイナリを提供しています。上記workディレクトリで

git clone https://github.com/herumi/cybozulib_ext

としてください。

ビルドとテスト

Linuxなら

cd mcl
make test

でビルドとテストが走ります。最後にall unit tests are OKと表示されればOKです。

Windowsでは

cd mcl
mklib

でライブラリが作られます。そしてたとえば

mk -s test/bn_test.cpp

とするとbin/bn_test.exeができるので実行してください。特にエラー表示がなければOKです。

ペアリングの最小サンプル

無事ビルドができれば簡単なサンプルsample/pairing.cppを動かしてみます。
以下はコードの抜粋です。

pairing.cpp
#include <mcl/bn256.hpp>

using namespace mcl::bn256;

const char *aa = "12723517038133731887338407189719511622662176727675373276651903807414909099441";
const char *ab = "4168783608814932154536427934509895782246573715297911553964171371032945126671";
const char *ba = "13891744915211034074451795021214165905772212241412891944830863846330766296736";
const char *bb = "7937318970632701341203597196594272556916396164729705624521405069090520231616";

int main()
{
    initPairing();
    G1 P(-1, 1);
    G2 Q(Fp2(aa, ab), Fp2(ba, bb));

    const mpz_class a = 123;
    const mpz_class b = 456;
    Fp12 e1, e2;
    pairing(e1, P, Q);
    G2 aQ;
    G1 bP;
    G2::mul(aQ, Q, a);
    G1::mul(bP, P, b);
    pairing(e2, bP, aQ);
    Fp12::pow(e1, e1, a * b);
    printf("%s\n", e1 == e2 ? "ok" : "ng");
}

Linuxなら

make bin/pairing.exe

bin/pairing.exeが、Windowsなら

mk -s sample/pairing.cpp

bin/pairing.exeができます。実行してエラーがなければOKです。

ライブラリを使う

mclライブラリを使う場合はmcl/include/をインクルードパスに、mcl/lib/をリンカーのパスに指定してlibmcl.amcl.libをリンクしてください。

まとめ

今回はペアリングライブラリmclのインストールとサンプルの動かし方を説明しました。
次回以降ではライブラリの説明をしたいと思います。