説明

メッセージ送信および受信方法

【課題】サーバー上で保持された情報からの秘密鍵の露呈を完全に防ぐ。
【解決手段】メッセージmの送信者の秘密の署名生成鍵をsk_s、受信者の公開の暗号化鍵をpk_e、乱数をr、署名をs、署名生成関数をSign、メッセージmの署名をs=Sign(sk_s,m)、秘密の署名生成鍵sk_sをランダマイズするための関数をSigningKeyRandomize、暗号化関数をEncとして(1)乱数rを用いてランダマイズされた署名生成鍵sk'_s=SigningKeyRandomize(sk_s,r)を計算し、(2)乱数rを公開の暗号化鍵をpk_eを用いて暗号化した、暗号化された乱数R=Enc(pk_e,r)を計算し、(3)メッセージmをランダマイズされた署名生成鍵sk'_sで署名した署名メッセージs'=Sign(sk'_s,m)を計算して、(4)署名メッセージs'及び暗号化された乱数Rを受信者に送信する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、メッセージ(メール)の送信および受信方法に関し、特に署名付メッセージを安全に生成、送信し、それを受信する方法、システム、そのプログラムに関する。
【背景技術】
【0002】
Gmail(http://mail.google.com/)などのオンライン電子メールサービスにおいて、ユーザはWebブラウザを介して、メールの送受信を行う。そのような環境で、PGPやS/MIMEで行われるように、メールを署名し、その後、暗号化することを想定する。つまり、いわゆる、Sign-then-Encrypt(StE)の処理を行うことを想定する。ブラウザには署名生成鍵や暗号化鍵を管理する機能は通常なく、StEの処理をユーザのコンピューター上でローカルに実行することはできない。したがって、署名生成鍵や暗号化鍵の情報は、サーバ上に保持され、StEの処理もサーバ上で行われることになる。例えば、送信者が受信者にメールをStEの処理をして送信する場合を考える。その場合、送信者の秘密の署名生成鍵と受信者の公開の暗号化鍵はサーバ上に保持され、送信者がブラウザ上で作成したメールに対して、サーバが、それらの鍵を使って、StEの処理をして送信する。
【0003】
このような環境において、もしサーバに悪意をもった攻撃者(Insider/Outsiderの両方)が侵入した場合、送信者の秘密の署名生成鍵が盗まれてしまう。したがって、なんらかの保護手段が必要になる。特許文献1は、鍵公開センタに秘密の署名生成鍵を保持しないようにすることで、鍵公開センタの不正を防ぐ方法が記載されている。しかし、そもそも署名生成鍵を保持しないので、StEの処理を実行する方法を提供できない。非特許文献1は Java(商標) や C などで記述されたプログラムを難読化する様々な手法について述べており、そのような難読化ツールは市販のものも含めて数多く存在し、StEの処理プログラムを難読化することが可能であるが、それらはプログラムを読みにくくすることが目的であり秘密鍵の露呈を完全に防ぐことはできない。非特許文献2は、Re-Encryption (Decrypt-then-Encrypt 暗号文を復号して別の鍵で暗号化する操作) のための難読化の手法である。非特許文献2は、Decrypt-then-Encrypt機能のための難読化の手法であり StE機能のための難読化には利用できない。
非特許文献3はよく知られた暗号方式である。非特許文献4〜7はよく知られた署名方式である。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平7-87081
【非特許文献】
【0005】
【非特許文献1】C. Collberg, C. Thomborson and D. Low,"A Taxonomy of Obfuscating Transformations", Technical Report 148,Department of Computer Science, University of Auckland,1997.
【非特許文献2】S. Hohenberger, G. N. Rothblum, a. shelat,and V. Vaikuntanathan,"Securely Obfuscating Re-Encryption",Proceedings of TCC'07, 2007.
【非特許文献3】T. ElGamal, "A public key cryptosystemand signature scheme based on discrete logarithms," IEEE Trans. Inform.Theory, Vol. 31, pp. 469-472, 1985.
【非特許文献4】D. Boneh, B. Lynn, and H. Shacham,"Short Signatures from the Weil Pairing," Proceedings ofASIACRYPT'2001, pp. 514-532, 2001.
【非特許文献5】C. Schnorr, "Efficient SignatureGeneration by Smart Cards," J. Cryptology 4(3), pp161?174, 1991.
【非特許文献6】A. Lysyanskaya, "Unique Signatures andVerifiable Random Functions from the DH-DDH Separation," Proceedings ofCRYPTO'02, 2002.
【非特許文献7】B. Waters, "Efficient Identify-BasedEncryption Without Random Oracles," Proceedings of Eurocrypt'2005.
【発明の概要】
【発明が解決しようとする課題】
【0006】
本発明の課題は、サーバー上で保持された情報からの秘密鍵の露呈を完全に防ぐことを目的とする。すなわち、保持された情報を使用して、StEの処理を実行できるようし、かつ、保持された情報からは、秘密の署名生成鍵が露呈しないようにすることである。本発明は上記課題のためにサーバ上で送信者の秘密の署名生成鍵を保持するための特有の構成を有する。上記課題はオンライン電子メールサービス特有のものでなく、StEの処理を必要とするワークフロー・アプリケーションなどを提供するあらゆるWebサービスやSaaSサービスにおいて課題となる。難読化の技術として見れば、本発明の課題は秘密の署名生成鍵を保持するStEの処理を行うプログラムを秘密鍵の露呈を完全に防ぐように難読化することである。
【課題を解決するための手段】
【0007】
上記課題を解決するために、本発明は、演算処理装置およびメモリを有するコンピュータの処理によりメッセージ送信を行う方法であって、メッセージ m の送信者の秘密の署名生成鍵をsk_s、受信者の公開の暗号化鍵を pk_e、乱数を r、署名を s 、署名生成関数を Sign 、メッセージ m の署名を s=Sign(sk_s,m) 、前記秘密の署名生成鍵 sk_sをランダマイズするための関数をSigningKeyRandomize、暗号化関数を Enc として
(1)前記乱数 r を用いてランダマイズされた署名生成鍵sk'_s=SigningKeyRandomize(sk_s, r) を計算するステップと、
(2)前記乱数 r を前記公開の暗号化鍵を pk_e を用いて暗号化した、暗号化された乱数 R=Enc(pk_e,r)を計算するステップと、
(3)メッセージmを前記ランダマイズされた署名生成鍵sk'_sで署名した署名メッセージ s'=Sign(sk'_s, m) を計算するステップと
(4)前記署名メッセージ s'及び前記暗号化された乱数 Rを受信者に送信するステップ
を有する。
【0008】
ここで、前記ステップ(3)が、前記乱数とは別の乱数r'を用いて、sk'_sを再度ランダマイズするためにsk''_s=SigningKeyRandomize(sk'_s,r')を計算し、再度ランダマイズされた署名生成鍵sk''_sで署名した署名メッセージ s''=Sign(sk''_s, m) を計算するステップであり、前記ステップ(4)が、前記暗号化された乱数Rとr'からr×r'の暗号文R''を計算し、(s'', R'')を受信者に送信するステップとしてもよい。
【0009】
ここで、前記署名生成関数を、BLS 署名方式、Schnorr 署名方式、Lysyanskaya の署名方式、または Watersの署名方式を用いた関数としても良い。また、復号関数を Dec(sk_e,R)、検証関数をVerify(pk_s,s,m) として、前記前記署名メッセージs'及び暗号化された乱数 Rを受信するステップと、受信したR を前記復号関数 Dec を用いて復号し、乱数 r = Dec(sk_e,R) を計算するステップと、受信したs' と前記メッセージ m と復号結果の r から署名 s を計算するステップと、検証関数Verify(pk_s,s,m) を使用して署名の検証を行うステップを有するようにしても良い。
【0010】
本発明は別の態様として、サーバAが、送信者のメール送信に応答して、送信者及び受信者の情報を鍵管理センターに送信するステップと、鍵管理センターは前記送信者及び受信者の情報をPKIサーバに送信し、送信者の秘密の署名生成鍵 sk_s と受信者の公開暗号鍵 pk_e をPKIサーバから得るステップと、サーバAが、鍵管理センターから前記秘密の署名生成鍵sk_s を乱数 r でランダマイズした署名生成鍵sk'_s=SigningKeyRandomize(sk_s,r)と、前記乱数 r を前記受信者の公開暗号鍵pk_e で暗号化した結果 R=Enc(pk_e,r) を難読化されたSign-then-Encrypt(StE)プログラムとして受信するステップと、
サーバAが、受信者の公開の暗号化鍵を使用して、メールmの暗号文M=Enc(pk_e, m)を生成するステップと、サーバAが、難読化された前記 StEプログラム(sk'_sとR)を使用してs'=Sign(sk'_s,m)を計算するステップと、サーバAが、前記メールの暗号文M と、前記(s', R) をサーバBに送信するステップを有する。
【0011】
また、サーバBが、前記メールの暗号文M と、前記(s', R)を受信するステップと、サーバBが、送信者および受信者の情報をPKIサーバに送信し、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバから得るステップと、サーバBが、前記受信者の秘密復号化鍵 sk_e を用いて前記暗号文M を復号して前記メールm = Dec(sk_e,M)を得て、前記 R を復号して前記乱数 r = Dec(sk_e,R) を得て、(s',m,r)から署名 s を計算するステップと、サーバBが、検証関数 Verify(pk_s,s,m) を使用して署名の検証を行うステップを有する。
【発明の効果】
【0012】
本発明により、万が一、送信者から受信者へ送信するためのStEの難読化されたプログラムが露呈して、攻撃者が入手したとしても、
1.攻撃者は送信者の署名偽造はできない。
2.攻撃者は、送信者から受信者以外の第3者へ送信するためのStEの処理はできない。
3.露呈したらできるだけ早く受信者の公開鍵を更新することにより、露呈したプログラムの価値をなくすことができる。その際送信者の秘密の署名生成鍵の更新は必要ない。
などの効果が期待できる。
【図面の簡単な説明】
【0013】
【図1】従来のSign-then-Encryptの方法である。
【図2】旧来のメール送信方法の例である。
【図3】オンライン電子メールサービスにStE処理を適用した場合の例である。
【図4】本発明の概要を示す図である。
【図5】本発明を用いたオンライン電子メールサービスにおけるStE処理の概要である。
【図6】ステップ2の詳細な動作を示す図である。
【図7】ステップ4の詳細な動作を示す図である。
【図8】ステップ5の詳細な動作を示す図である。
【図9】各ユーザについての各種鍵の管理表である。
【図10】各サーバが有するコンピュータ・ハードウェアのブロック図の一例である。
【図11】ステップ1〜5の全体の処理遷移チャートである。
【発明を実施するための形態】
【0014】
<従来のSign-then-Encryptの方法>
本発明の概要を説明する前に、まず従来のSign-then-Encrypt(StE)の方法を図1に示す。入力されたメッセージmにメール送信者110が秘密の署名生成鍵を使用して署名し、σを生成した後、受信者の公開暗号化鍵を用いて(m,σ)を暗号化し、暗号文cが作成される。送信された暗号文cは受信者120により復号されメッセージmとその検証結果が得られる。StEの処理をプログラムで行う場合、StEプログラム内に保持される情報には、送信者の秘密の署名生成鍵と受信者公開暗号化鍵が含まれる。送信された暗号文はメールの受信者120により、受信者の秘密の復号鍵で復号され、送信者の公開検証鍵により検証される。これを旧来のメール送信方法に当てはめた例を図2に示す。図2では送信者210のPC上で送信者のeメールアプリケーションによりStE処理が実行され、暗号化されたメールがサーバA(230)からサーバB(240)を経由して受信者220のPCに到達し、受信者のeメールアプリケーションで復号及び検証される。しかしながらインターネットが主体の現在のメール送受信環境では、オンライン電子メールサービスを利用するのが殆どである。このサービスはサーバが提供するので、ユーザはウェブ・ブラウザを介してメールの送受信を行う。オンライン電子メールサービスにStE処理を適用した場合の図3に示す。送信者310のPCでメールを作成するとサーバA(330)上でStE処理がなされ、暗号化されたメールがサーバBに送信され、サーバB(340)で暗号化されたメールを復号し、最終的に復号及び検証されたメールが受信者320のPCに送信される。
【0015】
<本発明の概要>
図3のStEの処理を普通(naive)に実装しサーバA(330)上に保持すると、そのStEプログラムから送信者の秘密の署名生成鍵が簡単に露呈する可能性がある。したがって、本発明は、このプログラムを難読化する手法を提案し、難読化されたプログラムをサーバ上に保持することにより、上述の課題を解決する。従来、JavaやCで記述されたプログラムのための汎用的な難読化ツールは数多く存在するが、あくまでプログラムを読みにくくするのが目的であり、秘密鍵の露呈を完全に防げるとは考えられていない。本発明は、ある特定のプログラミング言語のための汎用的な難読化の手法の発明ではなく、ある特定のStEプログラムのための暗号理論的な難読化を行う。本発明の本質的なアイデアは、以下の2つの処理が等価になるという特別な性質を持つ署名方式と暗号化方式のペアを設計することである。
【0016】
1.あるメッセージが与えられとき、送信者の秘密の署名生成鍵を使用して署名し、そして、その署名データを受信者の公開暗号化鍵を使用して暗号化する。
2. あるメッセージが与えられとき、送信者の秘密の署名生成鍵を受信者の公開暗号化鍵で暗号化し、そして、その暗号化された署名生成鍵を使用してメッセージを署名する。
【0017】
前者の処理は、難読化の対象となるStEの処理である。後者における「送信者の秘密の署名生成鍵を受信者の公開暗号化鍵で暗号化する」ことが本発明の難読化に対応する。つまり、難読化されたプログラムは、暗号化された送信者の署名生成鍵を保持し、その暗号化された署名生成鍵を使用して与えられたメッセージを署名することにより、前者のStEの処理と等価な処理を行うことができる。暗号化された送信者の署名生成鍵は、暗号化された情報であるので、そこから送信者の署名生成鍵が露呈しないことを保証できる。
【0018】
図4に本発明の概要を図示する。従来StE処理部410は、メッセージmを送信者の秘密署名生成で署名(412)してσを生成した後、受信者の公開暗号化鍵で暗号化(414)し、暗号文cを出力する。これに対して本発明では、まず、送信者の署名生成鍵を受信者の公開暗号化鍵で暗号化する(420)。この処理が難読化に対応する。そして、その暗号化された署名生成鍵を保持し、それを使用してメッセージmに署名して暗号文cを出力する(432)。これを行う処理部430がStE処理部410の難読化されたプログラムと位置づけられる。これらの処理は、メッセージmに対する署名σの暗号化を行う処理であり、メッセージmそのものの暗号化は行わない。メッセージそのものの暗号化については、受信者の公開の暗号化鍵 pk_eを使用して、標準的なハイブリッド暗号化を行えばいいので、送信者の秘密の署名生成鍵を必要としない。したがって、難読化する必要はないので、本発明による難読化の対象とはしない。
【0019】
<詳細な実施例>
以下より詳細に本発明の実施例の詳細を説明する。
【0020】
以下のような抽象的な署名方式を考える。
<署名方式>
署名:s=Sign(sk_s, m) (sk_sは秘密の署名生成鍵であり、mはメッセージである。そしてsは署名結果である。)
検証:Verify(pk_s, s, m)(pk_sは公開の署名検証鍵である)
署名生成関数Signは、内部的に、乱数を使用してもよい。その場合、sは確率的に生成される。
署名方式は、以下の3つの条件を満たすと仮定する。
【0021】
署名方式条件1(署名生成鍵のランダマイズについて):
秘密の署名生成鍵sk_sを、乱数rを使用してランダマイズするための関数sk'_s=SigningKeyRandomize(sk_s, r)が存在し、sk'_sからsk_sの情報が漏れることはない。また、再度ランダマイズしたとき、つまり、別の乱数r'を使ってsk''_s= SigningKeyRandomize(sk'_s, r')を計算したとき、sk''_s= SigningKeyRandomize(sk_s, r×r')を満たすものとする。言い換えると、rとr'で2回ランダマイズすることと、r×r'で1回ランダマイズするのとは等価である。ただし、×は乱数の空間上の加算や乗算などの演算を表す。
【0022】
署名方式条件2(署名のランダマイズについて):
署名sを、署名対象のメッセージmと乱数rを使用してランダマイズするための関数s'=SignatureRandomize(s,m,r)が存在し、s'からsを復元できない。また、任意の(m,r,sk_s)に関して、SignatureRandomize(Sign(sk_s,m),m, r)=Sign(SigningKeyRandomize(sk_s, r),m)が成り立つ。つまり、mの署名をrでランダマイズすることと、rでランダマイズした署名生成鍵でmの署名を計算することとは、等価である。
【0023】
署名方式条件3(ランダマイズされた署名から元の署名の計算について):
ランダマイズされた署名s'=SignatureRandomize(s,m, r)とメッセージmとランダマイズに使用した乱数rから、s=Sign(sk_s,m)を計算できる。
【0024】
例えば、BLS署名方式(非特許文献4)の場合、署名生成関数Sign(sk_s, m)は、ハッシュ関数Hを使って、Exp(H(m),sk_s)として計算される。つまり、mのハッシュ値H(m)のsk_s乗として計算される。この場合、以下に説明するように、上記条件は全て満たされる。
【0025】
署名方式条件1:
sk'_s=SigningKeyRandomize(sk_s, r)=sk_s×rとして計算できる。また、sk''_s= SigningKeyRandomize(sk'_s, r')=sk_s×r×r'であるので、sk''_s=SigningKeyRandomize(sk_s, r×r')を満たす。
【0026】
署名方式条件2:
SignatureRandomize(s, m, r)=Exp(s,r)として計算できる。この計算にmは使用されない。
【0027】
署名方式条件3:
ランダマイズされた署名は、s'=Exp(H(m),sk_s×r )である。したがって、s'とrから、s=Sign(sk_s,m)をExp(s', 1/r)として計算できる。この計算にmは使用されない。
【0028】
次に、Schnorrの署名方式(非特許文献5)の場合も上記条件は全て満たされる。Schnorrの署名方式では、署名生成関数Sign(sk_s, m)は、以下の計算を行う。
1.乱数kを生成し、x=Exp(g,k)を計算する。ただし、gは公開のパラメータである。
2. ハッシュ関数Hを使って、e=H(m, x)を計算する。
3. y=k+e×sk_sを計算する。
4. (x,y)を署名sとして出力する。
この場合、以下に説明するように、上記条件は全て満たされる。
【0029】
署名方式条件1:
sk'_s=SigningKeyRandomize(sk_s, r)=sk_s+rとして計算できる。また、sk''_s= SigningKeyRandomize(sk'_s,r')=sk_s+r+r'であるので、sk''_s=SigningKeyRandomize(sk_s, r+r')を満たす。
【0030】
署名方式条件2:
SignatureRandomize(s=(x,y), m,r)=(x,y+H(m,x)×r)として計算できる。
【0031】
署名方式条件3:
ランダマイズされた署名は、s'=(x,y'=k+H(m,x)×(sk_s+r ))である。したがって、s'とmとrから、s=Sign(sk_s,m)を(x, y'-H(m,x)×r)として計算できる。
【0032】
さらに、Watersの署名方式(非特許文献7)の場合も上記条件は全て満たされる。Watersの署名方式では、署名生成関数Sign(sk_s, m)は、以下の計算を行う。すなわち、乱数kを生成し、(sk_s×Exp(f(m),k), Exp(g,k))を署名sとして計算する。ただし、gは公開のパラメータであり、また、fは公開の関数である。この場合、以下に説明するように、
上記条件は全て満たされる。
【0033】
署名方式条件1:
sk'_s=SigningKeyRandomize(sk_s, r)=sk_s×rとして計算できる。また、sk''_s= SigningKeyRandomize(sk'_s, r')=sk_s×r×r'であるので、sk''_s=SigningKeyRandomize(sk_s, r×r')を満たす。
【0034】
署名方式条件2:
SignatureRandomize(s=( sk_s×Exp(f(m),k), Exp(g,k)), m, r)=(r×sk_s×Exp(f(m),k), Exp(g,k))として計算できる。この計算にmは使用されない。
【0035】
署名方式条件3:
ランダマイズされた署名は、s'=( s1',s2')=(r×sk_s×Exp(f(m),k), Exp(g,k))である。したがって、s'とmとrから、s=Sign(sk_s,m)を(s1'/r, s2')として計算できる。この計算にmは使用されない。
【0036】
BLS署名方式、Schnorr署名方式、Watersの署名方式の他には、Lysyanskayaの署名方式(非特許文献6)などが上記条件を全て満たす。
【0037】
次に、以下のような抽象的な暗号方式を考える。
<暗号化方式>
暗号化:c = Enc(pk_e, m) (pk_eは公開の暗号化鍵、mはメッセージ、cは暗号文)
復号:m=Dec(sk_e, c) (sk_eは秘密の復号鍵)
【0038】
暗号化関数Encは、内部的に、乱数を使用してもよい。その場合、cは確率的に生成される。
本発明では、暗号化方式に関して、以下の2つの性質を考慮する。例えば、ElGamal暗号(非特許文献3)は両方の性質を持つ。
【0039】
Homomorphicな性質をもつ暗号化方式
任意のメッセージのペア(m1, m2)について、m1の暗号文c1= Enc(pk_e, m1)と、m2が与えられたとき、Enc(pk_e, m1×m2)を計算できる場合、暗号化方式は、Homomorphicな性質を満たすと言う。ただし、×は署名方式条件1で説明した加算や乗算などの演算である。例えば、ElGamal暗号(非特許文献3)は乗算に関して本性質を持つ。
【0040】
Rerandomizableな暗号化方式
この性質は、暗号文cが確率的に生成されるような暗号化方式に関する性質である。任意のメッセージmについて、その暗号文c=Enc(pk_e, m)と暗号化鍵pk_eが与えられたとき、cをRerandomizeする確率的アルゴリズムc'=Rerandomize(c,pk_e)が存在し、c=Enc(pk_e,m)の確率分布とc'=Rerandomize(c,pk_e)の確率分布が等しいならば、暗号化方式はRerandomizableであると言う。
【0041】
以上の暗号化方式と署名方式のペアを組み合わせて、以下のようなSign-then-Encryptのプログラムを考えることができる。このプログラムが本発明での難読化の対象である。
【0042】
<難読化の対象となるSign-then-Encryptプログラム>
入力:メッセージ m
プログラム内に保持される情報:送信者の秘密の署名生成鍵 sk_s と受信者の公開の暗号化鍵pk_e
出力:mの署名の暗号文
処理内容:
1.s=Sign(sk_s, m)を計算
2.乱数rを生成
3.s'=SignatureRandomize(s,m, r) を計算(署名方式条件2を参照のこと)
4.R= Enc(pk_e, r)を計算(乱数rの暗号化)
5.(s', R)を出力
【0043】
つまり、ステップ1が署名(Sign)の処理であり、ステップ2から5が暗号化(Encrypt)の処理である。(s',R)を受信した受信者は、まずRを復号してrを計算する。つまり、r=Dec(sk_e, R)を計算する。そして、署名方式条件3にしたがって、(s',m,r)から署名sを計算する。最後に、Verify(pk_s, s, m)関数を使用して署名の検証を行う。
【0044】
課題の説明で述べたように、このプログラムは、送信者の秘密の署名生成鍵 sk_sをそのまま保持しており、簡単に露呈する。したがって、このプログラムを難読化して、sk_sが露呈しないようにする必要がある。
【0045】
<難読化されたSign-then-Encryptプログラム>
以下に2種類の難読化されたプログラムを記述する。難読化されたプログラムは、送信者の秘密の署名生成鍵sk_sをそのまま保持するのではなく、署名方式条件1にしたがって、ランダマイズした値sk'_s=SigningKeyRandomize(sk_s,r)を保持する。また、rを暗号化した暗号文R=Enc(pk_e, r)も保持する。署名方式条件1および暗号化の安全性により、これらの情報から、sk_sが漏れることはない。
【0046】
<難読化されたSign-then-Encryptプログラム1>
入力:メッセージ m
プログラム内に保持される情報:
1.sk'_s=SigningKeyRandomize(sk_s,r)
2.R=Enc(pk_e, r)
3.受信者の公開の暗号化鍵 pk_e
出力:mの署名の暗号文
【0047】
処理内容:
1.s'=Sign(sk'_s, m)を計算(署名方式条件2により、s'=SignatureRandomize(Sign(sk_s,m), m, r)を満たす)
2.(s', R)を出力
【0048】
(s', R)を受信した受信者による処理は前述のものと同じである。つまり、まずRを復号してrを計算する。つまり、r=Dec(sk_e, R)を計算する。そして、署名方式条件3にしたがって、(s',m,r)から署名sを計算する。最後に、Verify(pk_s, s, m)関数を使用して署名の検証を行う。
【0049】
上述の難読化されたプログラムは、同じメッセージmに対して、常に、出力が同じになる可能性がある。これは安全性の観点から好ましくない場合もある。以下のようにプログラムを改善すれば、出力をランダマイズできる。プログラム内に保持される情報に変更はないので、プログラムからsk_sが露呈することはない。
【0050】
<難読化されたSign-then-Encryptプログラム2>
入力:メッセージ m
プログラム内に保持される情報: プログラム1の場合と同じ。
出力:mの署名の暗号
【0051】
処理内容:
1.乱数r'を生成
2.sk''_s=SigningKeyRandomize(sk'_s, r')を計算(署名方式条件1により、sk''_s= SigningKeyRandomize(sk_s, r×r')を満たす)
3.s''=Sign(sk''_s, m)を計算(署名方式条件1および2により、s''=SignatureRandomize(Sign(sk_s,m), m, r×r')を満たす)
4.暗号化方式がHomomorphicな性質を持つ場合は、Rとr'からr×r'の暗号文R''を計算する。
【0052】
この際、暗号化方式がrerandomizableな場合は、必要に応じて、R''をrerandomizeしてもよい。つまり、R''=Rerandomize(R'',pk_e)を計算する。そして、(s'', R'')を出力する。暗号化方式がHomomorphicな性質を持たない場合は、R''を計算できない。その場合、R'=Enc(pk_e, r')を計算し、(s'',R'')の代わりに、(s'', (R,R'))を出力する。その際、必要に応じて、R=Rerandomize(R,pk_e)を計算することにより、Rをrerandomizeしてもよい。
【0053】
暗号化方式がHomomorphicな性質を持つ場合、(s'', R'')を受信した受信者による処理(復号検証)は以下の通りである。まずR''を復号してr×r'を計算する。つまり、r×r'=Dec(sk_e, R'')を計算する。そして、署名方式条件3にしたがって、(s',m,r×r')から署名sを計算する。最後に、Verify(pk_s,s, m)関数を使用して署名の検証を行う。
【0054】
暗号化方式がHomomorphicな性質を持たない場合、(s'', (R,R'))を受信した受信者による処理(復号検証方法)は以下の通りである。まずRとR'を復号してrとr'を計算する。つまり、r=Dec(sk_e, R)とr'=Dec(sk_e, R')を計算する。そして、署名方式条件3にしたがって、(s',m,r×r')から署名sを計算する。最後に、Verify(pk_s,s, m)関数を使用して署名の検証を行う。
【0055】
<オンライン電子メールサービス>
本発明により難読化されたプログラムを用いて、オンライン電子メールサービスにおけるStEの処理を安全に行うことができる。以下に、送信者から受信者にメールを送信する場合を例として説明する。ただし、送信者の秘密の署名生成鍵および公開の署名検証鍵、そして、受信者の公開暗号化鍵および秘密の復号鍵は、PKIに基づく鍵管理センターにて管理されていると仮定する。PKIとは Public Key Infrastructureの略で、公開鍵と秘密鍵のキーペアからなる公開鍵暗号方式を利用したセキュリティのシステムを指す。またPKIサーバ610は、PKIシステムを実現するための証明書発行局(CA)・登録審査局(RA)の機能を提供する。すなわちPKIを用いた電子証明書の発行、運用管理を行なう。PKIサーバ610では図9に示すように各ユーザについて、暗号化用の公開暗号化鍵、秘密復号鍵、署名用の公開検証鍵、秘密署名鍵が管理されている。
【0056】
図5に本発明を用いたオンライン電子メールサービスにおけるStE処理の概要を図示する。
ステップ1.送信者310はサーバA(330)のサービスにアクセスし、送信者310のブラウザ上でメールを作成し、送信ボタンを押す。メールmはサーバAに送信される。
ステップ2.サーバA(330)は、鍵管理センター510から、受信者320の公開暗号化鍵および送信者310から受信者320に送信するための難読化されたStEプログラムを取得する。
ステップ3. サーバA(330)は、受信者320の公開暗号化鍵を使用してメールの暗号文を生成し、かつStEプログラムを使用して、メールmに対する署名の暗号文を生成する。そして、それらの暗号文をサーバB(340)に送信する。
ステップ4. サーバB(340)は、鍵管理センター(510)から、受信者320の秘密復号鍵および送信者310の公開署名検証鍵を取得し、暗号化されたメールを復号し、さらに、署名の復号および検証を行う。
ステップ5. 受信者320はサーバB(340)のサービスにアクセスし、ブラウザ上で送信者310からのメールを読む。この際、署名の検証結果がブラウザ上に表示される。上記ステップ2〜5についてより詳細に説明する。
【0057】
ステップ2の詳細な動作を図6に図示する。まずサーバA(330)は鍵管理センター510の難読化部420に送信者310および受信者320の情報を送信する。ここで情報とは、送信者、受信者の名前、ユーザID等、ユーザを特定できる情報のことである。難読化部430は送信者及び受信者の情報をPKIサーバに送信し、送信者の秘密の署名生成鍵 sk_s と受信者の公開暗号鍵 pk_e をPKIサーバから得る。
【0058】
次に難読化部430は送信者310の秘密の署名生成鍵 sk_s を乱数 r でランダマイズした署名生成鍵sk'_s=SigningKeyRandomize(sk_s,r)と、乱数 r を受信者320の公開暗号鍵pk_e で暗号化した結果 R=Enc(pk_e,r) をサーバA(330)へ送信する。サーバA(330)がランダマイズされた署名生成鍵 sk'_sと暗号文Rを取得することをサーバA(330)は難読化されたStEプログラムを取得すると言う。
【0059】
ステップ3では、サーバA(330)が、まず、受信者320の公開暗号化鍵pk_eを使用して、前記メールmの暗号文Mを生成する。次に、難読化されたStEプログラム(sk'_sとR)を使用してs'=Sign(sk'_s,m)を計算する。そして、Mおよび(s',R)をサーバB(340)に送信する。ここで、(s',R)は前記難読化されたSign-then-Encryptプログラム1の処理結果であるが、その代わりに前記難読化されたSign-then-Encryptプログラム2の処理を実行してもよい。
【0060】
ステップ4の詳細な動作を図7に示す。まずサーバB(340)が、暗号文Mと難読化されたStEプログラムの処理結果(s',R)を受信する。サーバB(340)は、送信者310および受信者320の情報をPKIサーバ610に送信し、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバ610から得る。そして暗号文Mからメールmを復号する。
【0061】
次にサーバB(340)は、受信者320の秘密復号化鍵 sk_e を用いて、R を復号して元の乱数 r を得て、署名方式条件3に従って、(s',m,r)から署名sを計算する。そして、送信者310の公開検証鍵 pk_s を用いてresult=Verify(pk_s,s,m)を署名の検証結果として計算する。
【0062】
ステップ5の詳細な動作を図8に示す。受信者320はサーバB(340)のサービスにアクセスし、ブラウザ上で送信者310からのメール(m)を読む。この際サーバB(340)で計算された署名の検証結果resultがブラウザ上に表示される。図8の場合は署名の検証に失敗した例である。この例では検証失敗の警告メッセージをポップアップで受信者320に知らせる。
【0063】
図11に上記各ステップ1〜5の全体の処理遷移チャートを図示する。
ステップ1110で、送信者310はサーバA(330)のサービスにアクセスし、送信者310のブラウザ上でメールを作成し、送信ボタンを押す。この時メールmはサーバAに送信される。
ステップ1120で、サーバA(330)は、難読化されたStEプログラムを取得するために鍵管理センター510にアクセスする。より具体的には、サーバA(330)は鍵管理センター510の難読化部420に送信者310および受信者320の情報を送信する。ここで情報とは、送信者、受信者の名前、ユーザID等、ユーザを特定できる情報のことである。
ステップ1130で、難読化部420は送信者310及び受信者320の情報をPKIサーバ610に送信する。
ステップ1140で、PKIサーバ610は送信者310の秘密の署名生成鍵 sk_s と受信者320の公開暗号鍵pk_e を難読化部420に送信する。
ステップ1150で、難読化部420は送信者310の秘密の署名生成鍵 sk_s を乱数 r でランダマイズした署名生成鍵 sk'_s=SigningKeyRandomize(sk_s,r)と、乱数 r を受信者320の公開暗号鍵 pk_e で暗号化した結果R=Enc(pk_e,r) をサーバA(330)へ送信する。
ステップ1160で、サーバA(330)は、まず、受信者320の公開暗号化鍵pk_eを使用して、前記メールmの暗号文Mを生成する。次に、難読化されたStEプログラム(sk'_sとR)を使用してs'=Sign(sk'_s,m)を計算する。そして、Mおよび(s',R)をサーバB(340)に送信する。ここで、(s',R)は前記難読化されたSign-then-Encryptプログラム1の処理結果であるが、その代わりに前記難読化されたSign-then-Encryptプログラム2の処理を実行してもよい。
ステップ1170で、サーバB(340)はメール受信にあたり、暗号文Mと難読化されたStEプログラムの処理結果(s',R)を受信した後、送信者310および受信者320の情報をPKIサーバ610に送信する。
ステップ1180で、PKIサーバ610は、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをサーバB(340)に送信する。
ステップ1190で、サーバB(340)は、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバ610から得て、暗号文Mからメールmを復号する。次に受信者320の秘密復号化鍵 sk_e を用いて、乱数 R を復号して元の乱数 r を得て、署名方式条件3に従って、(s',m,r)から署名sを計算する。そして、送信者310の公開検証鍵 pk_s を用いてresult=Verify(pk_s,s,m)を署名の検証結果として計算する。この処理が復号検証方法、復号検証プログラムに相当する処理である。最後に、受信者320に(m, result)を送信する。
【0064】
<コンピュータ・ハードウェアのブロック図>
図10に本発明の実施態様における、各サーバ(メール送信サーバ、メール受信サーバ)が有するコンピュータ・ハードウェアのブロック図を一例として示す。本発明の実施形態に係るコンピュータ・システム(1001)は、CPU(1002)とメイン・メモリ(1003)と含み、これらはバス(1004)に接続されている。CPU(1002)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のXeon(商標)シリーズ、Core(商標)シリーズ、Atom(商標)シリーズ、Pentium(商標)シリーズ、Celeron(商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ及びSempron(商標)などを使用することができる。
【0065】
バス(1004)には、ディスプレイ・コントローラ(1005)を介して、LCDモニタなどのディスプレイ(1006)が接続されている。ディスプレイ(1006)は、コンピュータ・システムの管理のために、通信回線を介してネットワークに接続されたコンピュータ・システムについての情報と、そのコンピュータ・システム上で動作中のソフトウェアについての情報を、適当なグラフィック・インターフェースで表示するために使用される。バス(1004)にはまた、IDE又はSATAコントローラ(1007)を介して、ハードディスク又はシリコン・ディスク(1008)と、CD−ROM、DVDドライブ又はBlu−rayドライブ(1009)が接続されている。
【0066】
ハードディスク(1008)には、オペレーティング・システム、本発明のコードを含むプログラム(メール送信プログラム、メール受信プログラム)及びデータが、メイン・メモリ(1003)にロード可能なように記憶されている。本発明のStE処理に使用されるメッセージ、メール、各種鍵のデータはハードディスク(1008)もしくはメイン・メモリ(1003)に格納されCPU(1002)により暗号化もしくは復号の処理が行われる。好ましくはオンライン電子メールサービスを行うプログラムはハードディスク(1008)に記憶され必要に応じてにおいてメイン・メモリ(1003)にロードされユーザへサービスを提供するために実行される。
【0067】
CD−ROM、DVD又はBlu−rayドライブ(1009)は、必要に応じて、CD−ROM、DVD−ROM又はBlu−rayディスクからプログラムをハードディスクに追加導入するために使用される。バス(1004)には更に、キーボード・マウスコントローラ(1010)を介して、キーボード(1011)及びマウス(1012)が接続されている。本発明のグラフ・データを上記外部記憶装置に記憶し、これを読み込むようにしても良い。
【0068】
通信インタフェース(1014)は、例えばイーサネット(商標)・プロトコルに従う。通信インタフェース(1014)は、通信コントローラ(1013)を介してバス(1004)に接続され、コンピュータ・システム及び通信回線(1015)を物理的に接続する役割を担い、コンピュータ・システムのオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インターフェース層を提供する。なお、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。この通信インターフェース(1014)を介してユーザにオンライン電子メールサービスを提供する。
【符号の説明】
【0069】
110、210、310 メール送信者
120、220、320 メール受信者
330 サーバA
340 サーバB
410 StE
420 難読化部
430 難読化されたStEプログラム
510 鍵管理センター
610 PKIサーバ
1001 コンピュータ・システム
1002 CPU
1003 メイン・メモリ
1004 バス
1005 ディスプレイ・コントローラ
1006 ディスプレイ
1007 IDE又はSATAコントローラ
1008 ハードディスク又はシリコン・ディスク
1009 CD−ROM、DVDドライブ又はBlu−rayドライブ
1010 キーボード・マウスコントローラ
1011 キーボード
1012 マウス
1013 通信コントローラ
1014 通信インタフェース
1015 通信回線

【特許請求の範囲】
【請求項1】
演算処理装置およびメモリを有するコンピュータの処理によりメッセージ送信を行う方法であって、メッセージ m の送信者の秘密の署名生成鍵をsk_s、受信者の公開の暗号化鍵を pk_e、乱数を r、署名を s 、署名生成関数を Sign 、メッセージ m の署名を s=Sign(sk_s,m) 、前記秘密の署名生成鍵 sk_sをランダマイズするための関数をSigningKeyRandomize、暗号化関数を Enc として
(1)前記乱数 r を用いてランダマイズされた署名生成鍵sk'_s=SigningKeyRandomize(sk_s, r) を計算するステップと、
(2)前記乱数 r を前記公開の暗号化鍵を pk_e を用いて暗号化した、暗号化された乱数 R=Enc(pk_e,r)を計算するステップと、
(3)メッセージmを前記ランダマイズされた署名生成鍵sk'_sで署名した署名メッセージ s'=Sign(sk'_s, m) を計算するステップと
(4)前記署名メッセージ s' 及び前記暗号化された乱数 Rを受信者に送信するステップ
を有する、メッセージ送信方法。
【請求項2】
前記ステップ(3)が、前記乱数とは別の乱数r'を用いて、sk'_sを再度ランダマイズするためにsk''_s=SigningKeyRandomize(sk'_s, r')を計算し、再度ランダマイズされた署名生成鍵sk''_sで署名した署名メッセージs''=Sign(sk''_s, m) を計算するステップであり、
前記ステップ(4)が、前記暗号化された乱数Rとr'からr×r'の暗号文R''を計算し、(s'', R'')を受信者に送信するステップである、請求項1記載の方法。
【請求項3】
前記署名生成関数が、BLS 署名方式、Schnorr 署名方式、Lysyanskaya の署名方式、または Watersの署名方式を用いた関数である請求項1及び請求項2記載の方法。
【請求項4】
復号関数を Dec(sk_e,R)、検証関数を Verify(pk_s,s,m) として、
請求項1記載の方法によって送信された(s', R)を受信するステップと、
受信したR を前記復号関数 Dec を用いて復号し、乱数 r = Dec(sk_e,R) を計算するステップと、
受信した s' と前記メッセージ m と復号結果の r から署名 s を計算するステップと、
検証関数 Verify(pk_s,s,m) を使用して署名の検証を行うステップ
を有する、復号検証方法
【請求項5】
サーバAが、送信者のメール送信に応答して、送信者及び受信者の情報を鍵管理センターに送信するステップと、
鍵管理センターは前記送信者及び受信者の情報をPKIサーバに送信し、送信者の秘密の署名生成鍵 sk_s と受信者の公開暗号鍵 pk_e をPKIサーバから得るステップと、
サーバAが、鍵管理センターから前記秘密の署名生成鍵 sk_s を乱数 r でランダマイズした署名生成鍵sk'_s=SigningKeyRandomize(sk_s,r)と、前記乱数 r を前記受信者の公開暗号鍵pk_e で暗号化した結果 R=Enc(pk_e,r) を受信するステップと、
サーバAが、受信者の公開の暗号化鍵を使用して、メールmの暗号文M=Enc(pk_e, m)を生成するステップと、
サーバAが、前記sk'_sとRを使用してs'=Sign(sk'_s,m)を計算するステップと、
サーバAが、前記メールの暗号文M と、前記(s', R) をサーバBに送信するステップ、
を有する、メール送信方法。
【請求項6】
サーバBが、請求項5記載の前記メールの暗号文M と、前記(s', R)を受信するステップと、
サーバBが、送信者および受信者の情報をPKIサーバに送信し、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバから得るステップと、
サーバBが、前記受信者の秘密復号化鍵 sk_e を用いて前記暗号文M を復号して前記メールm = Dec(sk_e,M)を得て、前記 R を復号して前記乱数 r = Dec(sk_e,R) を得て、(s',m,r)から署名 s を計算するステップと、
サーバBが、検証関数Verify(pk_s,s,m) を使用して署名の検証を行うステップを有する、メール受信方法。
【請求項7】
演算処理装置およびメモリを有するコンピュータの処理によりメッセージ送信を行うためのプログラムであって、メッセージ m の送信者の秘密の署名生成鍵をsk_s、受信者の公開の暗号化鍵を pk_e、乱数を r、署名を s 、署名生成関数を Sign 、メッセージ m の署名を s=Sign(sk_s,m) 、前記秘密の署名生成鍵 sk_sをランダマイズするための関数をSigningKeyRandomize、暗号化関数を Enc として、前記プログラムがコンピュータに、
(1)前記乱数 r を用いてランダマイズされた署名生成鍵sk'_s=SigningKeyRandomize(sk_s, r) を計算する機能と、
(2)前記乱数 r を前記公開の暗号化鍵を pk_e を用いて暗号化した、暗号化された乱数 R=Enc(pk_e,r)を計算する機能と、
(3)メッセージmを前記ランダマイズされた署名生成鍵sk'_sで署名した署名メッセージ s'=Sign(sk'_s, m) を計算する機能と
(4)前記署名メッセージ s' 及び前記暗号化された乱数 Rを受信者に送信する機能
を実行させる、メッセージ送信プログラム。
【請求項8】
前記機能(3)が、前記乱数とは別の乱数r'を用いて、sk'_sを再度ランダマイズするためにsk''_s=SigningKeyRandomize(sk'_s, r')を計算し、再度ランダマイズされた署名生成鍵sk''_sで署名した署名メッセージs''=Sign(sk''_s, m) を計算する機能であり、
前記機能(4)が、前記暗号化された乱数Rとr'からr×r'の暗号文R''を計算し、(s'', R'')を受信者に送信する機能である、請求項7記載のプログラム。
【請求項9】
前記署名生成関数が、BLS 署名方式、Schnorr 署名方式、Lysyanskaya の署名方式、または Watersの署名方式を用いた関数である請求項7及び請求項8記載のプログラム。
【請求項10】
復号関数を Dec(sk_e,R)、検証関数を Verify(pk_s,s,m) として、
請求項7記載のプログラムによって送信された(s',R)を受信する機能と、
受信したR を前記復号関数 Dec を用いて復号し、乱数 r = Dec(sk_e,R) を計算する機能と、
受信した s' と前記メッセージ m と復号結果の r から署名 s を計算する機能と、
検証関数 Verify(pk_s,s,m) を使用して署名の検証を行う機能
を有する、復号検証プログラム
【請求項11】
演算処理装置およびメモリを有するサーバの処理によりメール送信を行うためのプログラムであって、前記プログラムがサーバに、
送信者のメール送信に応答して、送信者及び受信者の情報を鍵管理センターに送信する機能と、
鍵管理センターが前記送信者及び受信者の情報をPKIサーバに送信し、前記PKIサーバから得た、送信者の秘密の署名生成鍵 sk_s と受信者の公開暗号鍵 pk_eについて、前記秘密の署名生成鍵 sk_s を乱数 r でランダマイズした署名生成鍵 sk'_s=SigningKeyRandomize(sk_s,r)と、前記乱数 r を前記受信者の公開暗号鍵pk_e で暗号化した結果 R=Enc(pk_e,r) を鍵管理センターから受信する機能と、
受信者の公開の暗号化鍵を使用して、メールmの暗号文M=Enc(pk_e, m)を生成する機能と、
難読化された前記sk'_sとRを使用してs'=Sign(sk'_s,m)を計算する機能と、
前記メールの暗号文M と、前記(s', R) を送信する機能、
を実行させる、メール送信プログラム。
【請求項12】
演算処理装置およびメモリを有するサーバの処理によりメール受信を行うためのプログラムであって、前記プログラムがサーバに、
請求項11記載の、メールの暗号文M と前記(s', R)を受信する機能と、
送信者および受信者の情報をPKIサーバに送信し、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバから得る機能と、
前記受信者の秘密復号化鍵 sk_e を用いて前記暗号文M を復号して前記メールm = Dec(sk_e,M)を得て、前記 R を復号して前記乱数 r = Dec(sk_e,R) を得て、(s',m,r)から署名 s を計算する機能と、
検証関数 Verify(pk_s,s,m) を使用して署名の検証を行う機能を
を実行させる、メール受信プログラム。
【請求項13】
送信者のメール送信に応答して、送信者及び受信者の情報を鍵管理センターに送信する手段と、
鍵管理センターが前記送信者及び受信者の情報をPKIサーバに送信し、前記PKIサーバから得た、送信者の秘密の署名生成鍵 sk_s と受信者の公開暗号鍵 pk_e について、前記秘密の署名生成鍵 sk_s を乱数 r でランダマイズした署名生成鍵 sk'_s=SigningKeyRandomize(sk_s,r)と、前記乱数 r を前記受信者の公開暗号鍵pk_e で暗号化した結果 R=Enc(pk_e,r) を鍵管理センターから受信する手段と、
受信者の公開の暗号化鍵を使用して、メールmの暗号文M=Enc(pk_e, m)を生成する手段と、
難読化された前記sk'_s, Rを使用してs'=Sign(sk'_s,m)を計算する手段と、
前記メールの暗号文M と、前記(s', R) をサーバBに送信する手段、
を有する、メール送信サーバ。
【請求項14】
請求項13記載の前記メールの暗号文M と、前記(s', R)を受信する手段と、
送信者および受信者の情報をPKIサーバに送信し、送信者の公開検証鍵 pk_s と受信者の秘密復号化鍵 sk_eをPKIサーバから得る手段と、
前記受信者の秘密復号化鍵 sk_e を用いて前記暗号文M を復号して前記メールm = Dec(sk_e,M)を得て、前記 R を復号して前記乱数 r = Dec(sk_e,R) を得て、(s',m,r)から署名 s を計算する手段と、
検証関数 Verify(pk_s,s,m) を使用して署名の検証を行う手段を有する、メール受信サーバ。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate


【公開番号】特開2011−97453(P2011−97453A)
【公開日】平成23年5月12日(2011.5.12)
【国際特許分類】
【出願番号】特願2009−250934(P2009−250934)
【出願日】平成21年10月30日(2009.10.30)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】