はじめに
はじめまして。NTTPCコミュニケーションズの渡辺と申します。普段はソフトウェアエンジニアとしてMaster'sONE CloudWAN®サービスの開発に取り組んでおります。
本記事では、NTTグループが現在中心となって研究をしている属性ベース暗号に関して説明と簡単な体験ができる方法を紹介します。
この記事は、属性ベース暗号に関して興味のある方、セキュリティ技術に関して広く興味を持たれている方を対象としています。
属性ベース暗号(Attribute based encryption)の概要
まず属性ベース暗号とはどういったものなのかについて説明します。本技術は2004年にAmit Sahai氏、Brent Waters氏から初めてその理論が提唱されました。属性ベース暗号は公開鍵暗号を前提とした技術となっています。公開鍵暗号は現在広く利用されているセキュリティ技術であり、この記事をお読みの方はすでにご存じの方も多いと思いますが、属性ベース暗号を理解するには公開鍵暗号に関して理解する必要があるため、簡単に公開鍵暗号について説明します。
公開鍵暗号
公開鍵暗号は秘密鍵と公開鍵と呼ばれる二つの鍵によって構成された暗号方式となります。何らかの情報をA、Bの二人の間で送信しようとした時に、情報をそのまま送信してしまうと、盗聴された場合、そのまま情報が抜き取られてしまいます。そこで、暗号化を施します。BがAに対して情報を送る場合、暗号化は次の手順で行われます。
- 情報の受信者Aが秘密鍵および公開鍵を作成します。この二つの鍵は作成する際に対となるようになっています。
- Aが情報の送信者Bに対して公開鍵を送付します。
- BがAから送付された公開鍵を使って、情報を暗号化します。
- BがAに暗号化した情報を送付します。
- Aが秘密鍵を用いてBから受け取った暗号を解いて(復号)、情報を取り出します。
公開鍵暗号については様々なウェブサイト、書籍で詳細な説明がされていまので、詳しく知りたい方は適宜他資料を参照してください。公開鍵暗号は現代の通信の安全性を支える上で欠かせない技術となっています。
もしBがAだけでなくCにも暗号化した情報を送る場合だったら、Bはどういった作業が必要でしょうか?一人だけならAの時と同様にCにも公開鍵を送ってもらい、その公開鍵Cを利用して情報を暗号化すればよさそうです。しかし、D・E・F...と送付しなければいけない人が増えてきてしまうと逐一公開鍵を発行するのは大変そうです。こういった複数の人に対して情報を共有する際に、誰がその情報を見ていいのか管理したい場合に属性ベース暗号が登場してきます。
属性ベース暗号
属性ベース暗号では上のような公開鍵暗号に"属性"と"属性を用いた閲覧制御"という機能を追加したものになります。この「属性」と呼ばれるものは、秘密鍵を持つユーザーの「属性」を指します。上のケースでいえばAの属性をAの秘密鍵に持たせることを指します。また属性ベース暗号では、情報を暗号化する際にどの属性であればその暗号を復号することができるかを指定することができます。つまり属性ベース暗号は従来の公開鍵暗号のセキュリティに「属性を指定したアクセスコントロール」を機能として追加したものになります。秘密鍵に設定できる属性は非常に様々であり、例えば「経理部」「開発部」といった所属を表すもの、「課長」「一般社員」といった職位を表すものも指定できます。また鍵が発行された「時間」、「位置情報」といったものまで鍵を作成する際にうまく情報を取り扱うことで設定できます。
属性を用いた閲覧制御
次に"属性を用いた閲覧制御"について説明します。公開鍵暗号では公開鍵を用いて元の情報に暗号化を施します。属性ベース暗号も公開鍵を用いて暗号化を施すところは変わりませんが、その際に「復号条件」を設定できます。復号条件は属性を用いて設定することになります。元の情報を暗号文から取り出そうとする際に、秘密鍵を使用することになりますが、属性ベース暗号ではその秘密鍵に設定されている属性が復号条件を満たすかを判定します。例えば、復号条件に「部署=経理部」と設定すれば、「経理部」の属性が設定された秘密鍵でしか閲覧することができません。また「職位≧課長」と設定することによって一般社員の方は閲覧ができなくなります。また上で上げた二つの条件を組み合わせて復号条件を設定することもでき、「部署=経理部 and 職位≧課長」とすれば、経理部の課長職以上の職位の方のみ閲覧できるようになりますし、「部署=経理部 or 職位≧課長」と設定した場合は、経理部の方は一般社員の方も含め見られますし、課長職以上の方であればどの部署でも見られるようになります。このように、属性ベース暗号を用いることで多彩な条件を設定することができ、閲覧権の制御とセキュリティの両立をすることができます。
さて、これらの機能ですが公開鍵暗号とホワイトリストと呼ばれる誰が見ていいかのリストを用いることによって、同じ動作を実現している場合が多いです。クラウドなどにファイルを配置し、アカウント情報をもとに制御をするような場合となります。ホワイトリスト方式の場合、素のファイルを配置して、閲覧する際にアカウントで制御をする場合が大半ですが、属性ベース暗号の場合、ファイルレベルでの暗号化が施されているため、そのファイルをそのままインターネット上に配置した場合でもセキュリティが確保できます。
属性ベース暗号の技術
技業LOGですので、少し踏み込んで属性ベース暗号を実際にはどのような手順で暗号化が行われるのかを説明します。数学的な箇所はここで説明するには量が多いのと、筆者自身理解しきれてないので割愛いたします。
公開鍵暗号は受信者Aと送信者Bの二人によって成立する暗号方式でしたが、属性ベース暗号はA、Bそして鍵の発行機関Xの三つの要素が登場します。この三つの要素をもとに、次の手順を踏んで属性ベース暗号を実施します。
- Xが暗号化にしようする公開鍵(PK)とマスター秘密鍵(MK)を作成します。マスター秘密鍵はこの後秘密鍵の作成に利用されます。
- 情報を受信したいAが自分の属性をXに伝えます。XはAから受け取った属性をもとにマスター秘密鍵を使って、A用の秘密鍵を作成し、この秘密鍵をAに送信します。
- 情報を送信したいBがXから出力された公開鍵を用いて情報の暗号化を行います。この際、すでに説明したように情報の復号条件を指定して暗号化を実施します。
- 暗号化された情報をBがAに対して送信し、Aがその情報の復号化を試みます。ここでXから発行されたA用の秘密鍵を用います。ここで秘密鍵に設定された属性がBの設定した復号条件を満たす時に復号が可能となります。
このようにして、実際には属性ベース暗号が実施されます。注目すべきは鍵発行機関が必要になる点で、この要素を用意しなければならないことが公開鍵暗号に比べて属性ベース暗号が難しくなる点かと思います。また鍵発行機関が生成するマスター秘密鍵は対となる公開鍵で生成したすべての暗号文を復号できてしまうことから厳重な管理が求められる点も注意が必要です。
冒頭にも述べましたが、属性ベース暗号は2004年に理論が提唱されました。そこから、長い間をかけてこの技術は改善が重ねられてきています。暗号の高速化や復号条件の指定の精度向上、IoTデバイスとのコラボレーションの研究など、様々な面から研究が行われたことで実際に利用が広まりつつあります。例として、シドニー工科大学で商用利用の開始が行われています。
https://www.nikkei.com/article/DGXZRSP661331_Z20C23A8000000/
属性ベース暗号を試してみたい人に
ここまで読んでくださり、少しでも属性ベース暗号に興味を持ってもらったかた向けに属性ベース暗号を実行する方法があるため紹介いたします。OSSのライブラリを利用して実施します。こちらの手法は主にこの記事に基づいて行っているため、わからなくなってしまった場合は適宜参照してください。
PBC ライブラリを使ってIBE暗号、ABE暗号を試してみる。 #暗号理論 - Qiita
実施環境は
Ubuntu20.04
を使用しています。Mac OSについては今回動作確認をしていないため、WSLまたはLinux環境を用意してお試しください。
有志の方が作成してくれた実行パッケージを利用するためCharmと呼ばれる暗号化ツールのパッケージを利用します。
Charmを用意するためにLinuxにGitを導入する必要があります。こちらのページを参考にGitを導入してください。
Git - Gitのインストール (git-scm.com)
Charmのリポジトリは次になります。
GitHub JHUISI/charm: Charm: A Framework for Rapidly Prototyping Cryptosystems
このCharmパッケージは次の三つのパッケージに対して依存しているため、この三つのパッケージをインストールしてください。
- PBC
- GMP5.x
- OPENSSL
の三つになります。
詳しくはこちらのページのUbuntu13.04に記載のコマンドを参照してください。
https://github.com/JHUISI/charm/blob/dev/doc/source/install_source.rst
PBCはビルドで詰まる場合が多く、PBCのホームページから直接ダウンロードすることも可能です。
pbcのダウンロードを行います。
$ wget http://crypto.stanford.edu/pbc/files/pbc-0.5.14.tar.gz
ダウンロードしたファイルの解凍を行います。
$ tar zxvf pbc-0.5.14.tar.gz
解凍したファイルのディレクトリに入り、ビルドを行います。
$ ./cofigure $ make $ sudo make install
Charmが依存しているパッケージをダウンロードできたら、Charmのビルドを行います。この作業についても上であげたCharmのページを参考にしてください。
Charmのテストを通過することが確認されたら、有志の属性ベース暗号パッケージを利用してみます。
GitHub - sagrawal87/ABE: Attribute-based Encryption
このGitリポジトリをクローンするとABEとよばれるファイルが生成されています。このABEディレクトリに入り、ABE/sample配下にあるmain.pyを実行してみます。おそらくエラーコードが出るかと思うので、親ディレクトリにmain.pyを移動します。
$ mv main.py リポジトリのホームディレクトリ
Main.py内部のdebugをTrueにすると結果が出力されるかと思います。
本コードではメッセージとして送られているのは共通鍵と呼ばれる暗号化を施すための鍵が送られています。送信者、受信者間で暗号、復号を共通の鍵で行い、暗号化された情報を共有する方式です。共通鍵の配送にのみ属性ベース暗号を使っているかたちです。このような暗号方式をハイブリット暗号といったりします。Main.py内部で属性情報および復号条件を設定している箇所があるので適宜書き換えてみると理解に役立つかと思います。
おわりに
本記事では属性ベース暗号の簡単な解説と属性ベース暗号を試す方法の紹介を行いました。
属性ベース暗号はまだまだ発展途上の技術であり、様々な応用先が試されています。
もし本記事をもとに属性ベース暗号に興味を持ってくださいますと幸いです。
-
※Linuxは、Linus Torvalds 氏の日本およびその他の国における登録商標または商標です。
技業LOG
NTTPCのサービスについても、ぜひご覧ください