ブラインド署名

暗号理論において、**ブラインド署名**はデジタル署名の一種であり、デビッド・チャウム（英語版）によって導入された。
ブラインド署名は、〈署名者〉と〈署名されるメッセージの作成者〉が異なる状況で使われる。メッセージの作成者は、署名者に署名処理の依頼をする際に、メッセージに何らかの秘匿化を行う。このため、署名者は自分がどのようなメッセージに署名したのかを知ることができないという性質を持つ。メッセージ作成者は、署名者から得た〈秘匿化されたメッセージに対する署名〉から、本来のメッセージに対する署名を生成できる。
典型的な利用例は、オンライン匿名投票システムや電子マネーなど、プライバシーを考慮したプロトコルである。

ブラインド署名は、内側がカーボン紙になっている封筒の上からサインすることに例えられる。例えば、アリスがある手紙を書いたとして、アリスはその手紙にボブのサインをもらいたいが、ボブには手紙の内容を見せたくない、という状況を考えよう。この場合、次のようにすればよい。
# アリスは手紙を〈カーボン紙付き封筒〉に入れてボブに渡す。
# ボブは封筒を開けずに封筒の上からサインをしてアリスに返す。
# アリスが封筒を開けて中の手紙を取り出す。
カーボン紙のおかげで、取り出した手紙には、ボブの署名がされている。

ブラインド署名では、次のようにして〈カーボン紙付き封筒〉を電子的に実現している。
* 〈封筒に入れる〉: メッセージ作成者アリスは、メッセージに乱数を乗算するなどの秘匿処理をする。
* 〈封筒の上からサインする〉: 署名者ボブは、署名鍵（秘密鍵）を使って、秘匿化されたメッセージに対して何らかの署名処理をして、秘匿化メッセージに対する署名を生成する。
* 〈封筒から出す〉: 秘匿化メッセージに対する署名から、メッセージの秘匿化に用いられた乱数部分を除くことで、元のメッセージに対する正当な署名を得る。
このような操作は、RSA署名やDSAなど、多くのメジャーなデジタル署名方式に対して実行することができる。

〈カーボン紙付き封筒〉と同様に、ブラインド署名はいくつかの有用な性質を持つ。まず、署名者は署名処理の実行時に、どのようなメッセージにサインしているのか全く分からない（ブラインド性, blindness）。また、通常のディジタル署名と同様に、アリスは署名者に署名処理を依頼することなしに、正当な署名を得ることができない（偽造不可能性）。さらに、署名者が複数回の署名処理を行ったならば、後から署名付きメッセージが公開されたとしても、それが何度目の署名処理で作成した署名なのか、すなわち、誰からの依頼で作成した署名であるのかを判別することができない（リンク不可能性, unlinkability）。

## 利用例

ブラインド署名は、暗号技術を利用した電子マネーやオンライン匿名投票システムなど、送信者のプライバシーが重要であるアプリケーションにおいて多く利用される。

例えば、オンライン匿名投票は次のように実現できる。
# 投票者は、メッセージ（投票内容）を乱数で秘匿化して、自分の身分を証明する情報とともに投票管理センターに送り、署名を依頼する。
# センターは、投票者が投票権を持つことを確認したのち、秘匿化されたメッセージに対して署名処理を行って、その結果を返す。
# 投票者は、署名から乱数部分の取り除くことで、元のメッセージ（投票内容）に対する署名を得る。メッセージと署名を匿名通信路を使って投票サイトに送る。
# 投票サイトでは、センターの正しい署名のついたメッセージだけを有効票として集計する。

ブラインド性により、署名者である投票管理センターは投票者の投票内容を知ることがない。偽造不可能性により、投票権を持たない者による投票は無効になる。投票管理センターが、署名処理の際に有権者名簿に「投票済み」のマークを付ければ、有権権が２回投票しようとすることも防ぐことができる。さらに、リンク不可能性により、投票管理センターが投票サイトへ送られた情報を見たとしても、どの投票内容を誰が投票したのか、判別することができない。これらの性質により、不正な投票を防ぎ、投票管理センターに対しても完全に匿名性を持たせることができる。

## ブラインド署名方式

厳密なモデルにおいて、ブラインド署名方式は鍵生成アルゴリズム・署名プロトコル・検証アルゴリズムの３つで構成される。通常、鍵生成アルゴリズムと検証アルゴリズムはベースとなる普通の署名方式と共通である。一方、署名プロトコルは、署名したいメッセージ m を持つユーザアリスと、署名者ボブの２者間で実行される暗号プロトコルである．プロトコルの終わりで、アリスは m へのボブの署名を得るが、ボブには m について何も教えない。この「何も教えない」という直感を数学的にとらえることは難しい。良く用いられるアプローチでは、悪意を持った任意の署名者に対し、署名者が得るのと同じ情報を出力できるシミュレータが存在することを示す。このアプローチは、ゼロ知識証明におけるゼロ知識性の定義に似ている。

### ブラインド RSA署名

最も簡単なブラインド署名は、RSA署名をベースとした方式である。

通常のRSA署名では，メッセージ m の署名 s は、
:  s = H(m)^d\ (\mathrm{mod}\ N) 
と計算される。ここで、
H( ) は暗号学的に安全なハッシュ関数、d は署名者（ボブ）の秘密鍵、N はボブの公開鍵（の片方）である。
ブラインド署名の署名プロトコルでは、N と互いに素であるような乱数 r（つまり，gcd(r,N)=1 であるようなr)が使われる。r をボブの公開鍵（のもう片方）e でべき乗した値 r^e\bmod N が，メッセージの秘匿化に用いられるblinding factorである。アリスが署名したいメッセージ m を持っているとき、アリスはまず m のハッシュ値 H(m) とblinding factorを掛け算して、秘匿化メッセージ m' を計算する。

:  m' \equiv H(m) r^e\ (\mathrm{mod}\ N) 

そして、m' を署名者ボブに送る。m' を受け取ったボブは、ブラインド署名 s' を次式で計算する．

:  s' \equiv (m')^d\ (\mathrm{mod}\ N). 

そして s' をアリスに送り返す。アリスは blinding factor を取り除くことで，本来のメッセージ  m に対するボブのRSA署名 s を，次式により得ることができる．

:  s \equiv s' \cdot r^{-1} \equiv (m')^d r^{-1} \equiv H(m)^d r^{ed} r^{-1} \equiv H(m)^d r r^{-1} \equiv H(m)^d\pmod{N},

r はランダムな値であり、写像 r\mapsto r^e\bmod N は置換であるから、r^e \bmod N は m によらずランダムである。したがって m' はメッセージ m に対する情報を全く漏らさない。

通常のRSA署名で暗号学的に安全なハッシュ関数を使う必要があるのと同様に、ブラインド署名においても、ハッシュ関数は重要である。暗号学的に安全なハッシュ関数を使うことによって、このブラインド署名が「一回の署名プロトコルの実行によって，高々一つの正当な署名しか得られない」という性質を持つことが証明されている。 この性質を持つことで、例えば投票システムにおいて，各有権者が１回しか投票できないようにすることができる。

## 参考文献

## 外部リンク
* 
*Security of Blind Signatures Under Aborts
*Implementation of Blind Signature in Java