(57)【要約】【課題】公開鍵テーブルのサイズおよび署名の検証にかかる計算量の増加を抑えつつ、安全かつ署名長を削減可能なワンタイム署名を実現する。【解決手段】デジタル署名システムは、メッセージに付与する署名を生成する署名生成手段を含む第1の通信装置と、メッセージに付与された署名を検証する署名検証手段を含む第2の通信装置とを備え、署名検証手段および署名検証手段は、メッセージから得たハッシュ値の各ビットを、秘密鍵テーブルまたは公開鍵テーブルのエントリを定めるためのテーブルインデックスに用いる第1種ビットと、一方向性関数の反復回数を定めるための深さインデックスに用いる第2種ビットとに分け、第1種ビットに基づいて秘密鍵テーブルまたは公開鍵テーブルから得られる秘密鍵または公開鍵と、第2種ビットに基づいて定まる一方向性関数の反復回数とを用いて、署名を生成または検証する。【選択図】図９
2015082804.tif 000002
【特許請求の範囲】
【請求項１】
送信メッセージに付与する署名を生成する署名生成手段を含む第1の通信装置と、
受信メッセージに付与された署名を検証する署名検証手段を含む第2の通信装置とを備え、
前記署名生成手段は、
前記送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第1のセグメント分割手段と、
分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第1のチェックサム算出手段と、
チェックサムに対応する秘密鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルを保持する秘密鍵テーブル記憶手段と、
各セグメントについて、テーブルインデックスを用いて前記秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、前記秘密鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する署名値生成手段とを有し、
前記署名検証手段は、
前記受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第2のセグメント分割手段と、
分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第2のチェックサム算出手段と、
チェックサムに対応する公開鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、前記秘密鍵テーブルの対応するエントリに登録されている秘密鍵に対して一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルを保持する公開鍵テーブル記憶手段と、
前記受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、前記受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する検証値生成手段と、
各セグメントのテーブルインデックスを用いて前記公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した各セグメントの公開鍵と前記生成された各セグメントの検証値とを各々照合するとともに、前記公開鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出したチェックサムに対応する公開鍵と前記生成されたチェックサムの検証値とを照合して、前記受信メッセージに付与された署名を検証する照合手段とを有する
ことを特徴とするデジタル署名システム。
【請求項２】
深さインデックスのサイズをgビットとした場合に、G=2gとすると、公開鍵テーブルのエントリのうちテーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、G回、一方向性関数を反復的に適用して得られる値が登録されており、公開鍵テーブルのチェックサムに対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、((G-1)×k)回、一方向性関数を反復的に適用して得られる値が登録されており、
第1のチェックサム算出手段または第2のチェックサム算出手段は、テーブルインデックスの値が同じセグメントからなるセグメント集合の各々から、当該セグメント集合に含まれる深さインデックスの最大値を抽出し、抽出された最大値の和をとってチェックサムとし、
送信メッセージに付される署名に含まれる各セグメントの署名値は、前記送信メッセージから得た各セグメントのテーブルインデックスが指す秘密鍵テーブルのエントリに登録されている秘密鍵に対して、当該セグメントの深さインデックスの値をw[i]とすると、(G-1-w[i])回、一方向性関数を反復的に適用して得られた値であり、
前記送信メッセージに付される署名に含まれるチェックサムの署名値は、秘密鍵テーブルのチェックサムに対応するエントリに登録されている秘密鍵に対して、前記送信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、c回、一方向性関数を反復的に適用して得られた値であり、
受信メッセージに付与された署名の検証用に生成される各セグメントの検証値は、前記受信メッセージに付与された署名に含まれる各セグメントの署名値に対して、当該セグメントの深さインデックスの値をw[i]とすると、(w[i]+1)回、一方向性関数を反復的に適用して得られた値であり、
前記受信メッセージに付与された署名の検証用に生成されるチェックサムの検証値は、前記受信メッセージに付与された署名に含まれるチェックサムの署名値に対して、前記受信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、((G-1)×k-c)回、一方向性関数を反復的に適用して得られた値である
請求項１に記載のデジタル署名システム。
【請求項３】
深さインデックスのサイズをgビットとした場合に、G=2gとすると、公開鍵テーブルのエントリのうちテーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、G回、一方向性関数を反復的に適用して得られる値が登録されており、公開鍵テーブルのチェックサムに対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、(G×k)回、一方向性関数を反復的に適用して得られる値が登録されており、
第1のチェックサム算出手段または第2のチェックサム算出手段は、テーブルインデックスの値が同じセグメントからなるセグメント集合の各々から、当該セグメント集合に含まれる深さインデックスの最大値を抽出し、抽出された最大値の各々に+1した値の和をとってチェックサムとし、
送信メッセージに付される署名に含まれる各セグメントの署名値は、前記送信メッセージから得た各セグメントのテーブルインデックスが指す秘密鍵テーブルのエントリに登録されている秘密鍵に対して、当該セグメントの深さインデックスの値をw[i]とすると、(G-1-w)回、一方向性関数を反復的に適用して得られた値であり、
前記送信メッセージに付される署名に含まれるチェックサムの署名値は、秘密鍵テーブルのチェックサムに対応するエントリに登録されている秘密鍵に対して、前記送信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、c回、一方向性関数を反復的に適用して得られた値であり、
受信メッセージに付与された署名の検証用に生成される各セグメントの検証値は、前記受信メッセージに付与された署名に含まれる各セグメントの署名値に対して、当該セグメントの深さインデックスの値をw[i]とすると、(w[i]+1)回、一方向性関数を反復的に適用して得られた値であり、
前記受信メッセージに付与された署名の検証用に生成されるチェックサムの検証値は、前記受信メッセージに付与された署名に含まれるチェックサムの署名値に対して、前記受信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、(G×k-c)回、一方向性関数を反復的に適用して得られた値である
請求項１に記載のデジタル署名システム。
【請求項４】
g=0、G=1であり、かつ各セグメントの深さインデックスの値が全て0である
請求項３に記載のデジタル署名システム。
【請求項５】
一方向性関数として、鍵付きのハッシュ関数を用い、
公開鍵テーブル生成時または公開鍵テーブルのエントリに応じて鍵付きのハッシュ関数の鍵が指定される
請求項１から請求項４のうちのいずれか１項に記載のデジタル署名システム。
【請求項６】
送信メッセージに付与する署名を生成する署名生成手段を備え、
前記署名生成手段は、
前記送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第1のセグメント分割手段と、
分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第1のチェックサム算出手段と、
チェックサムに対応する秘密鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルを保持する秘密鍵テーブル記憶手段と、
各セグメントについて、テーブルインデックスを用いて前記秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、前記秘密鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する署名値生成手段とを含む
ことを特徴とする通信装置。
【請求項７】
受信メッセージに付与された署名を検証する署名検証手段を備え、
前記署名検証手段は、
前記受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第2のセグメント分割手段と、
分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第2のチェックサム算出手段と、
チェックサムに対応する公開鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、前記秘密鍵テーブルの対応するエントリに登録されている秘密鍵に対して一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルを保持する公開鍵テーブル記憶手段と、
前記受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、前記受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する検証値生成手段と、
各セグメントのテーブルインデックスを用いて前記公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した各セグメントの公開鍵と前記生成した各セグメントの検証値とを各々照合するとともに、前記公開鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出したチェックサムに対応する公開鍵と前記生成したチェックサムの検証値とを照合して、前記受信メッセージに付与された署名を検証する照合手段とを含む
ことを特徴とする通信装置。
【請求項８】
メッセージの送信を行う第1の通信装置が、前記送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、
前記第1の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、
前記第1の通信装置が、各セグメントについて、テーブルインデックスを用いて、チェックサムに対応する秘密鍵のエントリと前記テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、チェックサムに対応する秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する
ことを特徴とするデジタル署名方法。
【請求項９】
メッセージの受信を行う第2の通信装置が、前記受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、
前記第2の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、
前記第2の通信装置が、前記受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、前記受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成し、
前記第2の通信装置が、各セグメントのテーブルインデックスを用いて、チェックサムに対応する公開鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、前記秘密鍵テーブルの各エントリに登録されている秘密鍵に一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した公開鍵と前記生成された当該セグメントの検証値とを照合するとともに、チェックサムに対応する公開鍵を読み出し、読み出したチェックサムに対応する公開鍵と前記生成されたチェックサムの検証値とを照合して、前記受信メッセージに付与された署名を検証する
ことを特徴とするデジタル署名方法。
【請求項１０】
メッセージの受信を行う通信装置において、受信したメッセージに付与された署名の検証を行うためのデジタル署名用プログラムであって、
コンピュータに、
前記受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する処理、
分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する処理、
前記受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、前記受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する処理、および
各セグメントのテーブルインデックスを用いて、チェックサムに対応する公開鍵のエントリと、前記テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、前記秘密鍵テーブルの各エントリに登録されている秘密鍵に一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した公開鍵と前記生成された当該セグメントの検証値とを照合するとともに、チェックサムに対応する公開鍵を読み出し、読み出したチェックサムに対応する公開鍵と前記生成されたチェックサムの検証値とを照合して、前記受信メッセージに付与された署名を検証する処理
を実行させるためのデジタル署名用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デジタル署名の生成または検証を行うデジタル署名システム、通信装置、デジタル署名方法およびデジタル署名用プログラムに関する。
【背景技術】
【０００２】
情報セキュリティ技術の目的の一つは、データの完全性（Integrity）の保証である。換言すると、情報セキュリティ技術を利用することによって、データが正確かつ完全であることの保証を利用者に与えることができることが望まれている。例えば、受信者が、受信したメッセージが送信者からの正規のメッセージであること、すなわち受信したメッセージが破損もしくは第三者による改ざんを受けていないことを検証できる情報セキュリティ技術が求められている。
【０００３】
デジタル署名（Digital Signature）は、主に電気通信ネットワークを介して授受されるメッセージの完全性を検証するための技術であり、公開鍵暗号方式を利用して送信者の正当性やメッセージの改ざんの有無を検出可能にする技術である。デジタル署名では、公開鍵PKに対応する秘密鍵SKを知る者が、メッセージMに対して、秘密鍵SKを正しく使ったときにのみ計算できる値Sを計算し、これをメッセージMに対する署名とする。
【０００４】
例えば、送信者は送信したいメッセージMに対して自分しか知らない秘密鍵SKを用いて署名Sを生成し、生成された署名SをメッセージMとともに送信する。一方、受信者は受信したメッセージMに付された署名Sに対して、送信者の秘密鍵SKに対応する公開鍵PKを用いてその整合性を検証し、受信したメッセージMが正しい送信者からの正規のメッセージであることを確認する。
【０００５】
デジタル署名は、送受信者の間で共通の秘密鍵を利用してメッセージの完全性を保証するメッセージ認証符号とは異なり、次の性質を満たす必要がある。すなわち、デジタル署名は、受信者が署名を検証してメッセージの完全性を確認することは可能であるが、受信者が署名を生成することはできないという性質を満たす必要がある。このような性質を満たすことによって、受信または送信の事実を事後に否認する行為である事後否認の防止（否認拒否）の性質とともに、受信したメッセージがマルチキャストやブロードキャストにおいても他の受信者が送信者になりすまして生成したメッセージでないことを保証することができる。デジタル署名がこのような性質を満たすためには、署名生成時に送信者のみが持つ秘密鍵を用いることが必要となる。したがって、デジタル署名では、送信者と受信者の間で非対称性が存在する公開鍵暗号スキームが必要となる。
【０００６】
図10は、デジタル署名方式の概略を示す説明図である。デジタル署名方式は、秘密鍵を用いて署名を生成する署名生成フェーズと、公開鍵を用いて署名の検証を行う署名検証フェーズの2つのフェーズに大別される。図10（a）は、主に送信側の通信装置において行われる署名生成フェーズの概略を示す説明図である。図10（b）は、主に受信側の通信装置において行われる署名検証フェーズの概略を示す説明図である。図10（a）に示すように、署名生成フェーズでは、メッセージが入力されると、署名生成手段91が、秘密鍵を用いてそのメッセージに付与する署名を生成して、出力する。また、図10（b）に示すように、署名検証フェーズでは、メッセージと署名の組が入力されると、署名検証手段92が、公開鍵を用いて署名の検証を行う。デジタル署名方式の適用例としては、センサーネットワークシステムなどが挙げられる。センサーネットワークシステムでは、サーバから各ノードへ、共通の設定やファームウェア更新のためのデータ送信が行われる。そのデータ送信にデジタル署名による署名を付与してもよい。
【０００７】
センサーネットワークシステムでは、センサーノードが署名を必要とするマルチキャスト通信等によるメッセージの送信側になることは少ないと考えられる。したがって、多くのセンサーノードでは、メッセージの受信処理において署名の検証を行うことができれば十分である。センサーノードのように、計算リソースが限られている通信装置に適用する場合、いかに検証処理を負荷なく行えるかが重要となる。
【０００８】
これまでデジタル署名方式として、RSA（Rivest Shamir Adleman）暗号を利用したRSA署名方式や、楕円曲線暗号（Elliptic Curve Cryptography, ECC）に基づく楕円曲線デジタル署名方式（Elliptic Curve Digital Signature Algorithm, ECDSA）が普及していたが、これらの方式は汎用性が高いが計算量が多いという問題があった。
【０００９】
一般に、公開鍵暗号方式に基づく処理は、ブロック暗号や暗号学的なハッシュ関数を用いる共通鍵暗号方式と比較して1000倍程度の計算量になる。例えば、センサーネットワークシステムでは、各ノードにおいて、計算リソースや、バッテリ駆動の場合など消費電力に関して強い制約があることが考えられる。そのため、署名の検証にかかる計算量を大きく削減できるデジタル署名方式が望まれる。
【００１０】
ところで、デジタル署名方式の他の例として、一方向性関数（one-way function）を用いたワンタイム署名（one-time signature）方式が知られている。一方向性関数は、順方向の計算は容易だが、逆像を求める処理が非常に困難な関数である。ワンタイム署名方式では、署名のデータサイズ（署名長）や公開鍵テーブルPKのデータサイズはRSA署名方式やECDSAよりも一般に大きくなり、また秘密鍵と公開鍵のペアで1回の署名のみが可能という制限はあるが、次のような利点がある。すなわち、暗号学的なハッシュ関数やブロック暗号で一方向性関数を実現することによって、RSA署名方式やECDSAと比べて、署名生成時および署名の検証にかかる計算量を大きく減少できる。非特許文献1には、そのようなワンタイム署名方式の例が記載されている。
【００１１】
また、本発明に関連する技術文献として、非特許文献2、非特許文献3および非特許文献4がある。
【先行技術文献】
【非特許文献】
【００１２】
【非特許文献１】Javier Lopez and Jianying Zhou, "Wireless Sensor Network Security", IOS Press, 2008, p.88-89.
【非特許文献２】”Secure Hash Standard(SHS)”, National Institute of Standards and Technology(NIST) FIPS PUB 180-3, Oct 2008.
【非特許文献３】Adrian Perring, “The BiBa One-Time Signature and Broadcast Authentication Protocol”, In Proceedings of the 8th ACM Conference on Computer and Communications Security, 2001.
【非特許文献４】"The Keyed-Hash Message Authentication Code (HMAC)", National Institute of Standards and Technology(NIST) FIPS PUB 198-1, The Keyed-Hash Message Authentication Code (HMAC), July 2008.
【発明の概要】
【発明が解決しようとする課題】
【００１３】
しかし、非特許文献1に記載されたいずれのワンタイム署名方式も、センサーネットワークシステムにおけるノードへのデータ送信に適用することを考えた場合に、満足のいくものではなかった。例えば、各ノードがセンサーノードなどの場合、全消費電力に対してデータの送受信によって消費される電力量が占める割合は大きい。また、センサーノードなどはストレージ量が制限されることも多い。したがって、安全性を保ちつつ、少ない計算量で署名の検証ができるだけでなく、消費電力量や消費ストレージ量の増加を抑えることができるデジタル署名方式が望まれる。
【００１４】
なお、デジタル署名方式において、受信側の消費電力に影響を与える要素としては署名長が挙げられる。また、受信側の消費ストレージ量に影響を与える要素としては公開鍵テーブルPKのデータサイズが挙げられる。
【００１５】
以下、非特許文献1において「Lamport-Diffie-Winternitzによる方式」として紹介されているワンタイム署名方式（以下、LDW署名と呼ぶ）を簡単に説明する。
【００１６】
なお、以下では一方向性関数をf()で表す。また、f()は固定長ビットの入出力関数であるとして、その長さをL［bit］で表す。なお、f()としてハッシュ関数を利用する場合には、必要に応じて出力長の制限や入力のパディングを行う。Lは典型的には80から128ビットである。また、Lはデジタル署名のセキュリティレベルの上界を与えるパラメータとなる。
【００１７】
任意の長さのメッセージMに署名を行う場合には、衝突困難性を持つ暗号学的なハッシュ関数H()を実行する。以下、H()を実行して得た値（ハッシュ値）をmとする。また、ハッシュ値mの長さをn［bit］で表す。暗号学的なハッシュ関数としては、非特許文献2に記載されているSHA-1やSHA-256などを利用することができる。
【００１８】
LDW署名では、メッセージMから得たハッシュ値mを、各々のサイズがg［bit］の計k個のセグメントに分割する。なお、n=g×kの関係にある。得られたセグメントをw[1], ..., w[k]と表す。G=2gとおくと、各セグメントw[i]（i=1,...,k）は0以上G未満の整数とみなすことができる。
【００１９】
また、LDW署名では、秘密鍵テーブルSKと公開鍵テーブルPKを次のように設定する。なお、テーブルの大きさは各々L×(k+1)ビットである。
【００２０】
SK = {x[0], x[1], ..., x[k]}，
PK = {pk[0], pk[1], ..., pk[k]}
【００２１】
ここで、x[0]はチェックサムに対応する秘密鍵、x[1]〜x[k]は各セグメントに対応する秘密鍵である。各秘密鍵x[i]（i=0,1,...,k）はいずれもLビットの乱数である。また、pk[0]〜pk[k]は秘密鍵x[0]〜x[k]に対応する公開鍵である。すなわち、pk[0]はチェックサムに対応する公開鍵であり、pk[0] = f{(G-1)×k}(x[0])である。ここで、pk[0]における反復回数cnt = (G-1)×kである。また、pk[1]〜pk[k]は各セグメントに対応する公開鍵であり、pk[i] （i=1,...,k） = f{G-1}(x[i])である。なお、pk[i]における反復回数cnt = G-1である。なお、整数a>0に対して、f{a}(x) = f(f{a-1}(x))である。すなわち、f{a](x)は、xに対してf()をa回反復的に実行することを表している。また、a=0に対して、f{a}(x) = xである。送信者は秘密テーブルSKを予め保持し、受信者は公開鍵テーブルPKを予め保持する。
【００２２】
LDW署名における署名生成方法は、以下のステップを含む。
【００２３】
（A1-1）  送信メッセージMに対してm = H(M)を計算し、得たハッシュ値mを各々gビットのセグメントw[1], ..., w[k]に分割する。
（A1-2）  チェックサムc = w[1] + ... + w[k]を計算する。
（A1-3）  i=1,2,...,kについて、署名値s[i] = f｛G-1-w[i]｝(x[i])を計算する。なお、各iにつき、f()の反復回数cnt = G-1-w[i]である。
（A1-4）  署名値s[0] = f｛c｝(x[0])を計算する。なお、f()の反復回数cnt = cである。
（A1-5）  S = {s[0], s[1], ..., s[k]}をメッセージMに対する署名とする。
【００２４】
図11は、LDW署名における署名生成装置の構成例を示すブロック図である。図11に示す署名生成装置81は、ハッシュ関数手段811と、セグメント分割手段812と、加算手段813と、秘密鍵テーブル記憶手段814と、一方向性関数手段815とを備える。
【００２５】
ハッシュ関数手段811は、メッセージMに対して暗号学的なハッシュ関数を適用して、ハッシュ値mを生成する。セグメント分割手段812は、生成されたハッシュ値mを各々gビットのセグメントに分割する。なお、nビット以下の固定長のメッセージに署名する場合にはハッシュ関数手段811は省略される。秘密鍵テーブル記憶手段814は、秘密鍵テーブルSKを保持する。加算手段813は上記のステップA1-2に示したチェックサムcの算出を行う。一方向性関数手段815は上記のステップA1-3に示した処理、すなわちi=1,2,...,kについて、秘密鍵テーブル記憶手段814に保持されている秘密鍵テーブルSKから各セグメントに対応する秘密鍵x[i]を読み出し、読み出した秘密鍵x[i]に対して、G-1-w[i]回反復的にf()を実行する処理を行う。続いて一方向性関数手段815は、秘密鍵テーブル記憶手段814に記憶されている秘密鍵テーブルSKからチェックサムに対応する秘密鍵x[0]を読み出し、加算手段813により算出されたチェックサムcに基づき、秘密鍵x[0]に対してc回反復的にf()を実行する。
【００２６】
また、LDW署名における署名検証方法は、以下のステップを含む。
【００２７】
（A2-1）  受信メッセージMに対してm = H(M)を計算し、得たハッシュ値mを各々gビットのセグメントw[1], ..., w[k]に分割する。
（A2-2）  チェックサムc = w[1] + ... + w[k]を計算する。
（A2-3）  i=1,2,...,kについて、検証値v[i] = f{w[i]}(s[i])を計算する。なお、各iにつき、f()の反復回数cnt = w[i]である。
（A2-4）  v[0] = f{(G-1)×k-c}(s[0])を計算する。なお、f()の反復回数cnt = (G-1)×k-cである。
（A2-5）  pk[i] = v[i] がi=0,1,...,kの全てで成り立てば、受信メッセージMに対する署名Sは正しい署名値であるとして、検証結果を”成功”とする。ここで、正しい署名値とは、送信されたメッセージと正しい秘密鍵とを用いて生成された署名値である。なお、受信したメッセージMに付された署名Sが正しい署名値であると認められれば、受信したメッセージMが正規のメッセージすなわち送信されたメッセージと同一である（改ざんがない）と認められる。
【００２８】
LDW署名においては、送信者からs[i] = f{G-1-w[i]}(x[i])を入手した攻撃者が、w' < w[i]となるw'について、s'[i] = f{w[i]-w'}（s[i]） = s[i] = f{G-1-w'}（x[i]）とすると偽造に成功する。しかし、このときチェックサムc' < cとなるため、一方向性関数の性質より、チェックサムに対する署名s'[0] = f{c'}（x[0]）をs[0] = f{c}（x[0]）から生成することは困難である。つまり、攻撃者はハッシュ値m以外のメッセージに対して正しい署名Sを生成することは困難である。
【００２９】
このように、LDW署名の安全性は一方向性関数の安全性に帰着できる。しかし、LDW署名では、署名長がL×(k+1)ビットである。また、検証に要するf()の実行回数が(G-1)×k回である。無線通信を利用したセンサーネットワークシステムにおけるセンサノードなどでは無線送受信で使用する電力量が大きいため、署名長はなるべく小さいことが望ましい。LDW署名では、k = n/gであるため、署名長を小さくするためにはセグメントのサイズgを大きくする必要がある。しかし、G = 2gであるために、gを大きくするとf()の実行回数は指数的に増大する。
【００３０】
なお、非特許文献1には、署名長を小さくすることが可能なワンタイム署名方式の一例としてHORS署名（“Hash to Obtain Random Sets”）が記載されている。以下、このHORS署名を簡単に説明する。
【００３１】
HORS署名では、メッセージMに対して必ず暗号学的ハッシュ関数H()を実行して、その出力であるハッシュ値mに対して署名を生成する。ハッシュ値mの長さをn［bit］とおく。HORS署名では、ハッシュ値mを、各々tビットの計k個のセグメントh[1],...,h[k]に分割する。なお、n = t×kの関係にある。T = 2tとおくと、各セグメントh[i]（i=1,..., k）は、0以上T未満の整数とみなすことができる。また、tはセキュリティレベルを決定するパラメータとなる。
【００３２】
また、HORS署名では、秘密鍵テーブルSKと公開鍵テーブルPKを次のように設定する。なお、テーブルの大きさは各々L×Tビットである。
【００３３】
SK = {x[0], x[1], ..., x[T-1]}，
PK = {pk[0], pk[1], ..., pk[T-1]}
【００３４】
ここで、各x[i]（i=0,1,...,T-1）は、セグメントがとりうる値（整数値）の各々に対応する秘密鍵であり、いずれもLビットの乱数である。また、各pk[i]（i=0,1,...,T-1）は、各秘密鍵x[i]に対応する公開鍵である。すなわち、各pk[i]（i=0,1,...,T-1）は、セグメントがとりうる値（整数値）の各々に対応する公開鍵である。なお、各公開鍵pk[i] = f(x[i])である。
【００３５】
HORS署名における署名生成方法は、以下のステップを含む。
【００３６】
（B1-1）  送信メッセージMに対してm = H(M)を計算し、得たハッシュ値mを各々tビットのセグメントh[1], ..., h[k]に分割する。
（B1-2）  S = {s[1], ..., s[k]} = {x[h[1]], ..., x[h[k]]}をメッセージMに対する署名とする。
【００３７】
図12は、HORS署名における署名生成装置の構成例を示すブロック図である。図12に示す署名生成装置7１は、ハッシュ関数手段711と、セグメント分割手段712と、秘密鍵テーブル記憶手段713と、秘密鍵取得手段714とを備える。
【００３８】
ハッシュ関数手段711は、メッセージMに対して暗号学的なハッシュ関数を適用して、ハッシュ値mを生成する。セグメント分割手段712は、生成されたハッシュ値mを各々hビットのセグメントに分割する。秘密鍵テーブル記憶手段713は、秘密鍵テーブルSKを保持する。秘密鍵取得手段714は、秘密鍵テーブル記憶手段713に記憶されている秘密鍵テーブルSKから、各セグメントに対応する秘密鍵すなわちセグメントh[1], ..., h[k]のアドレスを持つエントリすなわち秘密鍵x[h[1]], ..., x[h[k]]を選択し、これをMの署名Sとする。
【００３９】
また、HORS署名における署名検証方法は、以下のステップを含む。
【００４０】
（B2-1）  受信メッセージMに対してm = H(M)を計算し、得たハッシュ値mを各々tビットのセグメントh[1], ..., h[k]に分割する。
（B2-2）  pk[h[i]] = f(s[i])がi=1,2,...,kの全てで成り立てば、受信メッセージMに対する署名Sの検証結果を成功とする。
【００４１】
HORS署名においては、ハッシュ関数および一方向性関数が安全であっても、公開鍵テーブルPKとメッセージMとその署名Sとを入手した攻撃者が、他のメッセージに対しても署名が可能となる場合がある。より具体的には、他のメッセージM'のハッシュ値mが、入手したメッセージMのハッシュ値から得たセグメントセグメント{h[1], ..., h[k]}に含まれれば署名が可能となる場合がある。ハッシュ関数が安全であれば攻撃者が他のメッセージに対して署名の偽造に成功する確率は、ランダムなnビットのハッシュ値に対して上記の条件が成立する確率となる。この確率をP_{HORS}とおくとr回署名を実行したときに偽造が成功する確率は、次の式（１）のように評価することができる。
【００４２】
P_{HORS} < (r×k/T)k  ・・・（１）
【００４３】
L以下のYに対して P_{HORS} < 2-Yが満たされるとき、HORS署名は「Yビットの安全性」を持つと言われる。これは、攻撃に成功するためには2Y個のオーダーのメッセージに対してハッシュ値を算出する必要があることを意味する。Tを大きくすることでr > 1でもP_{HORS}を小さくすることができるが、一定の安全性を満たすためにはTをrに比例して大きくする必要がある。しかし、Tをrに比例して大きくすると、公開鍵テーブルPKのデータサイズもrに比例して大きくなる。
【００４４】
ワンタイム署名では、秘密鍵と公開鍵のペア1つに対して、1度の署名のみが可能である。このため、公開鍵テーブルPKをメッセージ送信の度に受信者に配布しなければならない問題が発生するが、非特許文献3に記載されている一方向性関数f()のチェインを利用することで配布の回数を抑えることができる。ワンタイム署名では一回の署名に用いられる各公開鍵pk[i]は、対応する秘密鍵x[i]に対してf()を実行した値である。この性質を利用して、このf()を反復的に実行する長いチェインを予め生成して送信側で持っておくことにより、開示した秘密鍵x[i]を次の署名の公開鍵pk[i]として利用することが可能となる。受信側の通信装置では検証に成功した際に得られる秘密鍵x[i]を最新の公開鍵pk[i]として保持すればよいので公開鍵テーブルPKのデータサイズは変わらない。このような手法は、定期的にサーバから端末に対して情報を伝送する際のブロードバンド認証等に効果的に利用することができる。
【００４５】
しかし、一方向性関数f()のチェインを用いたとしても、安全性のためにTを大きくすれば、署名1回分に必要な公開鍵テーブルPKのデータサイズも大きくなるので、受信ノードのストレージリソースを圧迫する。センサーノードなどでは、ストレージ量に制限がある場合が多く、公開鍵テーブルPKのデータサイズは小さい方が望ましい。
【００４６】
このように、デジタル署名をセンサーネットワークシステムにおける通信に適用することを考えた場合、デジタル署名方式の比較において、計算量だけでなく、署名長や公開鍵テーブルのデータサイズも大きなファクターとなる。
【００４７】
そこで、本発明は、上述した点に鑑み、公開鍵テーブルのサイズおよび署名の検証にかかる計算量の増加を抑えつつ、安全かつ署名長を削減可能なワンタイム署名を実現するデジタル署名システム、通信装置、デジタル署名方法およびデジタル署名用プログラムを提供することを目的とする。
【課題を解決するための手段】
【００４８】
本発明によるデジタル署名システムは、送信メッセージに付与する署名を生成する署名生成手段を含む第1の通信装置と、受信メッセージに付与された署名を検証する署名検証手段を含む第2の通信装置とを備え、署名生成手段は、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第1のセグメント分割手段と、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第1のチェックサム算出手段と、チェックサムに対応する秘密鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルを保持する秘密鍵テーブル記憶手段と、各セグメントについて、テーブルインデックスを用いて秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、秘密鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する署名値生成手段とを有し、署名検証手段は、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第2のセグメント分割手段と、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第2のチェックサム算出手段と、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの対応するエントリに登録されている秘密鍵に対して一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルを保持する公開鍵テーブル記憶手段と、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する検証値生成手段と、各セグメントのテーブルインデックスを用いて公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した各セグメントの公開鍵と生成された各セグメントの検証値とを各々照合するとともに、公開鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成されたチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証する照合手段とを有することを特徴とする。
【００４９】
また、本発明による通信装置は、送信メッセージに付与する署名を生成する署名生成手段を備え、署名生成手段は、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第1のセグメント分割手段と、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第1のチェックサム算出手段と、チェックサムに対応する秘密鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルを保持する秘密鍵テーブル記憶手段と、各セグメントについて、テーブルインデックスを用いて秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、秘密鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する署名値生成手段とを含むことを特徴とする。
【００５０】
また、本発明による通信装置は、受信メッセージに付与された署名を検証する署名検証手段を備え、署名検証手段は、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する第2のセグメント分割手段と、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する第2のチェックサム算出手段と、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの対応するエントリに登録されている秘密鍵に対して一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルを保持する公開鍵テーブル記憶手段と、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する検証値生成手段と、各セグメントのテーブルインデックスを用いて公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した各セグメントの公開鍵と生成した各セグメントの検証値とを各々照合するとともに、公開鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成したチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証する照合手段とを含むことを特徴とする。
【００５１】
また、本発明によるデジタル署名方法は、メッセージの送信を行う第1の通信装置が、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、第1の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、第1の通信装置が、各セグメントについて、テーブルインデックスを用いて、チェックサムに対応する秘密鍵のエントリとテーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、チェックサムに対応する秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成することを特徴とする。
【００５２】
また、本発明によるデジタル署名方法は、メッセージの受信を行う第2の通信装置が、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、第2の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、第2の通信装置が、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成し、第2の通信装置が、各セグメントのテーブルインデックスを用いて、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの各エントリに登録されている秘密鍵に一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した公開鍵と生成された当該セグメントの検証値とを照合するとともに、チェックサムに対応する公開鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成されたチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証することを特徴とする。
【００５３】
また、本発明によるデジタル署名用プログラムは、メッセージの受信を行う通信装置において、受信したメッセージに付与された署名の検証を行うためのデジタル署名用プログラムであって、コンピュータに、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する処理、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する処理、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する処理、および各セグメントのテーブルインデックスを用いて、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの各エントリに登録されている秘密鍵に一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した公開鍵と生成された当該セグメントの検証値とを照合するとともに、チェックサムに対応する公開鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成されたチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証する処理を実行させることを特徴とする。
【発明の効果】
【００５４】
本発明によれば、公開鍵テーブルのサイズおよび署名の検証にかかる計算量の増加を抑えつつ、安全かつ署名長を削減可能なワンタイム署名を実現できる。
【図面の簡単な説明】
【００５５】
【図１】デジタル署名システムが備える装置の例を示すブロック図である。
【図２】第1の実施形態のデジタル署名システムの機能構成例を示すブロック図である。
【図３】署名生成手段110の構成例を示すブロック図である。
【図４】署名検証手段120の構成例を示すブロック図である。
【図５】第1の実施形態のデジタル署名システムの動作の一例を示すフローチャートである。
【図６】第1の実施形態のデジタル署名システムの動作の一例を示すフローチャートである。
【図７】デジタル署名の性能の比較例を示す説明図である。
【図８】デジタル署名の性能の比較例を示す説明図である。
【図９】本発明の概要を示すブロック図である。
【図１０】デジタル署名方式の概略を示す説明図である。
【図１１】LDW署名における署名生成装置の構成例を示すブロック図である。
【図１２】HORS署名における署名生成装置の構成例を示すブロック図である。
【発明を実施するための形態】
【００５６】
実施形態1．
以下、本発明の実施形態を図面を参照して説明する。図1は、第1の実施形態のデジタル署名システムが備える装置の例を示すブロック図である。図1に示すように、本実施形態のデジタル署名システムは、情報処理装置50を備えている。情報処理装置50は、演算部51、記憶部52および入出力部53を含む。情報処理装置50は、例えばプログラムに従って動作するサーバ装置、パーソナルコンピュータ、センサーノード等である。また、演算部51、記憶部52および入出力部53は、それぞれＣＰＵ、メモリおよび各種入出力装置（例えば、キーボード、マウス、ネットワークインタフェースその他のI/Oポート等）によって実現される。
【００５７】
また、図2は、第1の実施形態のデジタル署名システムの機能構成例を示すブロック図である。図2に示すデジタル署名システムは、通信装置100Aと、通信装置100Bとを備える。また、通信装置100Aは、署名生成手段110と通信手段130Aとを含む。通信装置100Bは、署名検証手段120と通信手段130Bとを含む。通信装置100Aと通信装置100Bとは、通信ネットワーク200を介して接続されている。通信装置100Aおよび通信装置100Bは、例えば図1に示すような情報処理装置50によって実現される。その場合、通信手段130Aおよび通信手段130Bは、入出力部53に含まれる。
【００５８】
図2において、通信装置100Aは署名を必要とするメッセージを送信する通信装置の例であり、通信装置100Bは通信装置100Aが送信したメッセージを受信する通信装置の例である。通信装置100Aはメッセージを送信するにあたり、署名生成手段110に署名を生成させる。通信装置100Aは、生成された署名をメッセージに付して、通信手段130Aを介して通信装置100Bに送信する。通信装置100Bでは、メッセージを受信すると、署名検証手段120に、受信したメッセージに付された署名の検証をさせる。通信装置100Bは、署名の検証の結果、正しい署名値であると判定された場合には、受信したメッセージは正規のメッセージであるとして通常の受信処理を行う。なお、正しい署名値でないと判定された場合には、その旨を出力してメッセージを隔離したり、破棄するなどのエラー処理を行う。なお、通信装置100Aは、上述したデジタル署名方式における署名生成装置に相当する。また、通信装置100Bは、上述したデジタル署名方式における署名検証装置に相当する。
【００５９】
なお、図1には、署名を必要とするメッセージの送信を行う通信装置と、そのメッセージの受信を行う通信装置とが各々1つしか示されていないが、送信を行う通信装置および受信を行う通信装置は複数であってもよい。また、１つの通信装置で署名を必要とするメッセージの送信と受信の両方を行う場合には、1つの通信装置が、署名生成手段110と署名検証手段120とを含んでいてもよい。
【００６０】
本発明による署名生成方法は、LDW署名における特徴である一方向性関数f()の反復実行と、HORS署名における特徴である秘密鍵テーブルSKからのハッシュ値に応じたエントリの選択という特徴を併せ持つ。また、ｆ()の反復実行の処理結果と、ハッシュ値に応じたエントリの選択処理の結果とをまとめるために、チェックサムの算出方法において、チェックサム要素抽出手段113,123を利用する。本発明による署名生成方法では、メッセージから得られるハッシュ値を、LDW署名の特徴に対応する深さインデックスとHORS署名の特徴に対応するテーブルインデックスとからなるセグメントに分割する。
【００６１】
本発明において使用されるパラメータは次の通りである。f()は一方向性関数を表す。また、Lは一方向性関数f()の入出力長すなわち入力パラメータのデータサイズ[bit]および出力パラメータのデータサイズ[bit]を表す。また、nはメッセージMに対応するハッシュ値mの長さ（データサイズ[bit]）を表す。また、H()はハッシュ値mを得るための暗号学的なハッシュ関数を表す。したがって、nはH()の出力長である。
【００６２】
また、ハッシュ値mを分割して得られる各セグメントをmm[1], ..., mm[k]と表す。各セグメントmm[i]（i=1,...,k）は、既に説明したように、f()の反復回数の特定に利用する深さインデックスw[i]と、秘密鍵テーブルSKまたは公開鍵テーブルPKのエントリの選択に利用するテーブルインデックスh[i]とによって構成される。すなわち、｛mm[1], ..., mm[k]} = {(h[1], w[1]), ..., (h[k], w[k]}である。なお、kはセグメントの分割数を表す。
【００６３】
また、tは各テーブルインデックスh[i]のデータサイズ[bit]を表す。したがって、T=2tとおくと、各テーブルインデックスh[i]は、0以上T未満の整数とみなすことができる。また、gは各深さインデックスw[i]のデータサイズ[bit]を表す。したがって、G=2gとおくと、各深さインデックスw[i]は、0以上G未満の整数とみなすことができる。なお、各セグメントmm[i]のデータサイズ[bit]は（t+g）であり、k = n/(t+g)の関係が成り立つ。
【００６４】
本実施形態では、秘密鍵テーブルSKおよび公開鍵テーブルPKを次のように設定する。なお、秘密鍵テーブルSKおよび公開鍵テーブルPKの大きさはともにL×(T+1)ビットである。
【００６５】
SK = {x[-1], x[0], x[1], ..., x[T-1]}，
PK = {pk[-1], pk[0], pk[1], ..., pk[T-1]}
【００６６】
ここで、x[-1]はチェックサムに対応する秘密鍵である。また、x[0]〜x[T-1]はテーブルインデックスのとりうる値（整数値）の各々に対応する秘密鍵である。各秘密鍵x[i]（i=-1,0,1,...,T-1）はいずれもLビットの乱数である。また、pk[-1]は秘密鍵x[-1]に対応する公開鍵である。したがって、pk[-1]はチェックサムに対応する公開鍵といえる。またpk[0]〜pk[T-1]は秘密鍵x[0]〜x[T-1]に対応する公開鍵である。したがって、x[0]〜x[T-1]はテーブルインデックスのとりうる値（整数値）の各々に対応する公開鍵といえる。ここで、pk[-1] = f{(G-1)×k}(x[-1])である。なお、pk[-1]におけるf()の反復回数cnt = (G-1)×kである。また、px[-1]以外の各px[i]（i=0,1,...,T-1） = f{G}(x[i])である。pk[i]（i=0,1,...,T-1）におけるf()の反復回数cnt = Gである。LDW署名では各pk[i]（i=0,...,k）を求める際に必要なf()の反復回数はG-1回であったが、本実施形態では各i（ただし、i=0,...,T-1）につき、G回である点に注意する。
【００６７】
また、本発明のデジタル署名方法により生成される署名Sは、S = {s[0], s[1], ..., s[k]}である。したがって、署名長はL×(k+1)ビットである。また、後述するように、署名検証におけるf()の実行回数は最大でG×kとなる。
【００６８】
まず、本実施形態における署名生成処理を説明する。
【００６９】
図3は、署名生成手段110の構成例を示すブロック図である。図3に示す署名生成手段110は、ハッシュ関数手段111と、セグメント分割手段112と、チェックサム要素抽出手段113と、加算手段114と、秘密鍵テーブル記憶手段115と、一方向性関数手段116とを含む。
【００７０】
ハッシュ関数手段111は、入力されたメッセージMに対して暗号学的なハッシュ関数H()を適用して、ハッシュ値mを生成する。暗号学的なハッシュ関数としては、SHA-1やSHA-256などを利用することができる。また、ハッシュ関数手段111は、必要に応じて出力長の制限や入力のパディングを行ってもよい。
【００７１】
セグメント分割手段112は、生成されたハッシュ値mを、各々(t+g)ビットの計k個のセグメントmm[1], ..., mm[k]に分割する。署名生成処理において、各h[i]は秘密鍵テーブルSKのエントリのインデックスとして利用される。また、各w[i]は署名値s[i]を生成する際のf()の反復回数を表す深さインデックスとして利用される。
【００７２】
チェックサム要素抽出手段113は、各セグメントmm[i]に含まれるテーブルインデックスの値と深さインデックスw[i]の値とに基づいて、チェックサムcの要素となるデータ（以下、チェックサム要素cc[]という）を抽出する。本実施形態では、セグメント集合{(h[1], w[1]), ..., (h[k], w[k])}に含まれるテーブルインデックスh[i]のうち値が他と異なるテーブルインデックスh[i']（i'=1,...,k'。k'は値が異なるテーブルインデックスの数）に対応する1つの値であって、当該テーブルインデックスh[i']と同じ値をもつテーブルインデックスh[i'_j]に対応する深さインデックスw[i'_j]の値に基づいて定まる1つの値を、チェックサム要素cc[i']として抽出する。簡単に言うと、チェックサム要素抽出手段113は、値が異なるhにつき、当該hと同じ値のhをもつwに基づく値を、チェックサム要素ccとして抽出する。
【００７３】
例えば、チェックサム要素抽出手段113は、分割されたセグメントmmのうちテーブルインデックスhの値が同じセグメントmm[j]からなるセグメント集合U[i']の各々に対して、当該セグメント集合U[i']に含まれる深さインデックスw[i'_j]の値から一意的に求まる値を、チェックサム要素cc[i']として抽出してもよい。
【００７４】
本実施形態では、値が異なるh[i']につき、当該h[i']と同じ値のhをもつw[i'_j]の最大値をチェックサム要素cc[i']として抽出する。なお、チェックサム要素抽出手段113は、各mm[i]のうちh[i]の値が他のいずれのmm[j]のh[j]とも一致しないmm[i]であれば、w[i]の値をそのまま最大値として抽出すればよい。一方、h[i]の値が他のいずれかのmm[j]のh[j]と一致するmm[i]であれば、当該h[i]と同じ値のhをもつmm[j]のw[j]の中から最大値を抽出する。例えば、各セグメントmmの中で、h[i'_1] = ... = h[i'_d]となるi'_j（j=1,...,d）があった場合には、w[i'_1],...,w[i'_d]のうちの最大値を、当該h[i']の値に対応するチェックサム要素cc[i']として抽出すればよい。例えば、k=5の場合に、h[1],h[2],h[3],h[4],h[5]の中でh[1]=h[3]=h[5]であった場合には、d=3でi_1=1,i_2=3,i_3=5となる。この場合、j=1,3,5として、U[i']={h[1]=h[3]=h[5]}に対して、w[1],w[3],w[5]のうちの最大値を、cc[i']として求めればよい。
【００７５】
加算手段114は、抽出されたチェックサム要素cc[i']を用いて、チェックサムcを算出する。加算手段114は、チェックサム要素抽出手段113によって抽出された各チェックサム要素cc[i']（i'=1,...,k'）を加算して、チェックサムcを算出する。したがって、本実施形態のチェックサムcは、値が異なるhにおけるwの最大値の和となる。
【００７６】
秘密鍵テーブル記憶手段115は、秘密鍵テーブルSK = {x[-1], x[0], ..., x[T-1]}を保持する。
【００７７】
一方向性関数手段116は、得られたチェックサムcと、各テーブルインデックスh[i]と、各深さインデックスw[i]とに基づいて、秘密鍵テーブルSKに含まれる秘密鍵に対して一方向性関数f()を適用し、署名S = {s[0], s[1], ..., s[k]}を生成する。ここで、s[0]はチェックサムに対応する署名値であり、s[i]（i=1,2,...,k）は各セグメントmm[i]に対応する署名値である。したがって、本実施形態における署名長はL×(k+1)ビットとなる。
【００７８】
一方向性関数手段116は、各セグメントmm[i]に対応する署名値s[i]（ただし、i=1,...,k）を次のようにして生成する。すなわち、i=1,...,kについて、秘密鍵テーブル記憶手段115に保持されている秘密鍵テーブルSKから、テーブルインデックスh[i]をアドレスにして当該セグメントに対応する秘密鍵x[h[i]]を読み出し、読み出した秘密鍵x[h[i]]に対して、f()を、深さインデックスw[i]に基づく所定の回数分反復的に適用することにより、s[i]を生成する。本実施形態では、各s[i]を生成する際の反復回数cnt = G-1-w[i]とする。
【００７９】
また、一方向性関数手段116は、チェックサムcに対応する署名値s[0]を次のように生成する。すなわち、秘密鍵テーブル記憶手段115に保持されている秘密鍵テーブルSKから、チェックサムに対応する秘密鍵x[-1]を読み出し、読み出した秘密鍵x[-1]に対して、f()を、チェックサムcに基づく所定の回数分反復的に適用することにより、s[0]を生成する。本実施形態では、s[0]を生成する際の反復回数cnt = cとする。
【００８０】
また、本実施形態の署名生成方法は、次のステップを含む。
【００８１】
（a-1）  入力されたメッセージMに対してハッシュ値mを求める。すなわち、m = H(M)を実行する。
（a-2）  得たハッシュ値mを各々(t+g)ビットのセグメントmm[1], ..., mm[k]に分割する。ここで、各mm[i] = (h[i], w[i])である。
（a-3）  値が異なるh[i']の各々についてwの最大値を求め、求めた各最大値をチェックサム要素cc[]とする。
（a-4）  求めた各チェックサム要素（値が異なる各hにおけるwの最大値）の和を算出し、チェックサムcとする。
（a-5）  i=1,...,kについて、秘密鍵テーブルSKからテーブルインデックスh[i]のアドレスの秘密鍵x[h[i]]を読み出し、読み出した秘密鍵x[h[i]]に対して、f()をG-1-w[i]回反復的に実行し、得られた値を署名値s[i]とする。すなわち、s[i] = f｛G-1-w[i]｝(x[h[i]])を計算する。
（a-6）  秘密鍵テーブルSKからチェックサムに対応する秘密鍵x[-1]を読み出し、読み出した秘密鍵x[-1]に対して、f()をc回反復的に実行し、得られた値を署名値s[0]とする。すなわち、s[0] = f｛c｝(x[-1])を計算する。
（a-7）  S = {s[0], s[1], ..., s[k]}をMに対する署名とする。
【００８２】
次に、本実施形態における署名検証処理を説明する。以下、署名検証処理では、検証対象とするメッセージをM、そのメッセージに付された署名をS={s[0], s[1], ..., s[k]}で表す。
【００８３】
図4は、署名検証手段120の構成例を示すブロック図である。図4に示す署名検証手段120は、ハッシュ関数手段121と、セグメント分割手段122と、チェックサム要素抽出手段123と、加算手段124と、公開鍵テーブル記憶手段125と、一方向性関数手段126と、照合手段127とを含む。
【００８４】
ハッシュ関数手段121は、上述したハッシュ関数手段111と同様の処理を行う。すなわち、ハッシュ関数手段121は、メッセージMに対して暗号学的なハッシュ関数H()を適用して、ハッシュ値mを生成する。
【００８５】
セグメント分割手段122は、上述したセグメント分割手段112と同様の処理を行う。すなわち、セグメント分割手段122は、生成されたハッシュ値mを、各々(t+g)ビットの計k個のセグメントmm[1], ..., mm[k]に分割する。
【００８６】
チェックサム要素抽出手段123は、上述したチェックサム要素抽出手段113と同様の処理を行う。すなわち、チェックサム要素抽出手段123は、各セグメントmm[i]に含まれるテーブルインデックスの値と深さインデックスw[i]の値とに基づいて、チェックサム要素cc[]を抽出する。なお、本実施形態では、チェックサム要素抽出手段123は、値が異なるhにつき、当該hと同じ値のhをもつwに基づく値を、チェックサム要素ccとして抽出する。
【００８７】
加算手段124は、上述した加算手段114と同様の処理を行う。すなわち、加算手段124は、抽出されたチェックサム要素cc[]を用いて、チェックサムcを算出する。
【００８８】
公開鍵テーブル記憶手段125は、上述した公開鍵テーブルPK = {pk[-1], pk[0], ..., pk[T-1]}を保持する。
【００８９】
一方向性関数手段126は、得られたチェックサムcと、各テーブルインデックスh[i]と、各深さインデックスw[i]とに基づいて、入力された署名Sに対して一方向性関数f（）を所定回数適用し、検証値V =｛v[0], v[1], ..., v[k]｝を生成する。ここで、v[0]はチェックサムに対応する検証値であり、v[i]（i=1,2,...,k）は各セグメントmm[i]に対応する検証値である。
【００９０】
一方向性関数手段126は、セグメントmm[i]に対応する検証値v[i]を次のようにして生成する。すなわち、i=1,...,kについて、入力された署名Sに含まれる署名値s[i]に対して、f()を、深さインデックスw[i]に基づく所定の回数分反復的に適用することにより、v[i]を生成する。本実施形態では、各v[i]を生成する際の反復回数cnt = w[i]+1とする。
【００９１】
また、一方向性関数手段126は、チェックサムcに対応する検証値v[0]を次のように生成する。すなわち、入力された署名Sに含まれる署名値s[0]に対して、f()を、チェックサムcに基づく所定の回数分適用することにより、s[0]を生成する。本実施形態では、v[0]を生成する際の反復回数cnt = (G-1)×k-cとする。したがって、本実施形態における署名検証に必要なf()の実行回数は最大でG×kとなる（各w[i]の最大値がGであり、チェックサムcの最小値が0であることによる）。
【００９２】
照合手段127は、公開鍵テーブルPKに保持されている公開鍵と、算出された検証値Vとに基づいて、入力された署名Sを検証する。これにより、入力されたメッセージMの正当性を確認する。照合手段127は、v[0] = pk[-1]、かつi=1,...,kについていずれもv[i] = pk[h[i]]であれば、署名結果を”成功（OK）”とする。そうでなければ、検証結果を”失敗（NG）”とする。
【００９３】
また、本実施形態の署名検証方法は、次のステップを含む。
【００９４】
（b-1）  入力されたメッセージMに対してハッシュ値mを求める。すなわち、m = H(M)を実行する。
（b-2）  得たハッシュ値mを各々(t+g)ビットのセグメントmm[1], ..., mm[k]に分割する。ここで、各mm[i] = (h[i], w[i])である。
（b-3）  値が異なるh[i']の各々についてwの最大値を求め、求めた各最大値をチェックサム要素cc[]とする。
（b-4）  求めた各チェックサム要素（値が異なる各hにおけるwの最大値）の和を算出し、チェックサムcとする。
（b-5）  i=1,...,kについて、入力された署名Sに含まれる署名値s[i]に対して、f()をw[i]+1回反復的に実行し、得られた値をv[i]とする。すなわち、v[i] = f｛w[i]+1｝(s[i])を計算する。
（b-6）  入力された署名Sに含まれる署名値s[0]に対して、f()を(G-1)×k-c回反復的に実行し、得られた値をv[0]とする。すなわち、v[0] = f｛(G-1)×k-c｝(s[0])を計算する。
（b-7）  v[0] = pk[-1]、かつi=1,…,kについていずれもv[i] = pk[h[i]]が成り立てば、検証結果を”成功”とする。
【００９５】
上記のステップb-5において、s[i]が正しい署名値であればs[i] = f｛G-1-w[i]｝(x[h[i])であり、正規のメッセージであればv[i] = f｛w[i]+1｝(s[i]) = f｛G｝(x[h[i]])となり、これはpk[h[i]]と一致する。また、ステップb-6において、s[0]が正しい署名値であればs[0] = f｛G｝(x[-1])であり、正規のメッセージであればチェックサムcも送受信時で同一のため、v[0] = f｛(G-1)×k-c｝(s[0]) = f｛(G-1)×k｝(x[-1])となり、これはpk[-1]と一致する。
【００９６】
ハッシュ関数H()と一方向性関数f()が安全であるという仮定の下、攻撃者が署名Sの偽造に成功する確率は、公開鍵テーブルPKと正規のメッセージMのハッシュ値mとその署名Sとを入手した状況でランダムなハッシュ値m’を生成したときにその正しい署名S'の生成に成功する確率となる。mのセグメントをmm[]={(h[1], w[1]),...,(h[k], w[k])}, m'のセグメントをmm'[]={(h'[1],w'[1]),...,(h'[k], w'[k])}とする。すべてのjについて(h'[i], w'[i]) ∈ {(h[1], w[1]),...,(h[k], w[k])}が成り立てばm’に対する署名生成は可能である。本発明のデジタル署名方式において偽造が成功する条件はm’のセグメントが次の2つの条件を満たす時である。
【００９７】
（条件1）  すべてのi（i=1,...,k）についてh'[i] ∈ {h[1],…,h[k]}である。
（条件2）  0 ≦ a < Tに対して、max_{i:h'[i]=a} w'[i] = max_{j:h[j]=a} w[j]が成り立つ。ここで、”max_{j:h[j]=a} w[j]” は上記のステップa-3、ステップb-3で示した処理すなわち、h[j] = aとなるjについてw[j]の最大値を選択する処理である。h[j] = aとなるjが存在しない場合はmax_{j:h[j]=a} w[j] = 0とする。
【００９８】
上記のステップb-5からわかるように、h'[i]が{h[1],...,h[k]}に含まれない場合、秘密鍵テーブルSKを知らない攻撃者は、pk[h'[i]]のf()の逆像を求める処理が必要となる。よってm'の署名偽造に成功する場合には、条件1が成り立つ。一方、本実施形態のチェックサムの算出方法は条件2の等式が成り立つことを保証する。条件1および条件2が成り立つためには、h'[i]がj ≠ iに対して一致するh'[j]が存在しないときにおいて、署名生成に成功するために(h'[i], w'[i]) ∈ {(h[j], w[j]): j=1,...,k}となることが必要となる。本実施形態のチェックサムの算出方法によれば、署名の偽造が可能なm’を絞ることが可能となり、署名長や公開鍵テーブルのデータサイズ（より具体的にはエントリ数）を小さくしても安全性を保つことができる。
【００９９】
本実施形態において、ハッシュ関数手段111、セグメント分割手段112、チェックサム要素抽出手段113、加算手段114および一方向性関数手段116は、例えば、情報処理装置50が備える演算部51や、その他のプログラムに従って動作するCPU等によって実現される。また、秘密鍵テーブル記憶手段115は、例えば、情報処理装置50が備える記憶部52や、その他の記憶装置によって実現される。また、ハッシュ関数手段121、セグメント分割手段122、チェックサム要素抽出手段123、加算手段124、一方向性関数手段126および照合手段127は、例えば、情報処理装置50が備える演算部51や、その他のプログラムに従って動作するCPU等によって実現される。また、公開鍵テーブル記憶手段125は、例えば、情報処理装置50が備える記憶部52や、その他の記憶装置によって実現される。
【０１００】
次に、本実施形態の動作について説明する。図5および図6は、本実施形態のデジタル署名システムの動作の一例を示すフローチャートである。なお、図5は、署名生成処理の処理フローの一例を示すフローチャートであり、図6は、署名検証処理の処理フローの一例を示すフローチャートである。
【０１０１】
まず、図5を参照して本実施形態による署名生成処理の処理フローを説明する。図5に示す例では、まず署名の付与対象とされるメッセージMが入力される（ステップS101）。メッセージMが入力されると、ハッシュ関数手段111がハッシュ値mを算出する（ステップS102）。なお、ステップS102は、上述したステップa-1に相当する。
【０１０２】
次いで、セグメント分割手段112が、ハッシュ値mを、各々(t+g)ビットの計k個のセグメントmm[1],...,mm[k]（ただし、mm[i]=(h[i], w[i])）に分割する（ステップS103）。なお、ステップS103は、上述したステップa-2に相当する。
【０１０３】
次いで、チェックサム要素抽出手段113が、各セグメントmm[i]のテーブルインデックスh[i]および深さインデックスw[i]の値に基づき、値が異なる各hにおけるwの最大値をチェックサム要素cc[]として抽出する（ステップS104）。なお、ステップS104は、上述したステップa-3に相当する。
【０１０４】
次いで、加算手段114が各チェックサム要素ccを加算して、チェックサムcを算出する（ステップS105）。なお、ステップS105は、上述したステップa-4に相当する。
【０１０５】
次いで、一方向性関数手段116が、i=1,...,kについて、h[i]をアドレスに用いて秘密鍵テーブルSKから当該セグメントに対応する秘密鍵x[h[i]]を読み出し、読み出した秘密鍵x[h[i]]に対して、f()をG-1-w[i]回反復的に実行して、署名値s[i]を生成する（ステップS106）。なお、ステップS106は、上述したステップa-5に相当する。
【０１０６】
次いで、一方向性関数手段116が、秘密鍵テーブルSKからチェックサムに対応する秘密鍵x[-1]を読み出し、読み出した秘密鍵x[-1]に対して、f()をc回反復的に実行して、署名値s[0]を生成する（ステップS107）。なお、ステップS107は、上述したステップa-6に相当する。
【０１０７】
最後に、一方向性関数手段116が、S = {s[0], s[1], ..., s[k]}をMに対する署名として出力する（ステップS108）。なお、ステップS108は、上述したステップa-7に相当する。
【０１０８】
次に、図6を参照して本実施形態による署名検証処理の処理フローを説明する。図6に示す例では、まず、受信したメッセージMとそのメッセージに付された署名Sとが入力される（ステップS201）。メッセージMと署名Sとが入力されると、ハッシュ関数手段121がハッシュ値mを算出する（ステップS202）。なお、ステップS202は、上述したステップb-1に相当する。
【０１０９】
次いで、セグメント分割手段122が、ハッシュ値mを、各々(t+g)ビットの計k個のセグメントmm[1],...,mm[k]（ただし、mm[i]=(h[i], w[i])）に分割する（ステップS203）。なお、ステップS203は、上述したステップb-2に相当する。
【０１１０】
次いで、チェックサム要素抽出手段123が、各セグメントmm[i]のテーブルインデックスh[i]および深さインデックスw[i]の値に基づき、値が異なる各hにおけるwの最大値をチェックサム要素cc[]として抽出する（ステップS204）。なお、ステップS204は、上述したステップb-3に相当する。
【０１１１】
次いで、加算手段124が各チェックサム要素ccを加算して、チェックサムcを算出する（ステップS205）。なお、ステップS205は、上述したステップb-4に相当する。
【０１１２】
次いで、一方向性関数手段126が、i=1,...,kについて、入力された署名Sに含まれる署名値s[i]に対して、f()をw[i]+1回反復的に実行し、検証値v[i]を生成する（ステップS206）。なお、ステップS206は、上述したステップb-5に相当する。
【０１１３】
次いで、一方向性関数手段126が、入力された署名Sに含まれる署名値s[0]に対して、f()を(G-1)×k-c回反復的に実行し、検証値v[0]を生成する（ステップS207）。なお、ステップS207は、上述したステップb-6に相当する。
【０１１４】
次いで、照合手段127が、公開鍵テーブルPKからチェックサムに対応する公開鍵pk[-1]を読み出して、v[0]とpk[-1]とを照合するとともに、i=1,…,kについて、h[i]をアドレスに用いて公開鍵テーブルPKから当該セグメントに対応する公開鍵pk[i]を読み出して、v[i]とpk[h[i]]とを照合する（ステップS208）。そして、照合手段127は、v[0] = pk[-1]、かつi=1,…,kの全てでv[i] = pk[h[i]]が成り立てば、検証結果を”成功”とする（ステップS209のYes，ステップS210）。一方、いずれか1つでも成り立たなければ、検証結果を”失敗”とする（ステップS209のNo，ステップS211）。なお、ステップS208〜S211は、上述したステップb-7に相当する。
【０１１５】
以上のように、本実施形態では、HORS署名を拡張して、LDW署名における反復処理を導入している。すなわち、メッセージMのハッシュ値mの一部のビット（より具体的にはw[1],...,w[k]）を一方向性関数の反復回数を定めるために割り当てている。このため、仮に公開鍵テーブルのエントリ数がHORS署名と同一である場合には、セグメント数kをHORS署名に比べて小さくできる。セグメント数kを小さくできれば、署名長を小さくできる。HORS署名のセグメントh[i]のデータサイズt[bit]は公開鍵テーブルのデータサイズ（エントリのビット数×エントリ数）への影響から比較的小さく設定されることが多く（8から10ビットが典型的）、セグメント数kが大きくなりやすい。なお、反復処理を導入すると、署名の検証にかかる計算量は増加するが、計算量の増加量を抑えるために反復回数に割り当てるビット数gを小さくても、HORS署名と同程度のhのデータサイズであれば、セグメント数削減の効果を十分に得ることができる。このように、反復回数に割り当てるビット数gを好適に設定することで、署名の検証にかかる計算量の増加を抑えつつ、署名長を小さくできる。また、本実施形態のチェックサムの算出方法によれば、攻撃者が署名の偽造が可能なメッセージの範囲を効果的に絞ることができるので、署名長を抑えても安全性を保つことができる。すなわち、公開鍵テーブルPKのサイズおよび署名の検証にかかる計算量の増加を抑えて、安全かつ署名長を削減可能なワンタイム署名を実現できる。
【０１１６】
図7は、80ビットの安全性をターゲットにした場合の本実施形態のデジタル署名、LDW署名およびHORS署名の性能の比較例を示す説明図である。なお、図7に示す比較例において、各デジタル署名の設定は次の通りである。一方向性関数f()の出力長はL = 80である。また、ハッシュ関数H()の出力長nは160以上であり、SHA-1を適用する。また、LDW署名はg=4、G=16およびk=40とし、HORS署名はt=8、T=256およびk=20とした。また、本実施形態のデジタル署名は、n=160、g=2、G=4、t=8、T=256およびk=16とした。なお、署名検証計算量はf()を実行する回数を表している。また、安全性［bit］は、攻撃者が署名の偽造に成功するための計算量が2Y以上のオーダーとなることを表している。LDW署名の安全性は、一方向性関数f()の安全性のみに依存するため、Lビットで表される。一方、HORS署名および本実施形態の安全性は、攻撃者が公開鍵テーブルPKとメッセージMと署名Sとを入手したとして、他のメッセージM'のハッシュ値m'がランダムになると仮定したときのそのメッセージM'に対する署名の生成に成功する確率の上界から求めた。
【０１１７】
図7に示されるように、本実施形態のデジタル署名では、HORS署名と同程度の公開鍵テーブルサイズで署名長を15%削減でき、かつ安全性を向上させることができる。このとき、署名の検証にかかる計算量は4倍に増大するが、LDW署名と比較して1/7程度に抑えることができており、RSAなどの既存のデジタル署名方式と比較しても十分小さく抑えることができる。
【０１１８】
また、図8は、128ビットの安全性をターゲットにした場合の本実施形態のデジタル署名、LDW署名およびHORS署名の性能の比較例を示す説明図である。図8に示す比較例において、各デジタル署名の設定は次の通りである。すなわち、一方向性関数f()の出力長はL = 128とした。また、ハッシュ関数H()の出力長nは256以上であり、SHA-256またはSHA-512を適用する。また、LDW署名は、n=256、g=4、G=16およびk=64とした。また、HORS署名は、n=261、t=9、T=512およびk=29とした。また、本実施形態のデジタル署名は、n=264、g=2、G=4、t=9、T=512およびk=24とした。
【０１１９】
図7に示される80ビットセキュリティの場合と同様、本実施形態のデジタル署名においても、HORS署名と同程度の公開鍵テーブルサイズで署名長を10%削減でき、かつ安全性を向上させることができる。また、署名の検証にかかる計算量も、LDW署名と比較して1/8程度に抑えることができている。
【０１２０】
なお、上記では各チェックサム要素ccとして、wの最大値を用いる例を示したが、各チェックサム要素はwの最大値に限られない。例えばwの最小値であってもよい。なお、チェックサム要素ccは各々が加算されてチェックサムcとなり、署名値Sに含まれるs[0]を算出する際にf()の反復回数に反映されるものであることから、安全性の点でwの最大値であることが好ましい。ただし、一方向性関数手段116におけるｆ()の適用の仕方を変えた場合には、最大値と最小値の関係は逆転する。例えば、上記のステップa-5において各iについてf()の反復回数をG-1-w[i]からw[i]に変更した場合は、各チェックサム要素ccにwの最小値を用いるのが好ましい。
【０１２１】
以上のように、本実施形態によれば、公開鍵テーブルPKのデータサイズと署名の検証にかかる計算量の増加を抑えて安全かつ署名長が小さい署名方式を実現することができる。また、t, gのパラメータを調節することで、トレードオフの関係にある公開鍵テーブルPKのデータサイズ、署名の検証にかかる計算量および安全性の３つのファクターに対して、設定の自由度を上げることができる。
【０１２２】
実施形態2．
次に、本発明による第2の実施形態を説明する。第2の実施形態ではチェックサムの算出方法を次のように変更する。すなわち、チェックサム要素抽出手段113およびチェックサム要素抽出手段123は、値が異なるh[i']の個数k'を新たなチェックサム要素として加える。
【０１２３】
本実施形態において、チェックサム要素抽出手段113およびチェックサム要素抽出手段123は、チェックサム要素ccとして、値が異なる各hにおけるwの最大値に加えて、値が異なるh[i']の個数kを抽出する。したがって、本実施形態のチェックサムcは、値が異なる各hにおけるwの最大値の和に、値が異なるh[i']の個数k'が加算した値となる。なお、チェックサム要素抽出手段113およびチェックサム要素抽出手段123は、値が異なる各hにつき、wの最大値+1をチェックサム要素として抽出してもよい。値が異なる各hにおけるwの最大値w_maxをそれぞれ(w_max+1)とすることにより、和をとった時に個数を別途加算する方法と同じ結果が得られる。
【０１２４】
このときチェックサムの最大値はG×kとなるため、公開鍵pk[-1]もf｛G×k｝(x[-1])に変更する。この修正により、m'の署名偽造に成功するためには、上述した条件1とは逆にすべてのjについてh[j] ∈ {h'[1],...,h'[k]}が成り立つことも必要となり、署名の偽造が可能なm'の範囲を一層小さくすることが可能となる。なお、代償として、チェックサムに対応する検証値v[0]生成時のf()の実行回数がk回増えるが、kを小さくできることに加えて、指数的に増えるわけではないので、その影響は少ない。第1の実施形態においてg=0すなわちG=1とすると、チェックサムcが常に0となるのでHORS署名と同じものになるが、本実施形態のチェックサムの算出方法はそのような場合にも適用可能である。つまり、本実施形態によれば、g=0とすれば、HORS署名と比べて、チェックサムの追加にかかる署名長、テーブルサイズおよび計算量の増加が多少発生するが、安全性を向上させることができる。すなわち、HORS署名と比べて、署名長および公開鍵テーブルサイズがLビット大きくなり、f()の実行回数が最大でk回増えるが、それだけの増加で安全性を向上させることができる。
【０１２５】
なお、図示省略しているが、80ビットセキュリティをターゲットにした場合のLDW署名およびHORS署名との比較において、本実施形態のデジタル署名のパラメータをg=0、G=1、t=8、T=256、k=20として、上述したチェックサムの算出方法すなわち値が異なるh[]の値をさらに加算する方法を用いた場合には、本実施形態のハッシュ値に対する偽造可能性に関する安全性は83.7ビットとなり、署名全体ではメッセージのハッシュ値が衝突する80ビットの安全性となる。このように、図7に示したHORS署名の安全性である73.5ビットよりも本実施形態のデジタル署名の安全性を高くできる。
【実施例】
【０１２６】
次に、第１の実施形態の実施例を示す。本発明では、目標とする安全性に応じてパラメータを設定する。例えば、80ビットの安全性を目安にする場合にはメッセージMのハッシュ長n=160[bit]とし、一方向性関数f()の入出力長L=80と設定する。以下、この設定において、セグメントmmの分割サイズ(t+g)を10[bit]、すなわちテーブルインデックスhのサイズt= 8[bit]、深さインデックスwのサイズg=2[bit]とした場合の第1の実施形態の動作を説明する。なお、T=2t=256、G=2g=4である。また、n=(t+g)×kの関係から、セグメント数k=16である。ハッシュ関数H()は非特許文献2に記載されているSHA-1などを用いることができる。
【０１２７】
また、一方向性関数f()は、暗号学的なハッシュ関数の出力長を制限するなどして実現できるが、出力長を制限した場合には、事前計算でテーブルを作成して実際の値が参照される攻撃に注意する。この課題に対しては、saltと呼ばれるパラメータを導入することが一般的に行われている。すなわち、saltを鍵として鍵付のハッシュ関数H()を一方向性関数f()に利用することにより、上述したような攻撃の脅威を軽減することができる。鍵付のハッシュ関数の一例が、例えば非特許文献4に記載されている。
【０１２８】
例えば、一方向性関数としての鍵付のハッシュ関数を指定するsaltを公開鍵テーブルPKの生成時に変更し、公開鍵テーブルPKの送付時にsaltも送付することで一方向性関数を変更しながら署名生成・検証を行うことが可能となる。saltを十分に大きな乱数で生成することで攻撃者が事前計算でテーブルを作成することを困難にすることが可能となる。さらに安全性を向上させるためには、公開鍵テーブルPKのエントリ毎に異なるsaltを設定したり、秘密鍵-公開鍵の一方向性関数のチェインの中でステージに応じて異なるsaltを設定する方法も考えられる。ここで、チェインは、秘密鍵x[i]→f(x[i])→f{2}(x[i])→・・・→公開鍵f{G-1}(x[i])といったシーケンスを指す。また、ステージは、チェインの中のf{cnt}()のcntを指す。すなわち、f()の実行回数に応じて異なるsaltを設定してもよい。具体的には、salt[cnt_max]を用意しておき、f{cnt}(x[i])をf{cnt}(salt[cnt], x[i])に変更すればよい。
【０１２９】
［鍵生成（事前準備）］
送信者（もしくは管理者）の指示により、通信装置100Aは、秘密鍵テーブルSKと公開鍵テーブルPKとを生成する。具体的には、通信装置100Aは、T+1=257個のL=80ビットの乱数x[-1],x[0],x[1],...,x[255]を生成することにより、秘密鍵テーブルSKをSK = {x[-1],x[0],x[1],...,x[255]}を生成する。続いて、通信装置100Aは、公開鍵テーブルPK = {pk[-1],pk[0],pk[1],...,pk[255]}を、次のようにして生成する。
【０１３０】
pk[-1] = f{48}(x[-1])
pk[i]（i=0,1,...,255） = f{4}(x[i])
【０１３１】
すなわち、G=4より、秘密鍵x[0],...,x[255]に対して各々4回、x[-1]に対しては(G-1)×k = 48回、f()を反復的に適用して、公開鍵テーブルPK = {pk[-1],pk[0],…,pk[255]}を生成する。
【０１３２】
本例では、SHA-1を一方向性関数f()として用いる。通信装置100Aは、必要に応じてf()を指定するsaltを生成する。そして、通信装置100Aは、生成した公開鍵テーブルPKと、あれば生成したsaltとを、通信装置100Bに送信する。なお、通信装置100Bは複数あってもよい。この送信の際には現在有効な秘密鍵テーブルSK-公開鍵テーブルPKを用いた署名生成・検証を行ってもよい。新規の受信者となる通信装置100Bに対しては、送信者と受信者の間の秘密鍵を用いて個別に送信してもよい。
【０１３３】
［署名生成］
（a-1）  送信者の通信装置100Aにおいてハッシュ関数手段111が、送信メッセージMに対してハッシュ関数SHA-1を適用してハッシュ値mを得る。mの長さn=160ビットである。
（a-2）  セグメント分割手段112は、ハッシュ値mをk=16個のセグメント{mm[1],...,mm[k]}={(h[1], w[1]),...,(h[16], w[16])}に分割する。h[i]はテーブルインデックスであってサイズt=8ビットである。w[i]は深さインデックスであってサイズg = 2ビットである。h[i]は0以上255以下の整数、w[i]は0以上3以下の整数と解釈する。以下、{(h[1], w[1]),...,(h[16], w[16])}として、次の値が得られたとする。
【０１３４】
(h[1], w[1])  = (120,1)、
(h[2], w[2])  = (5, 2)、
(h[3], w[3])  = (19, 0)、
(h[4], w[4])  = (200, 1)、
(h[5], w[5])  = (192, 0)、
(h[6], w[6])  = (220, 1)、
(h[7], w[7])  = (11, 1)、
(h[8], w[8])  = (200, 3)、
(h[9], w[9])  = (250, 3)
(h[10], w[10]) = (181, 2)、
(h[11], w[11]) = (87, 1)、
(h[12], w[12]) = (5, 1)
(h[13], w[13]) = (200, 3)、
(h[14], w[14]) = (45, 1)、
(h[15], w[15]) = (150, 1)、
(h[16], w[16]) = (40, 3)
【０１３５】
（a-3）  チェックサム要素抽出手段113は、チェックサム要素ccを抽出する。本例では、h[i]が一致しているセグメントの組みは、h[2]=h[12]=5である{mm[1],mm[12]}と、h[4]=h[8]=h[13]=200である{mm[4],mm[8],mm[13]}の2組である。これらのセグメントについては、当該組みの中で値が最大のw[i]を選択する。本例では、第1の組みからはw[2]=2が選択され、第2の組みからはw[8]（またはw[13])=3が選択される。それ以外のセグメントmm[i]（i=1,3,4,5,6,7,9,10,11,14,15,16）については、自身のw[i]が最大値であるとして、各々w[i]が選択される。本例では、チェックサム要素cc[]として、w[12],w[4],w[13]を除いた{w[1],w[2],w[3],w[5],w[6],w[7],w[8],w[9],w[10],w[11],w[14],w[15],w[16]}が抽出される。
【０１３６】
（a-4）  加算手段114は、抽出された各チェックサム要素を加算して、チェックサムcを算出する。本例では、チェックサムcを、w[12],w[4],w[13](またはw[8])を除いたw[i]の和として計算する。計算結果を以下に示す。
【０１３７】
c = w[1]+w[2]+w[3]+w[5]+w[6]+w[7]+w[8]+w[9]+w[10]+w[11]+w[14]+w[15]+w[16]
= 1+2+0+0+1+1+3+3+2+1+1+1+3 = 19
【０１３８】
（a-5）  一方向性関数手段116は、各i=1,...,16について、(h[i], w[i])を基に、s[i] = f{G-1-w[i]}(x[h[i]])を計算する。各iについての反復回数および使用される秘密鍵は次の通りである。ここで、f{1}(x) = f(x)、f{0}(x) = xである。
【０１３９】
s[1] = f{2}(x[120])、
s[2] = f(x[5])、
s[3] = f{3}(x[19])、
s[4] = f{2}(x[200])、
s[5] = f{3}(x[192])、
s[6] = f{2}(x[220])、
s[7] = f{2}(x[11])、
s[8] = x[200]、
s[9] = x[250]、
s[10] = f(x[181])、
s[11] = f{2}(x[87])、
s[12] = f{2}(x[5])、
s[13] = x[200]、
s[14] = f{2}(x[45])、
s[15] = f{2}(x[150])、
s[16] = x[40]
【０１４０】
（a-6）  一方向性関数手段116は、チェックサムcから対応する署名値s[0]を次のように計算する。
【０１４１】
s[0] = f{19}(x[-1])
【０１４２】
（a-7）  一方向性関数手段116は、求めたS = {s[0], s[1], ..., s[k]}をMに対する署名として出力する。なお、各s[i]（i=0,1,...,k）の長さはL=80ビットである。したがって、署名長L×(k+1)=80×(16+1)=560ビットである。
【０１４３】
［署名検証］
（b-1）  受信者の通信装置100Bにおいてハッシュ関数手段121が、受信メッセージMに対してハッシュ関数SHA-1を適用してハッシュ値mを得る。mの長さn=160ビットである。また、署名S = (s[0],s[1],...,s[16])とする（各s[i]はL=80ビット）。
（b-2）  セグメント分割手段122は、ハッシュ値mをk=16個のセグメント{mm[1],...,mm[k]}={(h[1], w[1]),...,(h[16], w[16])}に分割する。h[i]はテーブルインデックスでt=8ビットであり、w[i]は深さインデックスでg = 2ビットである。h[i]は0以上255以下の整数、w[i]は0以上3以下の整数と解釈する。以下、{(h[1], w[1]),...,(h[16], w[16])}として、次の値が得られたとする。
【０１４４】
(h[1], w[1])  = (120,1)、
(h[2], w[2])  = (5, 2)、
(h[3], w[3])  = (19, 0)、
(h[4], w[4])  = (200, 1)、
(h[5], w[5])  = (192, 0)、
(h[6], w[6])  = (220, 1)、
(h[7], w[7])  = (11, 1)、
(h[8], w[8])  = (200, 3)、
(h[9], w[9])  = (250, 3)
(h[10], w[10]) = (181, 2)、
(h[11], w[11]) = (87, 1)、
(h[12], w[12]) = (5, 1)
(h[13], w[13]) = (200, 3)、
(h[14], w[14]) = (45, 1)、
(h[15], w[15]) = (150, 1)、
(h[16], w[16]) = (40, 3)
【０１４５】
（b-3）  チェックサム要素抽出手段123は、チェックサム要素ccを抽出する。本例では、チェックサム要素cc[]として、w[12],w[4],w[13]を除いた{w[1],w[2],w[3],w[5],w[6],w[7],w[8],w[9],w[10],w[11],w[14],w[15],w[16]}が抽出される。
【０１４６】
（b-4）  加算手段124は、抽出された各チェックサム要素を加算して、チェックサムcを算出する。本例では、チェックサムcを、w[12],w[4],w[13](またはw[8])を除いたw[i]の和として計算する。計算結果を以下に示す。
【０１４７】
c = w[1]+w[2]+w[3]+w[5]+w[6]+w[7]+w[8]+w[9]+w[10]+w[11]+w[14]+w[15]+w[16]
= 1+2+0+0+1+1+3+3+2+1+1+1+3 = 19
【０１４８】
（b-5）  一方向性関数手段126は、各i=1,...,16について、s[i]とw[i]とを基に、検証値v[i] = f{w[i]+1}(s[i])を計算する。各iについての反復回数および使用される秘密鍵は次の通りである。ここで、f{1}(x) = f(x)、f{0}(x) = xである。
【０１４９】
v[1] = f{2}(s[1])、
v[2] = f{3}(s[2])、
v[3] = f(s[3])、
v[4] = f{2}(s[4])、
v[5] = f(s[5])、
v[6] = f{2}(s[6])、
v[7] = f{2}(s[7])、
v[8] = f{4(s[8])、
v[9] = f{4}(s[9])、
v[10] = f{3}(s[10])、
v[11] = f{2}(s[11])、
v[12] = f{2}(s[12])、
v[13] = f{4}(s[13])、
v[14] = f{2}(s[14])、
v[15] = f{2}(s[15])、
v[16] = f{4}(s[16])
【０１５０】
（b-6）  一方向性関数手段126は、s[0]とチェックサムcとを基に、チェックサムに対応する検証値v[0] = f{48-19=29}(x[0])を計算する。
【０１５１】
（b-7）  照合手段127は、v[0] = pk[-1]、かつ各i=1,…,16についていずれもv[i] = pk[h[i]]が成り立てば、検証結果を”成功”とする。例えば、受信した署名Sが、本実施例のステップa-5で生成された署名値であれば、ステップb-6およびb-7からv[0],v[1],...,v[16]は次のようになる。
【０１５２】
v[0] = f{48-19}(s[0]) = f{19+(48-19)}(x[-1]) = f{148}(x[-1])、
v[1] = f{2}(s[1]) = f{4}(x[120])、
v[2] = f{3}(s[2]) = f{4}(x[5])、
v[3] = f(s[3]) = f{4}(x[19])、
v[4] = f{2}(s[4]) = f{4}(x[200])、
v[5] = f(s[5]) = f{4}(x[192])、
v[6] = f{2}(s[6]) = f{4}(x[220])、
v[7] = f{2}(s[7]) = f{4}(x[11])、
v[8] = f{4(s[8]) = f{4}(x[200])、
v[9] = f{4}(s[9]) = f{4}(x[250])、
v[10] = f{3}(s[10]) = f{4}(x[181])、
v[11] = f{2}(s[11]) = f{4}(x[87])、
v[12] = f{2}(s[12]) = f{4}(x[5])、
v[13] = f{4}(s[13]) = f{4}(x[200])、
v[14] = f{2}(s[14]) = f{4}(x[45])、
v[15] = f{2}(s[15]) = f{4}(x[150])、
v[16] = f{4}(s[16]) = f{4}(x[40])
【０１５３】
これらv[0],v[1],...,v[16]は、公開鍵テーブルPKの対応する秘密鍵pk[-1], pk[h[1]],..., pk[h[16]]と一致する。
【０１５４】
次に、第2の実施例として、一方向性関数f()のチェインを用いて公開鍵テーブルPKの送信回数を抑える方法の実施例を示す。
【０１５５】
なお、本実施例におけるパラメータの設定は、図7に示した80ビットレベルセキュリティの場合と同様である。本実施例では、公開鍵テーブルPKの送信回数を抑えるために、当該公開鍵テーブルPKにおいて有効とする署名回数を新たにパラメータに加える。ここで、署名回数r=10であるとする。
【０１５６】
1回の公開鍵テーブルPKの送信につきr回の署名を有効とする場合、送信者の通信装置100Aは、公開鍵テーブルPKの生成処理で、各公開鍵pk[i]を求める際のf()の反復回数を各々r倍する。具体的には、通信装置100Aは公開鍵テーブルPKを次のように生成する。すなわち、公開鍵pk[-1]を、秘密鍵x[-1]に対して、f()を(G-1)×k×r=480回反復的に適用して生成する。また、公開鍵pk[i]（i=0,...,T-1）を、秘密鍵x[i]に対して、f()をG×r=40回反復的に適用して生成する。公開鍵テーブルPKの生成処理を纏めると以下の通りである。
【０１５７】
PK = {pk[-1], pk[0], pk[1], …, pk[255]) = (f{480}(x[-1]), f{40} (x[0]), f{40}(x[1]),...,f{40}(x[255])}
【０１５８】
通信装置100Aは、このような公開鍵テーブルPKを受信者の通信装置100Bに配布する。通信装置100Bは、通信装置100Aから受信した公開鍵テーブルPKを初期の公開鍵テーブルPKとする。
【０１５９】
なお、鍵生成に用いる秘密鍵テーブルSKと区別するため、各回の署名で使用される秘密鍵テーブルSKを、SK = {sk[-1], sk[0], sk[1], ..., sk[T-1]}と記す。本実施例において各回の署名で使用される秘密鍵sk[i]（i=-1,0,...,255）は、1つ前の署名で使用された公開鍵pk[i]から1ステップ戻った値となる。すなわち、1つ前の回で秘密鍵x[i]に対して反復回数をr倍した場合には反復回数をr-1倍にして得た値とする。具体的には、通信装置100Aは次の回の秘密鍵テーブルSKを次のように生成する。すなわち、秘密鍵x[-1]に対して、f()を(G-1)×k×(r-1)=432回反復的に適用して、秘密鍵sk[-1]を生成する。また、秘密鍵x[i]（i=0,...,T-1）に対して、f()をG×(r-1)=36回反復的に適用して、秘密鍵sk[i]を生成する。この秘密鍵テーブルSKの生成処理を纏めると以下の通りである。
【０１６０】
SK = {sk[-1], sk[0], sk[1], …, sk[255]} = {f{432}(x[-1]), f{36}(x[0]), f{36}(x[1]),...,f{36}(x[255])}
【０１６１】
ここで、送信者の通信装置100Aから、1回目の署名として、あるメッセージMに付して、w[i]=2を基に生成されたs[i] = f{3-2} (sk[h[i]]) = f{37}(x[h[i]])を含む署名Sが送信されたとする。このような場合には、1回目の署名に関する処理が完了した後、受信者の通信装置100Bは、公開鍵pk[h[i]]をs[i] = f{37}(x[h[i]])に変更し、送信者の通信装置100Aは、秘密鍵sk[h[i]]をf{37-4}(x[h[i]]) = f{33}(x[h[i]])に変更して、次のメッセージの署名を行う。他のiに対する署名値s[i]についても同様である。チェックサムについても同様であって、仮にc=15であれば1回目の署名における署名値s[0] = f{15}(sk[-1])=f{447}(x[-1])に基づいて、受信者の通信装置100Bは公開鍵pk[-1]をs[0] = f{447}(x[-1])に変更し、送信者の通信装置100Aは秘密鍵sk[-1]をf{447-48}(x[-1]) = f{399}(x[-1])に変更して次のメッセージの署名を行う。このような更新処理を署名の度に行う。そして、10回目の署名が終わると、新たな公開鍵テーブルが送信者の通信装置100Aから送信される。
【０１６２】
次に、本発明の概要を説明する。本発明は、メッセージから得たハッシュ値の各ビットを、秘密鍵テーブルまたは公開鍵テーブルのエントリを定めるためのテーブルインデックスとして用いられる第1種ビットと、一方向性関数の反復回数を定めるための深さインデックスとして用いられる第2種ビットとに分け、第1種ビットによって示される値に基づいて秘密鍵テーブルまたは公開鍵テーブルを参照して得られる秘密鍵または公開鍵と、第2種ビットによって示される値に基づいて定まる反復回数とを用いて、メッセージに付与する署名を生成するまたはメッセージに付与された署名を検証することを特徴とする。
【０１６３】
ハッシュ値を2種類のビットに分け、一方を反復回数の特定に用い、他方をテーブルのエントリの特定に用いることによって、同程度の公開鍵テーブルのエントリ数をもつHORS署名と比較してセグメント数kを小さくでき、その結果として署名長を小さくできる。
【０１６４】
また、図9は、本発明による通信装置の他の構成を示すブロック図である。なお、図9（a）に示される通信装置60Aが送信側の通信装置（第1の通信装置ともいう。）であって、図9（b）に示される通信装置60Bが受信側の通信装置（第2の通信装置ともいう。）である。
【０１６５】
図9（a）に示す通信装置60Aは、署名生成手段610を備える。また、署名生成手段610は、セグメント分割手段611と、チェックサム算出手段612と、署名値算出手段613と、秘密鍵テーブル記憶手段614とを含む。
【０１６６】
また、図9（b）に示す通信装置60Bは、署名検証手段620を備える。また、署名検証手段620は、セグメント分割手段621と、チェックサム算出手段622と、検証値算出手段623と、照合手段624と、公開鍵テーブル記憶手段625とを含む。
【０１６７】
セグメント分割手段611（例えば、セグメント分割手段112）は、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する。なお、セグメント分割手段611は、第1のセグメント分割手段とも呼ばれる。ここで、ハッシュ値のうち、各セグメントにおいてテーブルインデックスに割り当てられたビットが上述した第1種ビットに相当する。また、ハッシュ値のうち、各セグメントにおいて深さインデックスに割り当てられたビットが上述した第2種ビットに相当する。
【０１６８】
チェックサム算出手段612（例えば、チェックサム要素抽出手段113および加算手段114）は、セグメント分割手段611によって分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する。なお、チェックサム算出手段612は、第1のチェックサム算出手段とも呼ばれる。
【０１６９】
秘密鍵テーブル記憶手段614（例えば、秘密鍵テーブル記憶手段115）は、チェックサムに対応する秘密鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルを保持する。
【０１７０】
署名値生成手段613（例えば、一方向性関数手段116）は、各セグメントについて、テーブルインデックスを用いて秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、秘密鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する。
【０１７１】
また、セグメント分割手段621（例えば、セグメント分割手段122）は、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する。なお、セグメント分割手段621は、第2のセグメント分割手段とも呼ばれる。
【０１７２】
チェックサム算出手段622（例えば、チェックサム要素抽出手段123および加算手段124）は、セグメント分割手段621によって分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する。なお、チェックサム算出手段622は、第2のチェックサム算出手段とも呼ばれる。
【０１７３】
公開鍵テーブル記憶手段625（例えば、公開鍵テーブル記憶手段125）は、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの対応するエントリに登録されている秘密鍵に対して一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルを保持する。
【０１７４】
検証値生成手段623（例えば、一方向性関数手段126）は、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成する。
【０１７５】
照合手段624（例えば、照合手段127）は、各セグメントのテーブルインデックスを用いて公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した各セグメントの公開鍵と生成された各セグメントの検証値とを各々照合するとともに、公開鍵テーブルからチェックサムに対応する秘密鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成されたチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証する。
【０１７６】
以上のような構成によって、公開鍵テーブルのサイズおよび署名の検証にかかる計算量の増加を抑えて、安全かつ署名長を削減可能なワンタイム署名を実現できる。
【０１７７】
また、本発明のデジタル署名システムは、上述した通信装置60Aと、上述した通信装置60Bとを備えていてもよい。
【０１７８】
また、本発明のデジタル署名システムは、深さインデックスのサイズをgビットとした場合に、G=2gとすると、公開鍵テーブルのエントリのうちテーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、G回、一方向性関数を反復的に適用して得られる値が登録されており、公開鍵テーブルのチェックサムに対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、((G-1)×k)回、一方向性関数を反復的に適用して得られる値が登録されており、第1のチェックサム算出手段または第2のチェックサム算出手段は、テーブルインデックスの値が同じセグメントからなるセグメント集合の各々から、当該セグメント集合に含まれる深さインデックスの最大値を抽出し、抽出された最大値の和をとってチェックサムとし、送信メッセージに付される署名に含まれる各セグメントの署名値は、送信メッセージから得た各セグメントのテーブルインデックスが指す秘密鍵テーブルのエントリに登録されている秘密鍵に対して、当該セグメントの深さインデックスの値をw[i]とすると、(G-1-w[i])回、一方向性関数を反復的に適用して得られた値であり、送信メッセージに付される署名に含まれるチェックサムの署名値は、秘密鍵テーブルのチェックサムに対応するエントリに登録されている秘密鍵に対して、送信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、c回、一方向性関数を反復的に適用して得られた値であり、受信メッセージに付与された署名の検証用に生成される各セグメントの検証値は、受信メッセージに付与された署名に含まれる各セグメントの署名値に対して、当該セグメントの深さインデックスの値をw[i]とすると、(w[i]+1)回、一方向性関数を反復的に適用して得られた値であり、受信メッセージに付与された署名の検証用に生成されるチェックサムの検証値は、受信メッセージに付与された署名に含まれるチェックサムの署名値に対して、受信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、((G-1)×k-c)回、一方向性関数を反復的に適用して得られた値であってもよい。
【０１７９】
また、本発明のデジタル署名システムは、深さインデックスのサイズをgビットとした場合に、G=2gとすると、公開鍵テーブルのエントリのうちテーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、G回、一方向性関数を反復的に適用して得られる値が登録されており、公開鍵テーブルのチェックサムに対応する公開鍵のエントリに、当該公開鍵に対応する秘密鍵に対して、(G×k)回、一方向性関数を反復的に適用して得られる値が登録されており、第1のチェックサム算出手段または第2のチェックサム算出手段は、テーブルインデックスの値が同じセグメントからなるセグメント集合の各々から、当該セグメント集合に含まれる深さインデックスの最大値を抽出し、抽出された最大値の各々に+1した値の和をとってチェックサムとし、送信メッセージに付される署名に含まれる各セグメントの署名値は、送信メッセージから得た各セグメントのテーブルインデックスが指す秘密鍵テーブルのエントリに登録されている秘密鍵に対して、当該セグメントの深さインデックスの値をw[i]とすると、(G-1-w)回、一方向性関数を反復的に適用して得られた値であり、送信メッセージに付される署名に含まれるチェックサムの署名値は、秘密鍵テーブルのチェックサムに対応するエントリに登録されている秘密鍵に対して、送信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、c回、一方向性関数を反復的に適用して得られた値であり、受信メッセージに付与された署名の検証用に生成される各セグメントの検証値は、受信メッセージに付与された署名に含まれる各セグメントの署名値に対して、当該セグメントの深さインデックスの値をw[i]とすると、(w[i]+1)回、一方向性関数を反復的に適用して得られた値であり、受信メッセージに付与された署名の検証用に生成されるチェックサムの検証値は、受信メッセージに付与された署名に含まれるチェックサムの署名値に対して、受信メッセージから得たセグメントから算出されたチェックサムの値をcとすると、(G×k-c)回、一方向性関数を反復的に適用して得られた値であってもよい。
【０１８０】
また、本発明のデジタル署名システムは、g=0、G=1であり、かつ各セグメントの深さインデックスの値が全て0であってもよい。
【０１８１】
また、本発明のデジタル署名システムは、一方向性関数として、鍵付きのハッシュ関数を用い、公開鍵テーブル生成時または公開鍵テーブルのエントリに応じて鍵付きのハッシュ関数の鍵が指定されてもよい。
【０１８２】
以上、実施形態及び実施例を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【０１８３】
また、上記の実施形態の一部または全部は、以下の付記のようにも記載されうるが、以下には限られない。
【０１８４】
（付記１）
メッセージの送信を行う第1の通信装置が、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、第1の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、第1の通信装置が、各セグメントについて、テーブルインデックスを用いて、チェックサムに対応する秘密鍵のエントリとテーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、チェックサムに対応する秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成し、メッセージの受信を行う第2の通信装置が、受信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割し、第2の通信装置が、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出し、第2の通信装置が、受信メッセージに付与された署名に含まれる署名値のうち各セグメントの署名値に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの検証値を生成するとともに、受信メッセージに付与された署名に含まれる署名値のうちチェックサムの署名値に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの検証値を生成し、第2の通信装置が、各セグメントのテーブルインデックスを用いて、チェックサムに対応する公開鍵のエントリと、テーブルインデックスがとりうる整数値の各々に対応する公開鍵のエントリとを含む公開鍵テーブルであって、各エントリに、秘密鍵テーブルの各エントリに登録されている秘密鍵に一方向性関数を適用して得られる公開鍵が登録されている公開鍵テーブルから各セグメントに対応する公開鍵を読み出し、読み出した公開鍵と生成された当該セグメントの検証値とを照合するとともに、チェックサムに対応する公開鍵を読み出し、読み出したチェックサムに対応する公開鍵と生成されたチェックサムの検証値とを照合して、受信メッセージに付与された署名を検証することを特徴とするデジタル署名方法。
【０１８５】
（付記２）
メッセージの送信を行う通信装置において、送信メッセージに付与する署名の生成を行うためのデジタル署名用プログラムであって、コンピュータに、送信メッセージに対して暗号学的なハッシュ関数を適用して得られるハッシュ値を、所定サイズのテーブルインデックスと所定サイズの深さインデックスとの組からなるセグメントに分割する処理、分割されたセグメントのうちテーブルインデックスの値が同じセグメントからなるセグメント集合の各々に対して当該セグメント集合に含まれる深さインデックスの値から一意的に求まる値に基づいて、チェックサムを算出する処理、および各セグメントについて、テーブルインデックスを用いて、チェックサムに対応する秘密鍵のエントリとテーブルインデックスがとりうる整数値の各々に対応する秘密鍵のエントリとを含む秘密鍵テーブルから秘密鍵を読み出し、読み出した秘密鍵に対して、一方向性関数を、深さインデックスに基づいて決定される回数分反復的に適用して各セグメントの署名値を生成するとともに、チェックサムに対応する秘密鍵に対して、一方向性関数を、算出されたチェックサムに基づいて決定される回数分反復的に適用してチェックサムの署名値を生成する処理を実行させるためのデジタル署名用プログラム。
【産業上の利用可能性】
【０１８６】
本発明は、署名を必要とするメッセージ通信を行う装置、システム、方法およびプログラムに適用可能であって、特に、センサーネットワークシステムなど、サーバまたは基地局からのブロードキャスト通信やマルチキャスト通信を行う装置、システム、方法およびプログラムに好適に適用可能である。
【符号の説明】
【０１８７】
50  情報処理装置
51  演算部
52  記憶部
53  入出力部
100A、100B  通信装置
110  署名生成手段
120  署名検証手段
130A、130B  通信手段
200  通信ネットワーク
111、121、711、811  ハッシュ関数手段
112、122、712、812  セグメント分割手段
113、123  チェックサム要素抽出手段
114、124、813  加算手段
115、713、814  秘密鍵テーブル記憶手段
116、126  一方向性関数手段
125  公開鍵テーブル記憶手段
127  照合手段
714  秘密鍵取得手段
60A、60B  通信装置
610、91  署名生成手段
611  セグメント分割手段
612  チェックサム算出手段
613  署名値算出手段
614  秘密鍵テーブル記憶手段
620、92  署名検証手段
621  セグメント分割手段
622  チェックサム算出手段
623  検証値算出手段
624  照合手段
625  公開鍵テーブル記憶手段
【図１】
2015082804.tif 000003
【図２】
2015082804.tif 000004
【図３】
2015082804.tif 000005
【図４】
2015082804.tif 000006
【図５】
2015082804.tif 000007
【図６】
2015082804.tif 000008
【図７】
2015082804.tif 000009
【図８】
2015082804.tif 000010
【図９】
2015082804.tif 000011
【図１０】
2015082804.tif 000012
【図１１】
2015082804.tif 000013
【図１２】
2015082804.tif 000014