以下、本発明の一実施形態について説明する。本実施形態では、非同期型のIDベース多者間鍵交換プロトコルを実現する鍵交換システム1について説明する。非同期型の多者間鍵交換プロトコルでは、鍵(グループ鍵)の交換を行う際にグループ内の全員がオンラインである必要がない。このため、非同期型のIDベース多者間鍵交換プロトコルは、同期的なアプリケーション(例えば、電話やVPN(Virtual Private Network)、オンラインチャット等)だけでなく、例えば、メールやファイル共有、オフラインチャット等の非同期的なアプリケーションにも適用することができる。なお、グループとは、鍵交換を行うユーザの集合のことである。
また、上述したように、IDベースで鍵交換プロトコルを実現することにより、公開鍵基盤が不要となる。このため、ユーザと公開鍵とを公開鍵基盤で紐付けたり、ユーザが証明書管理を行ったりすること等が不要となる。
なお、非同期型の多者間鍵交換プロトコルの従来技術として、以下の参考文献1に記載されている技術が知られている。
[参考文献1]
Colin Boyd, Gareth T. Davies, Kristian Gjosteen, Yao Jiang, "Offline Assisted Group Key Exchange", International Conference on Information Security 2018, volume 11060 of LNCS, pp.268-285, Springer, 2018.
しかしながら、この方式では、グループオーナーであるユーザは他のグループユーザ数の分だけ公開鍵暗号による暗号化と署名を実行しなければならないため、計算量・通信回数がグループユーザ数に比例してしまう。
上記の参考文献1に記載されている多者間鍵交換プロトコルは公開鍵ベースである(つまり、公開鍵基盤が必要となる)。公開鍵暗号方式をIDベース暗号方式に置き換えることでIDベースの非同期多者間鍵交換プロトコルが実現できるが、安全性の面で問題が生じる。非特許文献1では、KGC(Generation Center)と補助サーバ間の運用主体が一体であるような、両者の秘密情報が互いに共有されている状況であっても、ユーザ間で生成したグループ鍵を一切知ることができないように設計されていた。しかし、参考文献1の方式で単純にIDベース暗号方式を適用する場合では、KGCと補助サーバ間の運用主体が一体であると、グループ鍵が自明に計算されてしまう。このため、非特許文献1で達成されている上記の安全性と同等の安全性を担保することが必要である。
<全体構成>
まず、本実施形態に係る鍵交換システム1の全体構成について、図1を参照しながら説明する。図1は、本実施形態に係る鍵交換システム1の全体構成の一例を示す図である。
図1に示すように、本実施形態に係る鍵交換システム1には、複数の通信端末10と、鍵交換補助サーバ20と、鍵生成サーバ30とが含まれる。また、各通信端末10と、鍵交換補助サーバ20と、鍵生成サーバ30とは、例えば、インターネット等の通信ネットワークNを介して通信可能に接続される。
通信端末10は、グループ鍵の交換を行うユーザが利用する各種端末である。通信端末10としては、例えば、PC(パーソナルコンピュータ)やスマートフォン、タブレット端末、電話機等を用いることが可能である。ただし、これらに限られず、通信端末10として、任意の端末を用いることが可能である。
本実施形態では、グループの作成者(つまり、鍵交換を開始するユーザ)を「イニシエータ」、当該グループに属する他のユーザを「レスポンダ」と呼び、イニシエータが利用する通信端末10を「イニシエータ端末11」、レスポンダが利用する通信端末10を「レスポンダ端末12」とも表す。また、レスポンダ端末12はn台(nは1以上の整数)であるものとして、各レスポンダ端末12の各々を区別する場合には「レスポンダ端末12i」(i=1,・・・,n)と表す。なお、イニシエータは、例えば、「グループオーナー」等と称されてもよい。
鍵交換補助サーバ20は、通信端末10の間での鍵交換を補助するサーバ装置である。鍵交換補助サーバ20は、例えば、イニシエータ端末11やレスポンダ端末12でグループ鍵を生成するための公開鍵を生成したり、イニシエータ端末11やレスポンダ端末12とのセッションを識別するセッションIDを生成したりする。なお、グループ鍵は「セッション鍵」と称されることもある。以降では、グループ鍵をセッション鍵と表す。
鍵生成サーバ30は、KGCとして機能するサーバ装置である。鍵生成サーバ30は、例えば、公開パラメータやマスター秘密鍵を生成したり、通信端末10や鍵交換補助サーバ20のIDに対応する部分公開鍵や部分秘密鍵を生成したりする。ここで、IDとは、各通信端末10やそのユーザ、鍵交換補助サーバ20を識別する識別情報のことである。各通信端末10と鍵交換補助サーバ20にはIDが事前に割り振られているものとする。
なお、IDとしては任意の識別情報を使用することができるが、例えば、ユーザのメールアドレス、SNS(Social Networking Service)のユーザID、電話番号、住所、氏名、マイナンバー、DNA等の生体情報、IP(Internet Protocol)アドレス、MAC(Media Access Control)アドレス、URL(Uniform Resource Locator)、クレジットカード番号、機器や装置の製造固有番号等を使用することが可能である。
<非同期型のIDベース多者間鍵交換プロトコルの概要>
ここで、本実施形態に係る非同期型IDベース多者間鍵交換プロトコルの概要について説明する。なお、本実施形態に係る非同期型IDベース多者間鍵交換プロトコルは、後述するように、証明書不要署名方式(CS: Certificateless Signature)と、プロキシ再暗号化付き証明書不要サインクリプション方式(CSPRE: Certificateless Signcryption with Proxy Re-Encryption)又は証明書不要プロキシ再暗号化方式(CPRE: Certificateless Proxy Re-Encryption)とを用いて構成される。そこで、本実施形態に係る非同期型IDベース多者間鍵交換プロトコルを証明書不要非同期多者間鍵交換プロトコル(CAGKE: Certificateless Asynchronous Group Key Exchange Protocol)と呼ぶことにする。
CAGKEにおけるプロトコル参加者は、通信端末10、鍵交換補助サーバ20及び鍵生成サーバ30である。以降では、全ての通信端末10の集合(つまり、全ユーザの集合)をWとして、通信端末10をU∈W、鍵交換補助サーバ20をSとも表記する。また、通信端末10とそのユーザとを同一視して、通信端末10をユーザとも表す。更に、イニシエータであるユーザをI、レスポンダであるユーザをi∈{1, …, n}とも表す。なお、1台の通信端末10を複数のユーザが利用している場合は、これらのユーザ同士は異なるユーザ(例えば、U1,U2∈W)として区別される。
CAGKEにおけるプロトコルセットアップは、以下の5つのアルゴリズム(CAGKE.Setup, CAGKE.PKeyExt, CAGKE.SetSV, CAGKE.SetSSK, CAGKE.SetSPK)で構成される。これらのアルゴリズムのうち、CAGKE.Setup及びCAGKE.PKeyExtの2つのアルゴリズムは鍵生成サーバ30が実行し、CAGKE.SetSV, CAGKE.SetSSK及びCAGKE.SetSPKの3つのアルゴリズムは通信端末10及び鍵交換補助サーバ20が実行する。
CAGKE.Setup(1κ)→(params, msk):セキュリティパラメータ1κを入力として、公開パラメータparamsとマスター秘密鍵mskとを出力する確率的アルゴリズム。
CAGKE.PKeyExt(params msk, ID)→(ppkID, pskID):公開パラメータparamsとマスター秘密鍵mskと自身(つまり、通信端末10又は鍵交換補助サーバ20)のID IDとを入力として、このIDに対応する部分公開鍵ppkIDと部分秘密鍵pskIDとを出力する確率的アルゴリズム。
CAGKE.SetSV(params, ID)→svID:公開パラメータparamsと自身のID IDとを入力として、このIDに対応する秘密値svIDを出力する確率的アルゴリズム。
CAGKE.SetSSK(params, pskID, svID)→sskID:公開パラメータparamsと部分秘密鍵pskIDと秘密値svIDとを入力として、自身のIDに対応する長期秘密鍵sskIDを出力する確率的アルゴリズム。
CAGKE.SetSPK(params, ppkID, svID)→spkID:公開パラメータparamsと部分公開鍵ppkIDと秘密値svIDとを入力として、長期公開鍵spkIDを出力する確率的アルゴリズム。
上記のセットアップにより、各通信端末10は、自身のID IDに対応する長期秘密鍵及び長期公開鍵のペア(sskID, spkID)を得る。同様に、鍵交換補助サーバ20も、自身のID IDに対応する長期秘密鍵及び長期公開鍵のペア(sskID, spkID)を得る。
なお、以降では、通信端末10を表すUと、この通信端末10のID IDとを同一視する。同様に、鍵交換補助サーバ20を表すSと、そのID IDとを同一視する。これにより、例えば、Uの長期秘密鍵及び長期公開鍵のペア(sskID, spkID)は(sskU, spkU)と表される。同様に、例えば、Sの長期秘密鍵及び長期公開鍵のペア(sskID, spkID)は(sskS, spkS)と表される。
次に、各通信端末10(各U∈W)は、他の通信端末10の公開鍵{spkV}V∈Wを使って、鍵交換前に以下の事前計算アルゴリズムCAGKE.PreCompを実行する。
CAGKE.PreComp(params, sskU, spkU, {spkV}V∈W\{U})→precompU,W
この事前計算アルゴリズムCAGKE.PreCompの出力precompU,Wは、鍵交換補助サーバ20に保存される。このように、各通信端末10は、鍵交換前に、他の通信端末10の数に計算量が比例する事前計算アルゴリズムを1回実行する。
続いて、各通信端末10は鍵交換補助サーバ20と複数回通信を行い、セッション鍵keyを生成する。この通信が行なわれる中で、鍵交換補助サーバ20は、precompU,Wを用いる。これにより、複数の通信端末10間で、このセッション鍵keyを用いた暗号化通信を行うことが可能になる。
ここで、各通信端末10と鍵交換補助サーバ20には、セッション毎にインスタンスが割り当てられるものとする。インスタンスとは、メモリ上に展開されたデータ集合のことである。例えば、同一の通信端末10を複数のユーザで利用する場合には、ユーザ毎に異なるインスタンスが割り当てられる。
各通信端末10のs∈N番目のインスタンスをπU sと表記することにする。同様に、鍵交換補助サーバ20のs∈N番目のインスタンスをπS sと表記することになる。これらの各インスタンスで扱う変数は、インスタンスの実行状態status∈{unused, active, accepted, rejected}、役割role∈{initiator, receiver}、セッション参加ユーザpid⊆W、セッションID sid、一時秘密鍵esk, セッション鍵keyである。ここで、インスタンスの初期の実行状態はunusedであり、セッション開始時に、各通信端末10や鍵交換補助サーバ20は、インスタンスを呼び出して、その実行状態をactiveにする。また、セッション鍵keyが生成された場合、その後、インスタンスの実行状態をacceptedにする。一方で、セッション鍵keyの生成に失敗した場合は、インスタンスの実行状態をrejectedにする。
なお、2つのユーザU,V∈WのインスタンスπU s及びπV s´がパートナーであるとは、セッション参加ユーザpidとセッションID sidとが等しいときを言う。これは、2つのユーザU,Vが同一グループに属しており、共にオンラインであることを意味している。鍵交換補助サーバ20のインスタンスについても同様である。
<ハードウェア構成>
次に、本実施形態に係る鍵交換システム1に含まれる通信端末10、鍵交換補助サーバ20及び鍵生成サーバ30のハードウェア構成について説明する。通信端末10、鍵交換補助サーバ20及び鍵生成サーバ30は一般的なコンピュータ(情報処理装置)のハードウェア構成により実現可能であり、例えば、図2に示すコンピュータ500のハードウェア構成により実現可能である。図2は、コンピュータ500のハードウェア構成の一例を示す図である。
図2に示すコンピュータ500は、ハードウェアとして、入力装置501と、表示装置502と、外部I/F503と、通信I/F504と、プロセッサ505と、メモリ装置506とを有する。これら各ハードウェアは、それぞれがバス507を介して通信可能に接続されている。
入力装置501は、例えば、キーボードやマウス、タッチパネル等である。表示装置502は、例えば、ディスプレイ等である。なお、コンピュータ500は、入力装置501及び表示装置502のうちの少なくとも一方を有していなくてもよい。
外部I/F503は、外部装置とのインタフェースである。外部装置には、記録媒体503a等がある。なお、記録媒体503aとしては、例えば、CD(Compact Disc)、DVD(Digital Versatile Disc)、SDメモリカード(Secure Digital memory card)、USB(Universal Serial Bus)メモリカード等が挙げられる。
通信I/F504は、通信ネットワークNに接続するためのインタフェースである。プロセッサ505は、例えば、CPU(Central Processing Unit)やGPU(Graphics Processing Unit)等の各種演算装置である。メモリ装置506は、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ等の各種記憶装置である。
本実施形態に係る鍵交換システム1に含まれる通信端末10、鍵交換補助サーバ20及び鍵生成サーバ30は、例えば、図2に示すコンピュータ500のハードウェア構成を有することにより、後述する各種処理を実現することができる。なお、図2に示すコンピュータ500のハードウェア構成は一例であって、他のハードウェア構成であってもよい。例えば、コンピュータ500は、複数のプロセッサ505を有していてもよいし、複数のメモリ装置506を有していてもよい。
<機能構成>
次に、本実施形態に係る鍵交換システム1に含まれる通信端末10、鍵交換補助サーバ20及び鍵生成サーバ30の機能構成について、図3を参照しながら説明する。図3は、本実施形態に係る鍵交換システム1の機能構成の一例を示す図である。
≪通信端末10≫
図3に示すように、通信端末10は、セットアップ部111と、事前計算部112と、鍵交換部113とを有する。これら各部は、例えば、通信端末10にインストールされた1以上のプログラムがプロセッサに実行させる処理により実現される。
また、通信端末10は、記憶部121を有する。記憶部121は、例えば、通信端末10のメモリ装置等を用いて実現可能である。
記憶部121には、各種情報(例えば、長期秘密鍵及び長期公開鍵のペア(sskU, spkU)やインスタンスπU s等)が記憶される。
セットアップ部111は、セットアップ処理を実行する。すなわち、セットアップ部111は、CAGKE.SetSV, CAGKE.SetSSK及びCAGKE.SetSPKを実行する。
事前計算部112は、事前計算処理を実行する。すなわち、事前計算部112は、CAGKE.PreCompを実行する。
鍵交換部113は、鍵交換補助サーバ20と複数回通信を行うことで、セッション鍵keyを生成する。
≪鍵交換補助サーバ20≫
図3に示すように、鍵交換補助サーバ20は、セットアップ部211と、鍵交換部212とを有する。これら各部は、例えば、鍵交換補助サーバ20にインストールされた1以上のプログラムがプロセッサに実行させる処理により実現される。
また、鍵交換補助サーバ20は、記憶部221を有する。記憶部221は、例えば、鍵交換補助サーバ20のメモリ装置等を用いて実現可能である。
記憶部221には、各種情報(例えば、長期秘密鍵及び長期公開鍵のペア(sskS, spkS)や各通信端末10で計算された事前計算結果precompU,W等)が記憶される。
セットアップ部211は、セットアップ処理を実行する。すなわち、セットアップ部211は、CAGKE.SetSV, CAGKE.SetSSK及びCAGKE.SetSPKを実行する。
鍵交換部212は、通信端末10と複数回通信を行うことで、セッション鍵keyの生成に必要な情報を生成し、当該通信端末10に送信する。
≪鍵生成サーバ30≫
図3に示すように、鍵生成サーバ30は、セットアップ部311を有する。セットアップ部311は、例えば、鍵生成サーバ30にインストールされた1以上のプログラムがプロセッサに実行させる処理により実現される。
また、鍵生成サーバ30は、記憶部321を有する。記憶部321は、例えば、鍵生成サーバ30のメモリ装置等を用いて実現可能である。
記憶部321は、各種情報(例えば、マスター秘密鍵msk等)が記憶される。セットアップ部311は、セットアップ処理を実行する。すなわち、セットアップ部311は、CAGKE.Setup及びCAGKE.PKeyExtを実行する。
[実施例1]
以降では、実施例1について説明する。実施例1では、ブラインド鍵カプセル化メカニズム(BKEM(Blinded Key Encapsulation Mechanism))と証明書不要署名方式(CS)とプロキシ再暗号化付き証明書不要サインクリプション方式(CSPRE)とを用いてCAGKEを構成する場合について説明する。
<準備>
CAGKEの構成について説明する前に、以下、ブラインド鍵カプセル化メカニズム(BKEM)と証明書不要署名方式(CS)とプロキシ再暗号化付き証明書不要サインクリプション方式(CSPRE)とについて説明する。
・ブラインド鍵カプセル化メカニズム(BKEM)
ブラインド鍵カプセル化メカニズムは、以下の5つのアルゴリズム(BKEM.KeyGen, BKEM.Encap, BKEM.Blind, BKEM.Decap, BKEM.Unblind)で構成される。
BKEM.KeyGen(r1)→(ek, dk):乱数r1を入力として、公開鍵ekと秘密鍵dkとを出力する確定的アルゴリズム。
BKEM.Encap(ek, r2)→(C, k):公開鍵ekと乱数r2とを入力として、暗号文Cと鍵kとを出力する確定的アルゴリズム。
:公開鍵ekと暗号文Cと乱数r
3とを入力として、ブラインドされた暗号文
を出力する確定的アルゴリズム。なお、以降、明細書のテキスト中では、Xがブラインドされていることを「
~X」と表す。
BKEM.Decap(dk, ~C)→~k:秘密鍵dkとブラインドされた暗号文~Cとを入力として、ブラインドされた鍵~kを出力する確定的アルゴリズム。
BKEM.Unblind(r3, ~k)→k:乱数r3とブラインドされた鍵~kとを入力として、鍵kを出力する確定的アルゴリズム。
なお、ブラインド鍵カプセル化メカニズムの詳細については、例えば、以下の参考文献2等を参照されたい。
[参考文献2]
Boyd, C., Davies, G.T., Gjosteen, K., Jiang, Y.: Offline assisted group key exchange. Cryptology ePrint Archive, Report 2018/114 (2018).
・証明書不要署名方式(CS)
証明書不要署名方式は、以下の7つのアルゴリズム(CS.Setup, CS.PKeyExt, CS.SetSV, CS.SetSK, CS.SetPK, CS.Sign, CS.Verify)で構成される。
CS.Setup(1κ)→(params, msk):セキュリティパラメータ1κを入力として、公開パラメータparamsとマスター秘密鍵mskとを出力する確率的アルゴリズム。
CS.PKeyExt(params, msk, ID)→(ppkID, pskID):公開パラメータparamsとマスター秘密鍵mskとID IDとを入力として、部分公開鍵ppkIDと部分秘密鍵pskIDとを出力する確率的アルゴリズム。
CS.SetSV(params, ID)→svID:公開パラメータparamsとID IDとを入力として、秘密値svIDを出力する確率的アルゴリズム。
CS.SetSK(params, pskID, svID)→skID:公開パラメータparamsと部分秘密鍵pskIDと秘密値svIDとを入力として、秘密鍵skIDを出力する確率的アルゴリズム。
CS.SetPK(params, ppkID, svID)→pkID:公開パラメータparamsと部分公開鍵ppkIDと秘密値svIDとを入力として、公開鍵pkIDを出力する確率的アルゴリズム。
CS.Sign(params, ID, skID, m)→σ:公開パラメータparamsとID IDと秘密鍵skIDとメッセージmとを入力として、署名σを出力する確率的アルゴリズム。
CS.Verify(params, ID, pkID, m, σ)→1/0:公開パラメータparamsとID IDと公開鍵pkIDとメッセージmと署名σとを入力として、検証成功を表す1又は検証失敗を表す0のいずれかを出力する確定的アルゴリズム。
なお、証明書不要署名方式の詳細については、例えば、以下の参考文献3等を参照されたい。
[参考文献3]
Yum, D.H., Lee, P.J.: Generic Construction of Certificateless Signature. In: Wang, H., Pieprzyk, J., Varadharajan, V. (eds.) ACISP 2004. LNCS, vol. 3108, pp. 200-211. Springer, Heidelberg (2004)
・プロキシ再暗号化付き証明書不要サインクリプション方式(CSPRE)
プロキシ再暗号化付き証明書不要サインクリプション方式は、以下の10のアルゴリズム(CSPRE.Setup, CSPRE.PKeyExt, CSPRE.SetSV, CSPRE.SetSK, CSPRE.SetPK, CSPRE.RKGen, CSPRE.Signcrypt, CSPRE.ReSigncrypt, CSPRE.DeSigncrypt1, CSPRE.DeSigncrypt2)で構成される。
CSPRE.Setup(1κ)→(params, msk):セキュリティパラメータ1κを入力として、公開パラメータparamsとマスター秘密鍵mskとを出力する確率的アルゴリズム。
CSPRE.PKeyExt(params, msk, ID)→(ppkID, pskID):公開パラメータparamsとマスター秘密鍵mskとID IDとを入力として、部分公開鍵ppkIDと部分秘密鍵pskIDとを出力する確率的アルゴリズム。
CSPRE.SetSV(params, ID)→svID:公開パラメータparamsとID IDとを入力として、秘密値svIDを出力する確率的アルゴリズム。
CSPRE.SetSK(params, pskID, svID)→skID:公開パラメータparamsと部分秘密鍵pskIDと秘密値svIDとを入力として、秘密鍵skIDを出力する確率的アルゴリズム。
CSPRE.SetPK(params, ppkID, svID)→pkID:公開パラメータparamsと部分公開鍵ppkIDと秘密値svIDとを入力として、公開鍵pkIDを出力する確率的アルゴリズム。
CSPRE.RKGen(params, IDA, skA, pkA, IDB, pkB)→rkA→B:公開パラメータparamsと委任者(delegator)のID IDAと委任者の秘密鍵skAと委任者の公開鍵pkAと受任者(delegatee)のID IDBと受任者の公開鍵pkBとを入力として、再暗号化鍵rkA→Bを出力する確率的アルゴリズム。
CSPRE.Signcrypt(params, IDI, skI, pkI, IDi, pki, m)→σI,i:公開パラメータparamsとイニシエータIのID IDIとイニシエータIの秘密鍵skIとイニシエータIの公開鍵pkIとレスポンダiのID IDiとレスポンダiの公開鍵pkiと平文mとを入力として、サインクリプションσI,iを出力する確率的アルゴリズム。
CSPRE.ReSigncrypt(params, rki→i', σi)→σ'i,i':公開パラメータparamsと再暗号化鍵rki→i'とサインクリプションσiとを入力として、サインクリプションσ'i,i'を出力する確率的アルゴリズム。
CSPRE.DeSigncrypt1(params, IDI, pkI, ski, σI,i)→m/⊥:公開パラメータparamsとイニシエータIのID IDIとイニシエータIの公開鍵pkIとレスポンダiの秘密鍵skiとレスポンダiのサインクリプションσI,iとを入力として、平文m又は失敗を示す⊥のいずれかを出力する確定的アルゴリズム。
CSPRE.DeSigncrypt2(params, IDI, pkI, ski, σ'I,i)→m/⊥:公開パラメータparamsとイニシエータIのID IDIとイニシエータIの公開鍵pkIとレスポンダiの秘密鍵skiとレスポンダiのサインクリプションσ'I,iとを入力として、平文m又は失敗を示す⊥のいずれかを出力する確定的アルゴリズム。
ここで、プロキシ再暗号化付き証明書不要サインクリプション方式は、正当性として以下の2つの条件を満たす。
条件1:任意の公開パラメータparamsと任意のイニシエータIのID IDIと当該IDに対応する任意の秘密鍵skI及び公開鍵pkIと任意のレスポンダiのID IDiと当該IDに対応する任意の秘密鍵ski及び公開鍵pkiと任意の平文mとに対して、
CSPRE.DeSigncrypt1(params, IDI, pkI, ski, CSPRE.Signcrypt(params, IDI, skI, pkI, IDi, pki, m))=m
が成り立つ。
条件2:任意の公開パラメータparamsと任意のイニシエータIのID IDIと当該IDに対応する任意の秘密鍵skI及び公開鍵pkIと任意の2つのレスポンダi及びi'のID IDi及びIDi'とこれらのIDにそれぞれ対応する任意の秘密鍵ski及びski'並びに公開鍵pki及びpki'と任意の再暗号化鍵rki→i'と任意の平文mとに対して、
CSPRE.DeSigncrypt2(params, IDI, pkI, ski', CSPRE.ReSigncrypt(params, rki→i', CSPRE.Signcrypt(params, IDI, skI, pkI, IDi, pki, m)))=m
が成り立つ。
なお、プロキシ再暗号化付き証明書不要サインクリプション方式の詳細については、例えば、以下の参考文献4等を参照されたい。
[参考文献4]
Emmanuel Ahene, Junfeng Dai, Hao Feng, Fagen Li: A certificateless signcryption with proxy re-encryption for practical access control in cloud-based reliable smart grid. Telecommunication Systems April 2019, Volume 70, Issue 4, pp 491-510.
<実施例1におけるCAGKE>
以上で説明したブラインド鍵カプセル化メカニズム(BKEM)と証明書不要署名方式(CS)とプロキシ再暗号化付き証明書不要サインクリプション方式(CSPRE)とを用いて、実施例1におけるCAGKEのセットアップ処理、事前計算処理及び鍵交換処理を以下のように構成する。
≪実施例1におけるセットアップ処理≫
実施例1におけるセットアップ処理について、図4を参照しながら説明する。図4は、実施例1におけるセットアップ処理の一例を示すフローチャートである。
ステップS101:鍵生成サーバ30のセットアップ部311は、CAGKE.Setupを実行して、公開パラメータparamsとマスター秘密鍵mskとを生成する。すなわち、セットアップ部311は、CAGKE.Setup(1κ)を実行することで、以下により公開パラメータparamsとマスター秘密鍵mskとを生成する。
まず、セットアップ部311は、(paramsCS, mskCS)←CS.Setup(1κ)と(paramsCSPRE, mskCSPRE)←CSPRE.Setup(1κ)とを実行する。そして、セットアップ部311は、msk=(mskCS, mskCSPRE)、params=(paramsCS, paramsCSPRE, tPRF, KDF, H1, H2, H3)とする。ここで、tPRF:{0, 1}κ×Kspaceκ 2×{0, 1}κはねじれ疑似ランダム関数(twisted PRF)、KDFは鍵導出関数(key derivation function)、H1, H2, H3はそれぞれ衝突困難ハッシュ関数(collision resistance hash function)である。なお、Kspaceκは鍵空間である。
なお、公開パラメータparamsは記憶部321に保存されると共に公開される。一方で、マスター秘密鍵mskは記憶部321に保存される。
ステップS102:次に、鍵生成サーバ30のセットアップ部311は、各通信端末10及び鍵交換補助サーバ20それぞれのIDを用いてCAGKE.PKeyExtを実行して、部分公開鍵ppkIDと部分秘密鍵pskIDとを生成する。すなわち、セットアップ部311は、各IDを用いてCAGKE.PKeyExt(params msk, ID)を実行することで、以下により各IDのそれぞれに対応する部分公開鍵ppkIDと部分秘密鍵pskIDとを生成する。
まず、セットアップ部311は、(ppkID CS, pskID CS)←CS.PKeyExt(paramsCS, mskCS, ID)と(ppkID CSPRE, pskID CSPRE)←CSPRE.PKeyExt(paramsCSPRE, mskCSPRE, ID)とを実行する。そして、セットアップ部311は、ppkID=(ppkID CS, ppkID CSPRE)、pskID=(pskID CS, pskID CSPRE)とする。
なお、部分公開鍵ppkIDは記憶部321に保存されると共に公開される。一方で、部分秘密鍵pskIDは、この部分秘密鍵pskIDの生成に用いたIDに対応する通信端末10又は鍵交換補助サーバ20に対してセキュアな方法で送信される。
ステップS103:各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSVを実行して、このIDに対応する秘密値svIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSV(params, ID)を実行することで、以下により当該IDに対応する秘密値svIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、svID CS←CS.SetSV(paramsCS, ID)とsvID CSPRE←CSPRE.SetSV(paramsCSPRE, ID)とを実行する。そして、セットアップ部111及びセットアップ部211は、svID=(svID CS, svID CSPRE)とする。
なお、セットアップ部111により生成された秘密値svIDは記憶部121に保存される。一方で、セットアップ部211により生成された秘密値svIDは記憶部221に保存される。
ステップS104:次に、各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSSKを実行して、このIDに対応する長期秘密鍵sskIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSSK(params, pskID, svID)を実行して、以下により当該IDに対応する長期秘密鍵sskIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、skID CS←CS.SetSK(paramsCS, pskID CS, svID CS)とskID CSPRE←CSPRE.SetSK(paramsCSPRE, pskID CSPRE, svID CSPRE)とを実行する。そして、セットアップ部111及びセットアップ部211は、sskID=(skID CS, skID CSPRE)とする。
なお、セットアップ部111により生成された長期秘密鍵sskIDは記憶部121に保存される。一方で、セットアップ部211により生成され長期秘密鍵sskIDは記憶部221に保存される。
ステップS105:次に、各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSPKを実行して、このIDに対応する長期公開鍵spkIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSPK(params, ppkID, svID)を実行して、以下により当該IDに対応する長期公開鍵spkIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、pkID CS←CS.SetPK(paramsCS, ppkID CS, svID CS)とpkID CSPRE←CSPRE.SetPK(paramsCSPRE, ppkID CSPRE, svID CSPRE)とを実行する。そして、セットアップ部111及びセットアップ部211は、spkID=(pkID CS, svID CSPRE)とする。
なお、セットアップ部111により生成された長期公開鍵spkIDは記憶部121に保存される。一方で、セットアップ部211により生成され長期公開鍵spkIDは記憶部221に保存される。
≪実施例1における事前計算処理≫
実施例1における事前計算処理について、図5を参照しながら説明する。図5は、実施例1における事前計算処理の一例を示すシーケンス図である。
ステップS201:まず、各通信端末10の事前計算部112は、CAGKE.PreCompを実行して、precompU,Wを計算する。すなわち、事前計算部112は、自身のID IDUに対する長期秘密鍵sskU及び長期公開鍵spkUと、他の通信端末10の長期公開鍵{spkV}V∈W\{U}とを用いてCAGKE.PreComp(params, sskU, spkU, {spkV}V∈W\{U})を実行して、以下によりprecompU,Wを計算する。
まず、事前計算部112は、任意のV∈W\{U}に対して、rkU→V←CSPRE.RKGen(paramsCSPRE, IDU, skU CSPRE, pkU CSPRE, IDV, pkV CSPRE)を実行する。そして、事前計算部112は、precompU,W={(IDV, rkU→V)}V∈W\{U}とする。IDVは、任意の他の通信端末10を表すVのIDである。なお、以降では、任意のUと任意のV∈W\{U}とに対して、(IDV, rkU→V)をprecompU,Vとも表す。
ステップS202:各通信端末10の事前計算部112は、事前計算結果であるprecompU,Wを鍵交換補助サーバ20に送信する。
ステップS203:鍵交換補助サーバ20は、各通信端末10から事前計算結果precompU,Wを受信すると、これらの事前計算結果precompU,Wを記憶部221に保存する。
≪実施例1における鍵交換処理≫
実施例1における鍵交換処理について、図6を参照しながら説明する。図6は、実施例1における鍵交換処理の一例を示すシーケンス図である。
なお、図6では、ユーザ集合G⊆Wでセッションを確立するものとする。また、イニシエータであるユーザをI∈G、レスポンダであるユーザをi∈{1, …, n}とする。なお、G={I, 1, …, n}である。更に、イニシエータIのインスタンスをπI ξ、レスポンダiのインスタンスをπi η、鍵交換補助サーバ20(つまり、S)のインスタンスをπS ζとする。
ステップS301:イニシエータ端末11の鍵交換部113は、以下により各種情報の生成を行う。
まず、イニシエータ端末11の鍵交換部113は、セッション参加ユーザをpidI ξ={I, 1, …, n}とする。次に、イニシエータ端末11の鍵交換部113は、乱数RandI∈{0, 1}κを任意に生成した上で、メッセージmsg1:=(RandI, pid:= pidI ξ)として、署名σ1←CS.Sign(paramsCS, IDI, skI CS, msg1)を生成する。
ステップS302:イニシエータ端末11の鍵交換部113は、(RandI, pid, σ1)を鍵交換補助サーバ20に送信する。
ステップS303:鍵交換補助サーバ20の鍵交換部212は、イニシエータ端末11から(RandI, pid, σ1)を受信すると、以下により検証及び各種情報の生成を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDI, pkI CS, msg1=(RandI, pid), σ1)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、rS∈Kspaceκとr'S∈{0, 1}κを一様ランダムに生成した上で、(ek, dk)←BKEM.KeyGen(tPRF(H1(sskS), H2(sskS,) rS, r'S))を計算する。次に、鍵交換補助サーバ20の鍵交換部212は、メッセージmsg2:=(RandI, pid, ek)として、署名σ2←CS.Sign(paramsCS, IDS, skS CS, msg2)を生成する。
そして、鍵交換補助サーバ20の鍵交換部212は、一時秘密鍵としてeskS ζ:=(rS, r'S)をセットし、(sid, IDI, pid, eskS ζ, T=φ)をセッションリストとして記憶部221に保存する。なお、Tには、現時点でセッションに参加しているレスポンダのIDが格納される。
ステップS304:鍵交換補助サーバ20の鍵交換部212は、(ek, σ2)をイニシエータ端末11に送信する。
ステップS305:イニシエータ端末11の鍵交換部113は、鍵交換補助サーバ20から(ek, σ2)を受信すると、以下により検証及びセッション鍵を含む各種情報の生成を行う。
まず、イニシエータ端末11の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg2=(RandI, pid, ek), σ2)を実行して検証を行う。そして、イニシエータ端末11の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、イニシエータ端末11の鍵交換部113は、sid:=H3(IDI, RandI, pidI ξ, ek)を計算する。また、イニシエータ端末11の鍵交換部113は、rI∈Kspaceκとr'I∈{0, 1}κを一様ランダムに生成した上で、一時秘密鍵としてeskI ξ:=(rI, r'I)をセットする。
次に、イニシエータ端末11の鍵交換部113は、(C, k)←BKEM.Encap(ek, tPRF(H1(sskI), H2(sskI,) rI, r'I))を計算した後、セッション鍵keyI ξ:=KDF('1', k, sid)と鍵検証値τI ξ:=KDF('2', k, sid)とを計算する。そして、イニシエータ端末11の鍵交換部113は、メッセージmsg3:=(C, ek, τI ξ, sid, pid)として、サインクリプションσI,I←CSPRE.Signcrypt(paramsCSPRE, IDI, skI CSPRE, pkI CSPRE, IDI, pkI CSPRE, msg3)と署名σ4←CS.Sign(paramsCS, IDI, skI CS, msg4:=(σI,I, sid))とを生成する。
ステップS306:イニシエータ端末11の鍵交換部113は、(sid, σI,I, σ4)を鍵交換補助サーバ20に送信し、インスタンスの実行状態をacceptedにする。
なお、上記のステップS305ではイニシエータIのみが復号できるサインクリプションσI,Iを生成しているが、これに限られず、例えば、いずれかのレスポンダiが復号できるサインクリプションσI,iを生成してもよい。
ステップS307:鍵交換補助サーバ20の鍵交換部212は、イニシエータ端末11から(sid, σI,I, σ4)を受信すると、以下により検証及び各種情報の生成を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDI, pkI CS, msg4=(σI,I, sid), σ4)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、レスポンダi∈G\{I}に対して、記憶部221からprecompI,i(つまり、(IDi, rkI→i))を取り出して、再暗号化サインクリプションσ'I,i←CSPRE.ReSigncrypt(paramsCSPRE, rkI→i, σI,I)と署名σ5←CS.Sign(paramsCS, IDS, skS CS, msg5:=(IDI, sid, σ'I,i))とを生成する。
ステップS308:鍵交換補助サーバ20の鍵交換部212は、レスポンダiのレスポンダ端末12がオンラインになった場合、(IDI, sid, σ'I,i, σ5)を当該レスポンダ端末12に送信する。
ステップS309:レスポンダ端末12の鍵交換部113は、(IDI, sid, σ'I,i, σ5)を受信すると、以下により検証及び各種情報の生成を行う。
まず、レスポンダ端末12の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg5=(IDI, sid, σ'I,i), σ5)を実行して検証を行う。そして、レスポンダ端末12の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、レスポンダ端末12の鍵交換部113は、(C, ek, τI ξ, sid, pid)←CSPRE.DeSigncrypt2(paramsCSPRE, IDI, pkI CSPRE, ski CSPRE, σ'I,i)によりサインクリプションσ'I,iを復号する。次に、レスポンダ端末12の鍵交換部113は、ri∈Kspaceκとr'i∈{0, 1}κを一様ランダムに生成した上で、ブラインドされた暗号文~C←BKEM.Blind(ek, C, tPRF(H1(sski), H2(sski), ri, r'i))を計算する。そして、レスポンダ端末12の鍵交換部113は、署名σ6←CS.Sign(paramsCS, IDi, ski CS, msg6:=(sid, ek, ~C))を生成する。
ステップS310:レスポンダ端末12の鍵交換部113は、(sid, ~C, σ6)を鍵交換補助サーバ20に送信する。
ステップS311:鍵交換補助サーバ20の鍵交換部212は、レスポンダ端末12から(sid, ~C, σ6)を受信すると、以下により検証、各種情報の生成及びセッションリストの更新を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、sidをキーとしてセッションリストから一時秘密鍵eskS ζ=(rS, r'S)を取り出し、(ek, dk)←BKEM.KeyGen(tPRF(H1(sskS), H2(sskS,) rS, r'S))を計算する。次に、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDi, pki CS, msg6=(sid, ek, ~C), σ6)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、「IDi∈pid」及び「IDi∈Tでない」の両方が成り立つかを検証し、いずれかが成り立たない場合は処理を終了する。上記の両方が成り立つ場合は、鍵交換補助サーバ20の鍵交換部212は、ブラインドされた鍵~k←BKEM.Decap(dk, ~C)と署名σ7←CS.Sign(paramsCS, IDS, skS CS, msg7:=(sid, ek, ~k))とを生成する。
ステップS312:鍵交換補助サーバ20の鍵交換部212は、(sid, ~k, σ7)をレスポンダ端末12に送信すると共に、T':=T∪{IDi}として、セッションリスト中のTをT'に更新する。
ステップS313:レスポンダ端末12の鍵交換部113は、鍵交換補助サーバ20から(sid, ~k, σ7)を受信すると、以下により検証及びセッション鍵の生成を行う。
まず、レスポンダ端末12の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg7=(sid, ek, ~k), σ7)を実行して検証を行う。そして、レスポンダ端末12の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、レスポンダ端末12の鍵交換部113は、鍵k←BKEM.Unblind(tPRF(H1(sski), H2(sski), ri, r'i), ~k)を計算した後、セッション鍵keyi η:=KDF('1', k, sid)と鍵検証値τi η:=KDF('2', k, sid)とを計算する。そして、レスポンダ端末12の鍵交換部113は、τI ξ=τi ηであるかを検証し、この検証結果が正しければインスタンスの実行状態をacceptedにする。これにより、各U∈Gの間でセッション鍵keyが共有される。
[実施例2]
以降では、実施例2について説明する。実施例2では、ブラインド鍵カプセル化メカニズム(BKEM)と証明書不要署名方式(CS)と証明書不要プロキシ再暗号化方式(CPRE)とを用いてCAGKEを構成する場合について説明する。なお、実施例2では、実施例1と同様の構成要素については、その説明を省略する。
<準備>
CAGKEの構成について説明する前に、以下、証明書不要プロキシ再暗号化方式(CPRE)について説明する。
・証明書不要プロキシ再暗号化方式(CPRE)
証明書不要プロキシ再暗号化方式(CPRE)は、以下の10のアルゴリズム(CPRE.Setup, CPRE.PKeyExt, CPRE.SetSV, CPRE.SetSK, CPRE.SetPK, CPRE.RKGen, CPRE.Enc, CPRE.ReEnc, CPRE.Dec1, CPRE.Dec2)で構成される。
CPRE.Setup(1κ)→(params, msk):セキュリティパラメータ1κを入力として、公開パラメータparamsとマスター秘密鍵mskとを出力する確率的アルゴリズム。
CPRE.PKeyExt(params, msk, ID)→(ppkID, pskID):公開パラメータparamsとマスター秘密鍵mskとID IDとを入力として、部分公開鍵ppkIDと部分秘密鍵pskIDとを出力する確率的アルゴリズム。
CPRE.SetSV(params, ID)→svID:公開パラメータparamsとID IDとを入力として、秘密値svIDを出力する確率的アルゴリズム。
CPRE.SetSK(params, pskID, svID)→skID:公開パラメータparamsと部分秘密鍵pskIDと秘密値svIDとを入力として、秘密鍵skIDを出力する確率的アルゴリズム。
CPRE.SetPK(params, ppkID, svID)→pkID:公開パラメータparamsと部分公開鍵ppkIDと秘密値svIDとを入力として、公開鍵pkIDを出力する確率的アルゴリズム。
CPRE.RKGen(params, IDA, skA, pkA, IDB, pkB)→rkA→B:公開パラメータparamsと委任者(delegator)のID IDAと委任者の秘密鍵skAと委任者の公開鍵pkAと受任者(delegatee)のID IDBと受任者の公開鍵pkBとを入力として、再暗号化鍵rkA→Bを出力する確率的アルゴリズム。
CPRE.Enc(params, IDi, pki, m)→ci:公開パラメータparamsとレスポンダiのID IDiとレスポンダiの公開鍵pkiと平文mとを入力として、暗号文ciを出力する確率的アルゴリズム。
CPRE.ReEnc(params, rki→i', ci)→c'i': 公開パラメータparamsと再暗号化鍵rki→i'と暗号文ciとを入力として、暗号文c'i'を出力する確率的アルゴリズム。
CPRE.Dec1(params, ski, ci)→m/⊥:公開パラメータparamsとレスポンダiの秘密鍵skiと暗号文ciとを入力として、平文m又は失敗を示す⊥のいずれかを出力する確定的アルゴリズム。
CPRE.Dec2(params, ski, c'i)→m/⊥:公開パラメータparamsとレスポンダiの秘密鍵skiと暗号文c'iとを入力として、平文m又は失敗を示す⊥のいずれかを出力する確定的アルゴリズム。
証明書不要プロキシ再暗号化方式は、正当性として以下の2つの条件を満たす。
条件1:任意の公開パラメータparamsと任意のレスポンダiのID IDiと当該IDに対応する任意の秘密鍵ski及び公開鍵pkiと任意の平文mとに対して、
CPRE.Dec1(params, ski, CPRE.Enc(params, IDi, pki, m))=m
が成り立つ。
条件2:任意の公開パラメータparamsと任意の2つのレスポンダi及びi'のID IDi及びIDi'とこれらのIDにそれぞれ対応する任意の秘密鍵ski及びski'並びに公開鍵pki及びpki'と任意の再暗号化鍵rki→i'と任意の平文mとに対して、
CPRE.Dec2(params, ski', CPRE.ReEnc(params, rki→i', CPRE.Enc(params, IDi, pki, m)))=m
が成り立つ。
なお、証明書不要プロキシ再暗号化方式の詳細については、例えば、以下の参考文献5等を参照されたい。
[参考文献5]
Kang Yang, Jing Xu, and Zhenfeng Zhang: Certificateless Proxy Re-Encryption Without Pairings, Lecture Notes in Computer Science, 8565, 67-88.
<実施例2におけるCAGKE>
以上で説明したブラインド鍵カプセル化メカニズム(BKEM)と証明書不要署名方式(CS)と証明書不要プロキシ再暗号化方式(CPRE)とを用いて、実施例2におけるCAGKEのセットアップ処理、事前計算処理及び鍵交換処理を以下のように構成する。
≪実施例2におけるセットアップ処理≫
実施例2におけるセットアップ処理について、図7を参照しながら説明する。図7は、実施例2におけるセットアップ処理の一例を示すフローチャートである。
ステップS401:鍵生成サーバ30のセットアップ部311は、CAGKE.Setupを実行して、公開パラメータparamsとマスター秘密鍵mskとを生成する。すなわち、セットアップ部311は、CAGKE.Setup(1κ)を実行することで、以下により公開パラメータparamsとマスター秘密鍵mskとを生成する。
まず、セットアップ部311は、(paramsCS, mskCS)←CS.Setup(1κ)と(paramsCPRE, mskCPRE)←CPRE.Setup(1κ)とを実行する。そして、セットアップ部311は、msk=(mskCS, mskCPRE)、params=(paramsCS, paramsCPRE, tPRF, KDF, H1, H2, H3)とする。
なお、公開パラメータparamsは記憶部321に保存されると共に公開される。一方で、マスター秘密鍵mskは記憶部321に保存される。
ステップS402:次に、鍵生成サーバ30のセットアップ部311は、各通信端末10及び鍵交換補助サーバ20それぞれのIDを用いてCAGKE.PKeyExtを実行して、部分公開鍵ppkIDと部分秘密鍵pskIDとを生成する。すなわち、セットアップ部311は、各IDを用いてCAGKE.PKeyExt(params msk, ID)を実行することで、以下により各IDのそれぞれに対応する部分公開鍵ppkIDと部分秘密鍵pskIDとを生成する。
まず、セットアップ部311は、(ppkID CS, pskID CS)←CS.PKeyExt(paramsCS, mskCS, ID)と(ppkID CPRE, pskID CPRE)←CPRE.PKeyExt(paramsCPRE, mskCPRE, ID)とを実行する。そして、セットアップ部311は、ppkID=(ppkID CS, ppkID CPRE)、pskID=(pskID CS, pskID CPRE)とする。
なお、部分公開鍵ppkIDは記憶部321に保存されると共に公開される。一方で、部分秘密鍵pskIDは、この部分秘密鍵pskIDの生成に用いたIDに対応する通信端末10又は鍵交換補助サーバ20に対してセキュアな方法で送信される。
ステップS403:各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSVを実行して、このIDに対応する秘密値svIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSV(params, ID)を実行することで、以下により当該IDに対応する秘密値svIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、svID CS←CS.SetSV(paramsCS, ID)とsvID CPRE←CPRE.SetSV(paramsCPRE, ID)とを実行する。そして、セットアップ部111及びセットアップ部211は、svID=(svID CS, svID CPRE)とする。
なお、セットアップ部111により生成された秘密値svIDは記憶部121に保存される。一方で、セットアップ部211により生成された秘密値svIDは記憶部221に保存される。
ステップS404:次に、各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSSKを実行して、このIDに対応する長期秘密鍵sskIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSSK(params, pskID, svID)を実行して、以下により当該IDに対応する長期秘密鍵sskIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、skID CS←CS.SetSK(paramsCS, pskID CS, svID CS)とskID CPRE←CPRE.SetSK(paramsCPRE, pskID CPRE, svID CPRE)とを実行する。そして、セットアップ部111及びセットアップ部211は、sskID=(skID CS, skID CPRE)とする。
なお、セットアップ部111により生成された長期秘密鍵sskIDは記憶部121に保存される。一方で、セットアップ部211により生成され長期秘密鍵sskIDは記憶部221に保存される。
ステップS405:次に、各通信端末10のセットアップ部111及び鍵交換補助サーバ20のセットアップ部211は、自身のIDを用いてCAGKE.SetSPKを実行して、このIDに対応する長期公開鍵spkIDを生成する。すなわち、セットアップ部111及びセットアップ部211は、自身のIDを用いてCAGKE.SetSPK(params, ppkID, svID)を実行して、以下により当該IDに対応する長期公開鍵spkIDを生成する。
まず、セットアップ部111及びセットアップ部211は、自身のIDを用いて、pkID CS←CS.SetPK(paramsCS, ppkID CS, svID CS)とpkID CPRE←CPRE.SetPK(paramsCPRE, ppkID CPRE, svID CPRE)とを実行する。そして、セットアップ部111及びセットアップ部211は、spkID=(pkID CS, svID CPRE)とする。
なお、セットアップ部111により生成された長期公開鍵spkIDは記憶部121に保存される。一方で、セットアップ部211により生成され長期公開鍵spkIDは記憶部221に保存される。
≪実施例2における事前計算処理≫
実施例2における事前計算処理について、図8を参照しながら説明する。図8は、実施例2における事前計算処理の一例を示すシーケンス図である。
ステップS501:まず、各通信端末10の事前計算部112は、CAGKE.PreCompを実行して、precompU,Wを計算する。すなわち、事前計算部112は、自身のID IDUに対する長期秘密鍵sskU及び長期公開鍵spkUと、他の通信端末10の長期公開鍵{spkV}V∈W\{U}とを用いてCAGKE.PreComp(params, sskU, spkU, {spkV}V∈W\{U})を実行して、以下によりprecompU,Wを計算する。
まず、事前計算部112は、任意のV∈W\{U}に対して、rkU→V←CPRE.RKGen(paramsCPRE, IDU, skU CPRE, pkU CPRE, IDV, pkV CPRE)を実行する。そして、事前計算部112は、precompU,W={(IDV, rkU→V)}V∈W\{U}とする。
ステップS502:各通信端末10の事前計算部112は、事前計算結果であるprecompU,Wを鍵交換補助サーバ20に送信する。
ステップS503:鍵交換補助サーバ20は、各通信端末10から事前計算結果precompU,Wを受信すると、これらの事前計算結果precompU,Wを記憶部221に保存する。
≪実施例2における鍵交換処理≫
実施例2における鍵交換処理について、図9を参照しながら説明する。図9は、実施例2における鍵交換処理の一例を示すシーケンス図である。
ステップS601:イニシエータ端末11の鍵交換部113は、以下により各種情報の生成を行う。
まず、イニシエータ端末11の鍵交換部113は、セッション参加ユーザをpidI ξ={I, 1, …, n}とする。次に、イニシエータ端末11の鍵交換部113は、乱数RandI∈{0, 1}κを任意に生成した上で、メッセージmsg1:=(RandI, pid:= pidI ξ)として、署名σ1←CS.Sign(paramsCS, IDI, skI CS, msg1)を生成する。
ステップS602:イニシエータ端末11の鍵交換部113は、(RandI, pid, σ1)を鍵交換補助サーバ20に送信する。
ステップS603:鍵交換補助サーバ20の鍵交換部212は、イニシエータ端末11から(RandI, pid, σ1)を受信すると、以下により検証及び各種情報の生成を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDI, pkI CS, msg1=(RandI, pid), σ1)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、rS∈Kspaceκとr'S∈{0, 1}κを一様ランダムに生成した上で、(ek, dk)←BKEM.KeyGen(tPRF(H1(sskS), H2(sskS,) rS, r'S))を計算する。次に、鍵交換補助サーバ20の鍵交換部212は、メッセージmsg2:=(RandI, pid, ek)として、署名σ2←CS.Sign(paramsCS, IDS, skS CS, msg2)を生成する。
そして、鍵交換補助サーバ20の鍵交換部212は、一時秘密鍵としてeskS ζ:=(rS, r'S)をセットし、(sid, IDI, pid, eskS ζ, T=φ)をセッションリストとして記憶部221に保存する。
ステップS604:鍵交換補助サーバ20の鍵交換部212は、(ek, σ2)をイニシエータ端末11に送信する。
ステップS605:イニシエータ端末11の鍵交換部113は、鍵交換補助サーバ20から(ek, σ2)を受信すると、以下により検証及びセッション鍵を含む各種情報の生成を行う。
まず、イニシエータ端末11の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg2=(RandI, pid, ek), σ2)を実行して検証を行う。そして、イニシエータ端末11の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、イニシエータ端末11の鍵交換部113は、sid:=H3(IDI, RandI, pidI ξ, ek)を計算する。また、イニシエータ端末11の鍵交換部113は、rI∈Kspaceκとr'I∈{0, 1}κを一様ランダムに生成した上で、一時秘密鍵としてeskI ξ:=(rI, r'I)をセットする。
次に、イニシエータ端末11の鍵交換部113は、(C, k)←BKEM.Encap(ek, tPRF(H1(sskI), H2(sskI,) rI, r'I))を計算した後、セッション鍵keyI ξ:=KDF('1', k, sid)と鍵検証値τI ξ:=KDF('2', k, sid)とを計算する。そして、イニシエータ端末11の鍵交換部113は、メッセージmsg3:=(C, ek, τI ξ, sid, pid)として、暗号文cI←CPRE.Enc(paramsCPRE, IDI, pkI CPRE, msg3)と署名σ4←CS.Sign(paramsCS, IDI, skI CS, msg4:=(cI, sid))とを生成する。
ステップS606:イニシエータ端末11の鍵交換部113は、(sid, cI, σ4)を鍵交換補助サーバ20に送信し、インスタンスの実行状態をacceptedにする。
なお、上記のステップS605ではイニシエータIのみが復号できる暗号文を生成しているが、これに限られず、例えば、いずれかのレスポンダiが復号できる暗号文ciを生成してもよい。
ステップS607:鍵交換補助サーバ20の鍵交換部212は、イニシエータ端末11から(sid, cI, σ4)を受信すると、以下により検証及び各種情報の生成を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDI, pkI CS, msg4=(cI, sid), σ4)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、レスポンダi∈G\{I}に対して、記憶部221からprecompI,i(つまり、(IDi, rkI→i))を取り出して、再暗号化c'i←CPRE.ReEnc(paramsCPRE, rkI→i, cI)と署名σ5←CS.Sign(paramsCS, IDS, skS CS, msg5:=(IDI, sid, c'i))とを生成する。
ステップS608:鍵交換補助サーバ20の鍵交換部212は、レスポンダiのレスポンダ端末12がオンラインになった場合、(IDI, sid, c'i, σ5)を当該レスポンダ端末12に送信する。
ステップS609:レスポンダ端末12の鍵交換部113は、(IDI, sid, c'i, σ5)を受信すると、以下により検証及び各種情報の生成を行う。
まず、レスポンダ端末12の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg5=(IDI, sid, c'i), σ5)を実行して検証を行う。そして、レスポンダ端末12の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、レスポンダ端末12の鍵交換部113は、(C, ek, τI ξ, sid, pid)←CPRE.Dec2(paramsCPRE, ski CPRE, c'i)により暗号文c'iを復号する。次に、レスポンダ端末12の鍵交換部113は、ri∈Kspaceκとr'i∈{0, 1}κを一様ランダムに生成した上で、ブラインドされた暗号文~C←BKEM.Blind(ek, C, tPRF(H1(sski), H2(sski), ri, r'i))を計算する。そして、レスポンダ端末12の鍵交換部113は、署名σ6←CS.Sign(paramsCS, IDi, ski CS, msg6:=(sid, ek, ~C))を生成する。
ステップS610:レスポンダ端末12の鍵交換部113は、(sid, ~C, σ6)を鍵交換補助サーバ20に送信する。
ステップS611:鍵交換補助サーバ20の鍵交換部212は、レスポンダ端末12から(sid, ~C, σ6)を受信すると、以下により検証、各種情報の生成及びセッションリストの更新を行う。
まず、鍵交換補助サーバ20の鍵交換部212は、sidをキーとしてセッションリストから一時秘密鍵eskS ζ=(rS, r'S)を取り出し、(ek, dk)←BKEM.KeyGen(tPRF(H1(sskS), H2(sskS,) rS, r'S))を計算する。次に、鍵交換補助サーバ20の鍵交換部212は、CS.Verify(paramsCS, IDi, pki CS, msg6=(sid, ek, ~C), σ6)を実行して検証を行う。そして、鍵交換補助サーバ20の鍵交換部212は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、鍵交換補助サーバ20の鍵交換部212は、「IDi∈pid」及び「IDi∈Tでない」の両方が成り立つかを検証し、いずれかが成り立たない場合は処理を終了する。上記の両方が成り立つ場合は、鍵交換補助サーバ20の鍵交換部212は、ブラインドされた鍵~k←BKEM.Decap(dk, ~C)と署名σ7←CS.Sign(paramsCS, IDS, skS CS, msg7:=(sid, ek, ~k))とを生成する。
ステップS612:鍵交換補助サーバ20の鍵交換部212は、(sid, ~k, σ7)をレスポンダ端末12に送信すると共に、T':=T∪{IDi}として、セッションリスト中のTをT'に更新する。
ステップS613:レスポンダ端末12の鍵交換部113は、鍵交換補助サーバ20から(sid, ~k, σ7)を受信すると、以下により検証及びセッション鍵の生成を行う。
まず、レスポンダ端末12の鍵交換部113は、CS.Verify(paramsCS, IDS, pkS CS, msg7=(sid, ek, ~k), σ7)を実行して検証を行う。そして、レスポンダ端末12の鍵交換部113は、検証失敗を表す0が出力された場合は処理を終了する。
一方で、検証成功を表す1が出力された場合は、レスポンダ端末12の鍵交換部113は、鍵k←BKEM.Unblind(tPRF(H1(sski), H2(sski), ri, r'i), ~k)を計算した後、セッション鍵keyi η:=KDF('1', k, sid)と鍵検証値τi η:=KDF('2', k, sid)とを計算する。そして、レスポンダ端末12の鍵交換部113は、τI ξ=τi ηであるかを検証し、この検証結果が正しければインスタンスの実行状態をacceptedにする。これにより、各U∈Gの間でセッション鍵keyが共有される。
<まとめ>
以上のように、本実施形態に係る鍵交換システム1は、非同期のIDベース多者間鍵交換プロトコルを実現することができる。このとき、本実施形態に係る鍵交換システム1では、プロキシ再暗号化付き証明書不要サインクリプション方式又は証明書不要プロキシ再暗号化方式を用いて、非同期のIDベース多者間鍵交換プロトコルを実現する。これにより、例えば、鍵交換補助サーバ20と鍵生成サーバ30とが同一の事業者によって運営されているような場合であっても、グループ鍵(セッション鍵)を当該事業者に知られることなく、エンドツーエンドの暗号化を実現することが可能となる。
また、本実施形態に係る鍵交換システム1では、各ユーザは再暗号化鍵を事前に計算した上で鍵交換補助サーバ20に登録しておく。そして、本実施形態に係る鍵交換システム1は、グループ鍵生成時に、鍵交換補助サーバ20は署名暗号化された鍵(グループ鍵を生成するための鍵)を再暗号化して各ユーザ(各レスポンダ)に配布する。これにより、各ユーザは、事前計算を1回行う必要があるが、グループ鍵生成時の計算及び通信コストはグループ内のユーザ数には依存しなくなる。したがって、グループの規模に制限なく、効率よく鍵共有が可能になる。
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更、既知の技術との組み合わせ等が可能である。