(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2022-09-20
(54)【発明の名称】ハッシュベースのデジタル署名スキームにおける暗号ハッシュ木のノードの管理
(51)【国際特許分類】
H04L 9/32 20060101AFI20220912BHJP
G06F 21/64 20130101ALI20220912BHJP
【FI】
H04L9/32 200B
H04L9/32 200E
G06F21/64
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2022501266
(86)(22)【出願日】2019-12-04
(85)【翻訳文提出日】2022-03-01
(86)【国際出願番号】 CA2019051744
(87)【国際公開番号】W WO2021003550
(87)【国際公開日】2021-01-14
(32)【優先日】2019-07-11
(33)【優先権主張国・地域又は機関】US
(81)【指定国・地域】
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
(71)【出願人】
【識別番号】518220637
【氏名又は名称】イサラ コーポレイション
(74)【代理人】
【識別番号】100094569
【氏名又は名称】田中 伸一郎
(74)【代理人】
【識別番号】100103610
【氏名又は名称】▲吉▼田 和彦
(74)【代理人】
【識別番号】100109070
【氏名又は名称】須田 洋之
(74)【代理人】
【識別番号】100067013
【氏名又は名称】大塚 文昭
(74)【代理人】
【識別番号】100086771
【氏名又は名称】西島 孝喜
(74)【代理人】
【識別番号】100109335
【氏名又は名称】上杉 浩
(74)【代理人】
【識別番号】100120525
【氏名又は名称】近藤 直樹
(74)【代理人】
【識別番号】100139712
【氏名又は名称】那須 威夫
(74)【代理人】
【識別番号】100176418
【氏名又は名称】工藤 嘉晃
(72)【発明者】
【氏名】パルゼル マレク
(57)【要約】
一部の態様では、暗号ハッシュ木のノードがバッファメモリに記憶される。アクティブ部分木のノードがバッファメモリ内のインデックス付き場所の第1のセットに記憶され、将来の部分木のノードがバッファメモリのインデックス付き場所の第2のセットに記憶される。署名インデックスの現在の値に関連付けられた署名鍵に基づいてワンタイム署名(OTS)が生成される。バッファメモリからノードのサブセットを取り出すことによってOTSの認証パスが生成される。将来の部分木の新規ノードが署名インデックスの現在の値に基づいて計算され、バッファメモリに記憶される。次に、署名インデックスが現在の値から署名インデックスの次の値に前進させられる。
【選択図】
図6
【特許請求の範囲】
【請求項1】
方法であって、
アクティブ部分木のノードの第1のサブセットをバッファメモリ内のインデックス付き場所の第1のセットに記憶することと、
将来の部分木のノードの第2のサブセットを前記バッファメモリ内のインデックス付き場所の第2のセットに記憶することとを含み、前記アクティブ部分木と前記将来の部分木とが同じサイズの重なり合わない部分木である、
暗号ハッシュ木のノードを前記バッファメモリに記憶することと、
署名インデックスの現在の値に関連付けられた署名鍵に基づいてワンタイム署名(OTS)を生成することであって、前記署名インデックスの前記現在の値は前記アクティブ部分木の現在の葉ノードに関連付けられる、OTSを生成することと、
前記署名インデックスの前記現在の値に基づいて前記OTSの認証パスを生成することであって、前記バッファメモリからノードの前記第1のサブセットのうちの1つまたは複数のノードを取り出すことを含む、認証パスを生成することと、
メッセージ受信側に送信するために、前記OTSと前記認証パスとを含むデジタル署名を提供することと、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することと、
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することと、
前記署名インデックスを前記現在の値から前記署名インデックスの次の値に前進させることとを含む、方法。
【請求項2】
インデックス付き場所の前記第1のセットのうちの第1の記憶場所に記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとを含む、請求項1に記載の方法。
【請求項3】
前記アクティブ部分木と前記将来の部分木とは高さKの部分木であって、ノードの前記第1のサブセットと前記第2のサブセットの中のノードの合計数が2
K+(K-2)に等しい、請求項1に記載の方法。
【請求項4】
前記バッファメモリは下位ノードキャッシュを含み、
前記アクティブ部分木と前記将来の部分木とはそれぞれ、前記暗号ハッシュ木のカットオフレベルより下のノードを含み、
前記認証パスを生成することは、上位ノードキャッシュから前記暗号ハッシュ木の前記カットオフレベルより上の1つまたは複数のノードを取り出すことを含む、請求項1に記載の方法。
【請求項5】
前記アクティブ部分木に関連付けられたOTS状態をOTSキャッシュに記憶することを含み、前記OTS署名を生成することは、前記署名インデックスの前記現在の値に関連付けられた前記OTS状態のうちの1つまたは複数のOTS状態を使用することを含む、請求項4に記載の方法。
【請求項6】
前記上位ノードキャッシュの第1の記憶場所に記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとを含む、請求項4に記載の方法。
【請求項7】
前記バッファメモリは循環バッファメモリを含み、インデックス付き場所の前記第1のセットは連続しており、インデックス付き場所の前記第2のセットは連続している、請求項1~6のいずれか1項に記載の方法。
【請求項8】
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することは、前記バッファメモリから前記アクティブ部分木の前記ノードを枯渇させ、前記署名インデックスの前記次の値が前記将来の部分木内の葉ノードに関連付けられる、請求項7に記載の方法。
【請求項9】
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することは、前記新規ノードを第1のインデックス値に関連付けられた第1の記憶場所に記憶することを含み、前記方法は、前記署名インデックスの前記現在の値に基づいて前記第1のインデックス値を特定することを含む、請求項1~6のいずれか1項に記載の方法。
【請求項10】
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することは、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の葉ノードのインデックスを特定することと、
前記葉ノードの前記インデックスに基づいて前記将来の部分木の前記新規ノードを計算することとを含む、請求項1~6のいずれか1項に記載の方法。
【請求項11】
前記方法は、前記署名インデックスの値が一連の値をたどって前進するにつれて、前記将来の部分木の新規葉ノードを逆順に計算するハッシュベースの署名スキームに従って実行される、請求項1~6のいずれか1項に記載の方法。
【請求項12】
前記ハッシュベースの署名スキームに従って、前記将来の部分木の各新規ノードが前記署名インデックスのそれぞれの現在の値に基づいて計算され、前記将来の部分木の各新規ノードを計算することは、前記暗号ハッシュ木の1つの葉ノードのみを計算するだけで済む、請求項11に記載の方法。
【請求項13】
コンピュータシステムであって、
バッファメモリと、
1つまたは複数のプロセッサと、
命令を記憶するメモリとを含み、前記命令は、前記1つまたは複数のプロセッサによって実行されると、
アクティブ部分木のノードの第1のサブセットをバッファメモリ内のインデックス付き場所の第1のセットに記憶することと、
将来の部分木のノードの第2のサブセットを前記バッファメモリ内のインデックス付き場所の第2のセットに記憶することとを含み、前記アクティブ部分木と前記将来の部分木とが同じサイズの重なり合わない部分木である、
暗号ハッシュ木のノードを前記バッファメモリに記憶することと、
署名インデックスの現在の値に関連付けられた署名鍵に基づいてワンタイム署名(OTS)を生成することであって、前記署名インデックスの前記現在の値は前記アクティブ部分木の現在の葉ノードに関連付けられる、OTSを生成することと、
前記署名インデックスの前記現在の値に基づいて前記OTSの認証パスを生成することであって、前記バッファメモリからノードの前記第1のサブセットのうちの1つまたは複数のノードを取り出すことを含む、認証パスを生成することと、
メッセージ受信側に送信するために、前記OTSと前記認証パスとを含むデジタル署名を提供することと、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することと、
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することと、
前記署名インデックスを前記現在の値から前記署名インデックスの次の値に前進させることとを含む、動作を行うように動作可能な、コンピュータシステム。
【請求項14】
前記動作は、
インデックス付き場所の前記第1のセットのうちの第1の記憶場所において前記バッファメモリに記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとを含む、請求項13に記載のコンピュータシステム。
【請求項15】
前記アクティブ部分木と前記将来の部分木とは高さKの部分木であって、ノードの前記第1のサブセットと前記第2のサブセットの中のノードの合計数が2
K+(K-2)に等しい、請求項13に記載のコンピュータシステム。
【請求項16】
前記バッファメモリは下位ノードキャッシュを含む第1のバッファメモリであり、
前記システムは、上位ノードキャッシュを含む第2のバッファメモリをさらに含み、
前記アクティブ部分木と前記将来の部分木とはそれぞれ、前記暗号ハッシュ木のカットオフレベルより下のノードを含み、
前記認証パスを生成することは、前記上位ノードキャッシュから前記暗号ハッシュ木の前記カットオフレベルより上の1つまたは複数のノードを取り出すことを含む、請求項13に記載のコンピュータシステム。
【請求項17】
前記動作は、前記アクティブ部分木に関連付けられたOTS状態をOTSキャッシュに記憶することを含み、前記OTS署名を生成することは、前記署名インデックスの前記現在の値に関連付けられた前記OTS状態のうちの1つまたは複数のOTS状態を使用することを含む、請求項16に記載のコンピュータシステム。
【請求項18】
前記動作は、
前記上位ノードキャッシュの第1の記憶場所に記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとを含む、請求項16に記載のコンピュータシステム。
【請求項19】
前記バッファメモリは循環バッファメモリを含み、インデックス付き場所の前記第1のセットは連続しており、インデックス付き場所の前記第2のセットは連続しており、前記将来の部分木の前記新規ノードを前記循環バッファメモリに記憶することは、前記循環バッファメモリ内のインデックス付き場所の前記第1のセットと前記第2のセットとの境界をシフトさせる、請求項13~18のいずれか1項に記載のコンピュータシステム。
【請求項20】
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することは、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の葉ノードのインデックスを特定することと、
前記葉ノードの前記インデックスに基づいて前記将来の部分木の前記新規ノードを計算することとを含み、
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することは、前記新規ノードを第1のインデックス値に関連付けられた第1の記憶場所に記憶することを含み、前記動作は、前記署名インデックスの前記現在の値に基づいて前記第1のインデックス値を特定することを含む、請求項13~18のいずれか1項に記載のコンピュータシステム。
【請求項21】
前記動作は、前記署名インデックスの値が一連の値をたどって前進するにつれて前記将来の部分木の新規葉ノードを逆順に計算するハッシュベースの署名スキームに従って実行され、
前記ハッシュベースの署名スキームに従って、
前記将来の部分木の各新規ノードが前記署名インデックスのそれぞれの現在の値に基づいて計算され、
前記将来の部分木の各新規ノードを計算することは、前記暗号ハッシュ木の1つの葉ノードのみを計算するだけで済む、請求項13~18のいずれか1項に記載のコンピュータシステム。
【請求項22】
命令を記憶する非一過性のコンピュータ可読媒体であって、前記命令は、データ処理装置によって実行されると、
アクティブ部分木のノードの第1のサブセットをバッファメモリ内のインデックス付き場所の第1のセットに記憶することと、
将来の部分木のノードの第2のサブセットを前記バッファメモリ内のインデックス付き場所の第2のセットに記憶することとを含み、前記アクティブ部分木と前記将来の部分木とが同じサイズの重なり合わない部分木である、
暗号ハッシュ木のノードを前記バッファメモリに記憶することと、
署名インデックスの現在の値に関連付けられた署名鍵に基づいてワンタイム署名(OTS)を生成することであって、前記署名インデックスの前記現在の値は前記アクティブ部分木の現在の葉ノードに関連付けられる、OTSを生成することと、
前記署名インデックスの前記現在の値に基づいて前記OTSの認証パスを生成することであって、前記バッファメモリからノードの前記第1のサブセットのうちの1つまたは複数のノードを取り出すことを含む、認証パスを生成することと、
メッセージ受信側に送信するために、前記OTSと前記認証パスとを含むデジタル署名を提供することと、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することと、
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することと、
前記署名インデックスを前記現在の値から前記署名インデックスの次の値に前進させることとを含む、動作を行うように動作可能な、非一過性のコンピュータ可読媒体。
【請求項23】
インデックス付き場所の前記第1のセットのうちの第1の記憶場所に記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとをさらに含む、請求項22に記載のコンピュータ可読媒体。
【請求項24】
前記アクティブ部分木と前記将来の部分木とは高さKの部分木であって、ノードの前記第1のサブセットと前記第2のサブセットの中のノードの合計数が2
K+(K-2)に等しい、請求項22に記載のコンピュータ可読媒体。
【請求項25】
前記バッファメモリは下位ノードキャッシュを含み、
前記アクティブ部分木と前記将来の部分木とはそれぞれカットオフレベルKより下のノードを含み、
前記認証パスを生成することは、前記暗号ハッシュ木の前記カットオフレベルより上の1つまたは複数のノードを上位ノードキャッシュから取り出す動作を含む、請求項22に記載のコンピュータ可読媒体。
【請求項26】
前記動作は、前記アクティブ部分木に関連付けられたOTS状態をOTSキャッシュに記憶することを含み、前記OTS署名を生成することは、前記署名インデックスの前記現在の値に関連付けられた前記OTS状態のうちの1つまたは複数のOTS状態を使用することを含む、請求項25に記載のコンピュータ可読媒体。
【請求項27】
前記動作は、
前記上位ノードキャッシュの第1の記憶場所に記憶されている右ノードを特定することと、
前記第1の記憶場所において前記右ノードをその左の兄弟ノードに置き換えることとを含む、請求項25に記載のコンピュータ可読媒体。
【請求項28】
前記バッファメモリは循環バッファメモリを含み、インデックス付き場所の前記第1のセットは連続しており、インデックス付き場所の前記第2のセットは連続しており、前記将来の部分木の前記新規ノードを前記循環バッファメモリに記憶することは、前記循環バッファメモリにおけるインデックス付き場所の前記第1のセットと前記第2のセットとの境界をシフトさせる、請求項22~25のいずれか1項に記載のコンピュータ可読媒体。
【請求項29】
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の新規ノードを計算することは、
前記署名インデックスの前記現在の値に基づいて前記将来の部分木の葉ノードのインデックスを特定することと、
前記葉ノードの前記インデックスに基づいて前記将来の部分木の前記新規ノードを計算することとを含み、
前記将来の部分木の前記新規ノードを前記バッファメモリに記憶することは、前記新規ノードを第1のインデックス値に関連付けられた第1の記憶場所に記憶することを含み、前記動作は、前記署名インデックスの前記現在の値に基づいて前記第1のインデックス値を特定することを含む、請求項22~25のいずれか1項に記載のコンピュータ可読媒体。
【請求項30】
前記動作は、前記署名インデックスの値が一連の値をたどって前進するにつれて前記将来の部分木の新規葉ノードを逆順に計算するハッシュベースの署名スキームに従って実行され、
前記ハッシュベースの署名スキームに従って、
前記署名インデックスのそれぞれの現在の値に基づいて前記将来の部分木の各新規ノードが計算され、
前記将来の部分木の各新規ノードを計算することは、前記暗号ハッシュ木の1つの葉ノードのみを計算するだけで済む、請求項22~25のいずれか1項に記載のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
本出願は、2019年7月11日に出願された米国特許出願第16/508,809号の優先権を主張し、その開示が参照により本明細書に組み込まれる。
【背景技術】
【0002】
以下の説明は、ハッシュベースのデジタル署名スキームのための暗号ハッシュ木のノードを記憶するバッファメモリの管理に関する。
【発明の概要】
【発明が解決しようとする課題】
【0003】
パブリックチャネルを介して安全に通信するために暗号システムが使用される。暗号システムの中には、デジタル署名の使用により真正性を与えるものがある。マークル署名スキーム(Merkle Signature Scheme:MSS)は暗号ハッシュ木(たとえばマークル木)とワンタイム署名(one-time signature:OTS)とを使用して、1つの公開鍵についていくつかのデジタル署名を生成し、検証する。
【課題を解決するための手段】
【0004】
本明細書に記載の一部の態様では、マークル署名スキーム(MSS)または他の種類のハッシュベースの署名スキームが、通信システムにおけるデジタル署名の生成と検証のために暗号ハッシュ木(たとえばマークル木)を使用する。暗号ハッシュ木は、OTSスキームの検証鍵に基づいて生成可能である。暗号ハッシュ木の葉ノードは、それぞれの検証鍵から生成可能であり、暗号ハッシュ木におけるより上位の各ノードは、暗号ハッシュ木におけるそのノードの直下の2つのノードの組み合わせに適用されるハッシュ関数の出力に基づいて生成可能である。ハッシュ関数は、任意の適切なハッシュ関数であってよく、公に知られていてもよい。ハッシュ関数は、任意の適切な方式で2つのより下位のノードの組み合わせに適用可能である。一例として、ハッシュ関数はより下位のノードの連結に適応可能である。態様によっては、ハッシュベースの署名スキームが、ランポート-ディフィーOTSスキーム、ウィンターニッツOTSスキーム、または他の種類のOTSスキームの検証鍵に基づく暗号ハッシュ木を使用することができる。
【0005】
従来のMSSスキームは、量子コンピュータによる攻撃に対して安全であると考えられている。しかし、MSSスキームのステートフル性と、ハッシュ関数への大きな依存度とは、広範囲に及ぶ採用の大きな妨げとなっていることがわかっている。すべてのOTS署名鍵および検証鍵とマークル木のすべてのノードが、一緒に計算され、アクセス可能なメモリに記憶されているシナリオでは、必要な唯一の署名計算は、マークル木のノードからのOTSの生成と認証パスの構築である。このシナリオでは、必要なすべてのデータが入手可能であり、再計算の必要がないため、署名生成のパフォーマンスへの影響は最小限である。しかし、資源に制約があるデバイスでは、そのような大量のデータを記憶することができないことが多い。さらに、署名鍵と検証鍵をシードから再生成し、認証パスを生成するのに必要な計算は計算集約的である。
【0006】
したがって、通信システム(たとえばデータネットワークなど)、コンピュータシステム(たとえばネットワーク接続コンピュータなど)、スマートデバイス(たとえばいわゆる「物のインターネット」(IoT)デバイスなど)、およびその他の技術クラスの動作を向上させるために、本明細書に記載のシステムおよび技術の態様を使用することができる。たとえば、多様な最新技術が、セキュリティ保護された動作のためにコンピュータ実装暗号システムに依存しており、本明細書に記載の技術はそのようなコンピュータ実装暗号システムを改良することができ、たとえばコンピュータ実装暗号システムをより安全にし、より計算効率を高くし、または場合によってはその他の利点を提供する。実装形態によっては、本明細書に記載のシステムおよび技術は、デジタル署名を生成するために特定のデータ要素が必要なときにそれらのデータ要素を計算し、記憶する(たとえば、小さいシードからOTS署名鍵および検証鍵を導出し、認証パスのために必要なときに暗号ハッシュ木のノードを生成するなど)ことによって、メモリ資源をより効率的に使用することができる。場合によっては、本明細書に記載のシステムおよび技術は、組み込みデバイス上でのハッシュベースの署名スキームの実現可能性をより高くすることができ、たとえば秘密鍵を縮小し、認証パスを生成することを可能にする一方、低いメモリおよびプロセッサ使用率で高速な署名生成を実現する。
【0007】
一部の実装形態では、暗号ハッシュ木の各ノードを記憶するのではなく、メモリ消費を低減するために(たとえばスマートカードなどの組み込みデバイスにおいて)ノードのサブセットのみがメモリに記憶される。ノードのサブセットのみが記憶されるため、署名スキームが追加のOTS署名鍵および認証鍵の使用に進むにつれて、追加のノードを計算し、記憶してもよい。追加のノードの計算と記憶は、木の走査スキームに従って実行されてもよい。場合によっては、最適化された木走査スキームにより、署名時のプロセッサ使用を最小限にするとともに、メモリ消費低減も達成することができる。
【0008】
実装形態によっては、暗号ハッシュ木のコンポーネントを記憶するためにキャッシュが使用されてもよい。キャッシュは、カットオフレベルより上の暗号ハッシュ木のノードのサブセットを記憶するTopNodesCache(上位ノードキャッシュ)と、カットオフレベルより下のノードのサブセットを記憶するBottomNodesCache(下位ノードキャッシュ)とを含むことができる。BottomNodesCacheは、(たとえば
図4に関して説明するように)アクティブ部分木からのノードのセットと、将来の部分木からのノードのセットとを含んでもよい。場合によっては、キャッシュは、OTS状態を記憶するOTSCacheを含んでもよい。実装形態によっては、ハッシュベースの署名スキームに従って新規OTS署名が作成されるたびに、たとえばBottomNodesCacheに将来の部分木の新規ノードを追加し、BottomNodesCacheにアクティブ部分木の新規葉ノードを追加することによって、BottomNodesCaccheが更新される。実装形態によっては、TopNodesCacheとBottomNodesCacheとの組み合わせが、将来の部分木の新規ノードを生成するためと、認証パスを作成するために必要なすべての適正なノードを提供する。
【0009】
態様によっては、TopNodesCacheとBottomNodesCacheの使用により、将来のハッシュ計算と認証パス計算のコストが低減される。たとえば、場合によっては、1回の署名生成について暗号ハッシュ木の1つの葉ノードを計算するだけで済み、したがってメモリ消費が低減される。たとえば、右側ノードのサブセットがメモリに記憶されてもよく、それによって全暗号ハッシュ木の実装に伴うメモリコストが低減される。また、記憶するノードをより少なくし、将来の部分木のOTS署名を生成する際に使用されるその部分木の新規ノードを1つ生成することによって、将来のハッシュ計算の計算コストを大幅に削減することができる。その結果、場合によっては、デジタル署名を生成し、木の状態を更新するために必要な木走査ハッシュ演算が少なくなるとともに、小さいメモリおよびストレージ占有領域が維持される。場合によっては、OTS生成時の計算負荷の大幅な削減を実現することができる。また、場合によっては、本明細書に記載の木走査スキームは、たとえばスマートカードなど、メモリまたは計算的に制限されたデバイス上で実装することもできる。
【図面の簡単な説明】
【0010】
【
図1】例示の通信システムの態様を示すブロック図である。
【
図2A】ハッシュベースの署名スキームとともに使用するための例示の暗号ハッシュ木を示す図である。
【
図2B】Hレベルの暗号ハッシュ木を2層に分離する一例を示す図である。
【
図3A】暗号ハッシュ木のノードの例示の配列表現を示す図である。
【
図3B】暗号ハッシュ木のノードの例示の配列表現を示す図である。
【
図4】暗号ハッシュ木のノードを管理するスキームの一例を示す図である。
【
図5】暗号ハッシュ木の部分木のノードの例示の作成順序を示す図である。
【
図6】アクティブ部分木の例示の更新動作を示す図である。
【
図8】暗号ハッシュ木に関連付けられたOTS状態の例示の記憶スキームを示す図である。
【
図9】ハッシュベースのデジタル署名スキームの例示のプロセスを示す流れ図である。
【発明を実施するための形態】
【0011】
図1に示す例示の通信システム100は、2つのデバイス102、104を含む。デバイスは、ネットワークを介して、たとえばネットワークチャネル106を介して互いに通信するために暗号スキームを使用する。図の実施例では、量子対応敵対者108がチャネル106、チャネル106上で交換される情報、またはその両方にアクセスすることができる。場合によっては、量子対応敵対者108は、チャネル106上の情報を送信または変更することができる。通信システム100は、追加の特徴または異なる特徴を含んでもよく、通信システムにおけるコンポーネントは、
図1に示すように、または別の方式で動作するように構成されてもよい。
【0012】
実施形態によっては、通信システム100におけるデバイスは、サーバ-クライアント関係を有してもよい。たとえば、デバイス102はサーバとすることができ、デバイス104はそのクライアントとすることができ、またはその逆も可能である。実装形態によっては、通信システム100におけるデバイスは、ピアツーピア関係を有してもよい。たとえば、デバイス102、104は、提供ネットワーク、ピアツーピアネットワークまたは他の種類のネットワークにおけるピアとすることができる。デバイスは、通信システム100において別の種類の関係を有してもよい。
【0013】
図1に示す実施例では、例示のデバイス102、104はそれぞれ、他のデバイスと通信するために使用される計算資源(たとえばハードウェア、ソフトウェア、ファームウェア)を有する。実施形態によっては、通信システム100におけるデバイスは、たとえば、ラップトップ、デスクトップ、ワークステーション、スマートフォン、タブレット、パーソナルデジタルアシスタント、サーバ、サーバクラスタ、メインフレーム、および他の種類のコンピュータシステムなど、様々なシステムにおいて実装可能である。
図1に示すように、例示のデバイス102は、不揮発性メモリ110、揮発性メモリ112を含み得るメモリ120と、プロセッサ114と、インターフェース116とを含む。デバイス102、104のそれぞれは、同一または追加の、または異なるコンポーネントを含んでもよい。デバイス102、104は、
図1に図示され、
図1に関して説明するように、または別の方式で動作するように構成可能である。
【0014】
図1に示す実施例では、デバイス102、104によって表される実体は、コンピューティングデバイス、コンピュータシステム、IPアドレスまたはその他のネットワークアドレス、または他の種類のコンピュータ可読識別子またはコンピュータ資源のインスタンスに対応し得る。したがって、各実体の計算およびその他の動作は、それぞれのデバイス102、104の1つまたは複数のプロセッサまたはその他の要素によって行われてもよい。同様に、実体に送信されるかまたは実体によって受信される情報は、それぞれのデバイス102、104の要素(たとえば、1つまたは複数のプロセッサ、メモリまたはインターフェース)に送信されるかまたは要素によって受信可能である。
【0015】
例示の不揮発性メモリ110は、データの長期持続記憶のために使用可能である。不揮発性メモリ110は、たとえば、ストレージデバイス(たとえば読み取り専用メモリ(ROM)、フラッシュメモリ、光ディスク)、ハードディスクドライブ(HDD)、または他の同様の種類の不揮発性記憶媒体を含み得る。揮発性メモリ112は、たとえばプロセッサ114によってアクセスされ、実行される命令およびデータを記憶するために、プロセッサ114の動作時に使用可能である。揮発性メモリ112は、たとえば、ダイナミックRAM(たとえばダイナミックダブルデータレートシンクロナスダイナミックRAM(DDR SDRAM))などの特定の種類のランダムアクセスメモリ(RAM)を含み得る。
【0016】
オペレーティングシステム、コンピュータアプリケーション、またはその他の資源に関連する命令(たとえばコンピュータコード、コンピュータプログラムなど)を、不揮発性メモリ110、揮発性メモリ112、またはこれらの組み合わせに記憶することができる。さらに、不揮発性メモリ110、揮発性メモリ112、またはこれらの組み合わせは、デバイス102上で稼働する1つまたは複数のアプリケーションまたは仮想マシンによって解釈可能なアプリケーションデータおよびデータオブジェクトも記憶することができる。デバイス102は、事前プログラム可能であるか、または、別の供給源から(たとえば、取り外し可能メモリデバイスから、リモートサーバから、データネットワークから、または他の方式で)プログラムをロードすることによってプログラム(および再プログラム)可能である。場合によっては、不揮発性メモリ110、揮発性メモリ112、またはこれらの組み合わせは、プロセッサ114によって解釈されるかまたは実行される、ソフトウェアアプリケーション、スクリプト、プログラム、関数、実行可能ファイルまたはその他のモジュールのコンピュータ可読命令を記憶する。たとえば、コンピュータ可読命令は、
図9に示し、以下で詳述する動作のうちの1つまたは複数の動作を行うように構成可能である。
【0017】
図1に示す例示のデバイス102において、プロセッサ114は、たとえばデータ入力に基づいて出力データを生成する命令を実行することができる。たとえば、プロセッサ114は、不揮発性メモリ110、揮発性メモリ112またはこれらの組み合わせに記憶されている、ソフトウェア、スクリプト、プログラム、関数、実行可能ファイル、またはその他のモジュールを実行または解釈することによって、コンピュータプログラムを実行することができる。場合によっては、プロセッサ114は、
図9に示し、以下で詳述する動作のうちの1つまたは複数の動作を行ってもよい。
【0018】
図1に示す例示のプロセッサ114はアナログ回路、デジタル回路またはこれらの組み合わせを含む、1つまたは複数のチップまたはチップセットを含むことができる。場合によっては、プロセッサ114は、たとえば1つまたは複数のメインプロセッサと1つまたは複数のコプロセッサなどの複数のプロセッサデバイスを含む。たとえば、プロセッサ114は、特定の計算タスクを暗号コプロセッサに委譲することができるメインプロセッサを含むことができ、暗号コプロセッサは、それらの計算タスクをメインプロセッサよりも効率的に、または他のプロセッサデバイスによって行われる他の計算タスクと並列して行うように構成可能である。場合によっては、プロセッサ114は、たとえばユーザインターフェース、通信インターフェース、周辺装置および場合によってはその他のコンポーネントなど、デバイス102の他のコンポーネントの動作を連係させ、または制御する。
【0019】
図1に示す例示のデバイス102では、インターフェース116が(たとえばチャネル106を介して)他のデバイスとの通信を提供する。場合によっては、インターフェース116は、様々な無線プロトコルまたは標準規格を使用して無線通信を提供する無線通信インターフェースを含む。たとえば、インターフェース116は、Bluetooth、Wi-Fi、ニアフィールド通信(NFC)、CDMA、TDMA、PDC、WCDMA、CDMA2000、GPRS、GSMまたはその他の形態の無線通信によって無線通信を提供してもよい。そのような通信は、たとえば、無線周波数送受信器または他の種類のコンポーネントを介して行われてもよい。場合によっては、インターフェース116は、たとえばネットワークアダプタを介して、たとえばキーボード、ポインティングデバイス、スキャナ、または交換機またはルータなどのネットワークデバイスなど、1つまたは複数の入力/出力デバイスに接続可能な有線通信インターフェース(たとえばUSB、Ethernet)を含む。
【0020】
例示のチャネル106は、コネクタ、データ通信ネットワーク、または他の種類の通信リンクのすべてまたは一部を含むことができる。たとえば、チャネル106は、1つまたは複数の有線または無線接続、1つまたは複数の有線または無線ネットワークまたはその他の通信チャネルを含むことができる。チャネル106は、任意の空間分布を有し得る。チャネル106は、パブリック、プライベートであってもよく、またはパブリックおよびプライベートである態様を含んでもよい。たとえば、実施例によっては、チャネル106は、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、仮想プライベートネットワーク(VPN)、インターネット、ピアツーピアネットワーク、セルラネットワーク、Wi-Fiネットワーク、パーソナルエリアネットワーク(PAN)(たとえばBluetooth低エネルギー(BTLE)ネットワーク、ZigBeeネットワークなど)、またはマシンツーマシン(M2M)通信を含むその他の短距離ネットワーク、または他の種類のデータ通信ネットワークのうちの1つまたは複数を含む。
【0021】
図の実施例では、量子対応敵対者108は、量子計算資源にアクセスすることができる。たとえば、量子対応敵対者108は、量子コンピュータ、量子情報プロセッサ、量子メモリ、量子通信インターフェース、またはこれらの組み合わせ、および場合によってはその他の量子技術であり得るか、含むことができるか、またはアクセス可能である。実施形態によっては、量子対応敵対者108は、たとえば古典的フロントエンドプロセッサによって駆動される量子プロセッサを含むハイブリッドコンピューティングシステム、または他の種類のハイブリッドコンピューティングシステムを含み得る。
【0022】
一部の例では、量子対応敵対者108は、量子システムにおいて情報を記憶し、処理することができる。たとえば、量子対応敵対者108は、情報を量子ビット(「キュービット」)として符号化し、キュービットを操作することによってその情報を処理する。情報は、物理キュービット、論理キュービットまたはこれらの組み合わせおよび他の種類のキュービット符号化で符号化可能である。実装形態によっては、量子対応敵対者108は、フォールトトレラント機構において動作することができるか、または量子対応敵対者108はフォールトトレラント機構の下で動作可能である。
【0023】
多くの公開鍵暗号システムが、スケーラブル量子コンピュータを装備している攻撃者に対して安全でないことが知られている。公開鍵暗号法に対する量子コンピュータの脅威は、量子攻撃に対して脆弱でないと考えられている他の公開鍵システムに切り換えることによって軽減することができる。たとえば、量子脆弱であると考えられている特定のRSAベースまたはECCベースの暗号システムに代わる耐量子として特定のハッシュベースの署名スキームが提案されている。
【0024】
実装形態によっては、例示の量子対応敵対者108は、量子コンピューティングアルゴリズムを実行し、量子コンピューティング回路または量子通信プロトコルを実行し、または他の種類の量子情報処理タスクを行うことができる。図の実施例では、量子対応敵対者108は、古典的コンピュータ上で実施するのが困難であると考えられている問題を量子対応敵対者が効率的に解くことを可能にする、ショアのアルゴリズムを実行することができる。たとえば、量子対応敵対者108は、ショアのアルゴリズムを使用して大きな整数を因数分解し、離散対数を求め、または場合によってはその他の問題を計算効率のよい方式で解くことができる。したがって、例示の量子対応敵対者108は、(たとえば、公開情報に基づく証明機関またはその他の機関の公開鍵を計算することによって)特定の量子脆弱暗号システムのセキュリティを脅かすことができる。
【0025】
図1に示す例示の量子対応敵対者108は、チャネル106上でやり取りされる情報にアクセスすることができる。たとえば、量子対応敵対者108は、デバイス102、104間でやり取りされる情報の一部または全部にアクセスすることができる。場合によっては、量子対応敵対者108は、チャネル106上の通信内容を直接観察することができ、場合によっては、量子対応敵対者108は、たとえば別の実体またはシステムによってチャネル106上で観察された情報を受信することによってそのような通信内容を間接的に入手することができる。
【0026】
実装形態によっては、量子対応敵対者108は、整数を因数分解し、離散対数を計算し、またはその他の古典的には困難な計算タスクを、特定の暗号システムのセキュリティを脅かすのに十分な高速で行うことができる。たとえば、量子対応敵対者108は、特定のRSAベースの暗号システムを脅かすのに十分な高速で素因数を計算することができ、または特定のECCベースの暗号システムを脅かすのに十分な高速で離散対数を計算することができる可能性がある。
【0027】
図1に示す実施例では、デバイス102、104は、例示の量子対応敵対者108によって脅かされることが不可能な耐量子暗号システムを使用することができる。たとえば、デバイス102、104は、ショアのアルゴリズム、または特定の従来の暗号標準規格のセキュリティを脅かすことが知られている他の種類のアルゴリズムを効率的に実行することができる量子コンピュータに対して安全な暗号システムを使用して通信可能である。
【0028】
実装形態によっては、デバイス102、104は、各ノードが、受信したメッセージの送信者を検証することができるようにするデジタル署名スキームを使用する。デバイス102、104は、
図2A、
図2B、
図3A、
図3B、
図4、
図5、
図6、
図7、
図8、
図9のいずれか1つまたは複数の図に示すかまたは関連して説明する例示の技術を使用することができ、または、デバイス102、104は、チャネル106で通信するためにこれらの技術の変形およびその他の技術を使用してもよい。
【0029】
実装形態によっては、デバイス102、104は、チャネル106を介した通信でハッシュベースの署名スキームを使用する。このハッシュベースの署名スキームは、デジタル署名を生成し、検証するためにOTSスキームと暗号ハッシュ木とを使用してもよい。ハッシュベースの署名スキームとともに使用可能なOTSスキームの例には、ランポート-ディフィーOTSスキームおよびウィンターニッツOTSスキームが含まれる。実装形態によっては、署名デバイス(102または104)は一度に暗号ハッシュ木のノードのサブセットのみを記憶し、
図2A~
図9に関して以下で説明するように木走査を管理する。
【0030】
図2Aは、ハッシュベースの署名スキームとともに使用するための例示の暗号ハッシュ木200Aを示す図である。場合によっては、暗号ハッシュ木200は多数のレベルを有することがあり(たとえば約10レベル、20レベルまたはそれより多くのレベルの高さを有する)、木におけるノードを全部(たとえばスマートカードなどメモリが制約されているデバイス上で)記憶するのは最適ではないかまたは不可能な場合がある。一方、暗号ハッシュ木における葉ノードの生成のコストは、検証鍵を生成するのに必要なハッシュ演算の数によって測定される。後者の場合、必要メモリ量は小型デバイスに収まるのに十分に低減可能であるが、署名生成時間がかかりすぎて実用的ではない可能性がある。場合によっては、本明細書に記載の木走査スキームは、
図2A~
図9に示す技術を採用してメモリオーバーヘッドが妥当に少ない高速署名生成を実現するように、署名時のプロセッサ使用を最小限にするかまたはその他により低減することできる。
【0031】
概要として、
図2Aに簡略化されたハッシュ木を示す。場合によっては、鍵ペア生成時に完全なハッシュ木が計算される。この実施例では、ハッシュ木は、ノードがその2つの子ノードの連結のハッシュである2分木である。高さHのハッシュ木はH+1のレベルを有し、最下部ノードがレベル0であり、ルートノードがレベルHにある。レベルiにおけるノードl
iの数は以下により与えられる。
l
i=2
H-i, i=0,1,...,H
各レベルiにおいて、ノード位置は左から右の順に0~2
H-i-1でインデックス付けされる。この実施例では、偶数インデックスを有するノードを左ノード(または左側ノード)と呼び、奇数インデックスを有するノードを右ノード(または右側ノード)と呼ぶ。場合によっては、ノード位置は異なる開始インデックスに基づいてインデックス付けされてもよい。たとえば、開始インデックスが奇数、たとえば開始インデックス=1の場合、奇数インデックスは左ノードであり、偶数インデックスは右ノードである。場合によっては、ノードが左ノードであるか右ノードであるかは、走査順序によって決まることがある。
【0032】
ハッシュ木のレベルi,i=1,2,...,Hおよび位置j,j=0,1,...,2
H-i-1における中間ノード(たとえばレベル0より上位のレベルにあるノード)の値
【数1】
は、その子ノードから、ハッシュ関数
【数2】
によって計算され、ここで||は連結を示し、Hash(・)は暗号ハッシュ関数である。葉ノード(たとえばレベル0におけるノード)
【数3】
、j=0,1,...2
H-1、の値は、基礎にあるOTSアルゴリズムの対応する検証鍵のハッシュ
【数4】
であり、ここでOTS_Ver
jは、OTSインデックスjにおけるOTS検証鍵である。
【0033】
中間ノード
【数5】
は、ハッシュ木の部分木を一意に識別することに留意されたい。したがって、中間ノードが選択された後は、そのような部分木の左端の葉ノードを以下のように容易に識別することができる。
【0034】
【0035】
一部のOTSアルゴリズムはハッシュベースである。一部のOTSアルゴリズムの例(たとえばウィンターニッツOTS)は構成要素として、署名鍵と検証鍵と署名とを含む。場合によっては、OTS署名鍵SigKeyを使用して、OTS検証鍵が以下のように計算される。
OTS_Ver=OTSPUB(Sig_Key)
【0036】
OTS署名アルゴリズムは、署名鍵SigKeyと入力メッセージmとから以下のようにOTS署名OTS_Sigを生成することができる。
OTS_Sig=OTSSIG(m,SigKey)
【0037】
OTS検証アルゴリズムを使用して、以下のように候補OTS検証鍵を計算することができる。
OTS_VerResult=OTSVER(m,OTS_Sig)
【0038】
OTS署名は、OTS_VerResultがOTS_Verと等しい場合に正当である。
【0039】
この実施例では、ハッシュベースの署名スキームにおけるデジタル署名は
(q,OTS_Sigq,AuthPathq)
として与えられ、ここで、
qは、ハッシュ木におけるレベル0の葉、たとえば
【0040】
【数7】
の位置に対応する署名-検証鍵ペアの位置を示すOTSインデックス(署名インデックスの一例)であり、
OTS_Sig
qは、インデックスqによって表される位置のOTSであり、
AuthPath
qは、ハッシュ木における複数の認証ノードからなる
【0041】
【0042】
図2Aに示す実施例では、認証パスはハッシュ木の各レベルからのノードのセットとして表される。ハッシュ木の各ノード(ルート以外)は、兄弟ノードと呼ばれる別のノードと共通の親を共有する。認証パスは、葉ノードからルートまでの経路上のノードの兄弟であるノードを含む。場合によっては、認証パスは、H個のノード値を含むことができ、そのそれぞれが0~H-1のハッシュ木の異なるレベルに対応する。レベルHノードは、公開鍵であるルートノードであるため除外される。したがって、受信側/検証側はすでにこの値を持っている。
【0043】
図2Aの実施例では、特定のOTSの認証パスのノードが陰影付きノードによって示されている。認証パスに必要なノードが記憶されていない場合、それらのノードは再計算の必要があることになる。場合によっては、高さHの木の各木ノードの計算は2
HのOTS検証キー計算と2
H-1のハッシュ演算とを要し得る。したがって、たとえば高さ14のハッシュ木は、16,383の木ノードハッシュ演算と16,384のOTS検証鍵計算とを必要とし得る。OTS検証鍵計算は、さらに2
W×pのハッシュ演算を必要とすることがあり、ここでwとpはウィンターニッツOTSスキームのパラメータである。
【0044】
場合によっては、署名演算時の葉ノード計算の数は、キャッシュメモリを使用してハッシュ木の各レベルのノードのサブセットを記憶することによって削減することができる。たとえば、右ノードをキャッシュメモリに記憶し、認証パス構築のために再使用してもよい。一方、左ノードは、必要な子ノード値が過去の署名生成においてすでに計算されているため、容易に計算可能である。
【0045】
図2Bに、2つの層に分けられている高さHの暗号ハッシュ木200Bの一例を示す。図のように、木の上部は、固定された高さH-Kであり、ここで、0<K<Hである。TopNodesCacheは、
図2Bに示す「上位ノード」からの選択ノードを記憶するメモリコンポーネントである。場合によっては、木の上部におけるすべての右ノードの値がTopNodesCacheに記憶されてもよい。
【0046】
やはり
図2Bの実施例に示すように、BottomNodesCacheは、木の下部K個のレベルの特定のノードが記憶されるメモリコンポーネントである。これらのノードは、
図2Bで「部分木」として示されている。「部分木」のノードを決定するための例示のプロセスについては以下で説明する。場合によっては、K個のレベルの特定のノードのみがBottomNodesCacheに記憶され、K個のレベルにおける完全ハッシュ木のノードの残りの部分は記憶されず、「非格納」ノードとして図示されている。場合によっては、ノードの生成は、左から右に移動するスライド窓の動きをする。場合によっては、OTSインデックスに沿って左から右にOTS署名が生成されるにつれて、ハッシュ木の後続の右ノード値が準備され、BottomNodesCacheに記憶される。場合によっては、たとえば以下で述べるように葉計算の生成物としてOTS状態が準備されるOTSCacheが採用される。
【0047】
図3Aおよび
図3Bは、暗号ハッシュ木のノードの配列表現を示す実施例である。
図3Aで、配列310Aは、例示のハッシュ木の上部のノードを記憶するメモリを表す。この実施例では、ハッシュ木の上部は高さがH-Kであり、たとえば
図2Bに示す「上位ノード」である。場合によっては、ハッシュ木300Aの「上位ノード」におけるすべての右ノードの値が記憶され、木レベルkと位置iとによってインデックス付けされる。場合によっては、配列310Aは、初期設定時に2
H-K-1個のノードを含み、ハッシュベースの署名スキーム鍵ペアの存続期間にわたって変化する。実装形態によっては、配列310Aは、アイツィンガーの方法によって2分木レイアウトで最上部木のノードを記憶する。図の実施例では、2分木の右ノードが、レベルと位置とに基づく配列における順序で、たとえばAからGの順に記録される。
【0048】
図3Bで、配列330Bは、ハッシュ木の下位Kレベルの部分木、たとえば
図3Bに示す部分木320Bの選択ノードを記憶するメモリを表す。場合によっては、配列330Bは、特定の数のノード値によって初期設定され、その後、署名生成のたびに更新される。場合によっては、配列330Bは、2
K+(K-2)個のノードのためのスペースを有する特別な循環バッファとして実装される。場合によっては、部分木のノードは2分木レイアウトの配列330Bには記憶されない。その代わりに、場合によっては、それらのノードは、配列310Bからのノードの除去がハッシュベースの署名スキームにおけるノードの存続期間と一致するように順序付けされる。これを実現するために、実装形態によっては、配列310Bは、右ノードを、木の順次走査を実行するときに出現する順序で記憶する、循環バッファである。その結果は、ノードの存続期間によって順序付けられた配列である。言い換えると、認証パス計算において木の左側のノードが最初に使用され、一方、木の右側のノードは最後に使用されることになる。同様に、配列330Bの左側のノード(最下位インデックス)が右側のノード(最上位インデックス)よりも先に除去され得る。たとえば、
図3Bに示す配列330Bにおけるノードは、ノードD、B、Eが最も存続期間が短く、先に(左から右の順に)除去され、一方ノードA、C、Gが最も存続期間が長く、最後に(左から右の順に)除去されるような順序で除去可能である。
【0049】
実装形態によっては、将来の部分木のノードはノードの順次走査を可能にする方式では作成されない。たとえば、配列内のノードは循環バッファにおいて逆辞書式順序で配列されてもよい。場合によっては、たとえば
図5に関して後述するように、将来の部分木がノードごとに構築されるときに、配列に逆辞書式順序でノードを挿入するために逆関数が使用されてもよい。
【0050】
図4に、暗号ハッシュ木400のノードを管理するスキームの一例を示す。実装形態によっては、ハッシュベースの署名スキームは、たとえば
図4に示すBottomNodesCache410などのバッファメモリ配列を使用してハッシュ木のノードを管理する。場合によっては、例示のBottomNodesCache410は、アクティブ部分木ノードと将来の部分木ノードの両方を同じバッファメモリ配列で維持する。アクティブ部分木と将来の部分木とは、それぞれ、暗号ハッシュ木のより下位のレベルからのノードを有する高さKの部分木である。実装形態によっては、アクティブ部分木は、たとえば現在の署名インデックスqに関連付けられた署名鍵に基づいて署名および認証パスを生成するために使用される部分木であり、一方、将来の部分木は、アクティブ部分木が使い果たされた(たとえばそのOTS署名鍵のすべてが使用された)後で(たとえば署名インデックスが最終的に将来の部分木に関連付けられた値まで進められたときに)署名を生成するために将来の部分木を使用することができるように、ノードごとに漸進的に構築される。たとえば、アクティブ部分木が使い果たされる時点までに、将来の部分木が完全に構築され、アクティブ部分木になる準備が整っていることが可能である。
【0051】
図4に示す実施例では、アクティブ部分木のノードのサブセットがBottomNodesCache410内のインデックス付き場所の第1のセット(インデックス3、4、5、6を有する場所)に記憶され、一方、将来の部分木のノードのサブセットは、BottomNodesCache410内のインデックス付き場所の第2のセット(インデックス8、0、1を有する場所)に記憶される。
図4の例示のBottomNodesCache410は、循環バッファメモリで実装され、インデックス付き場所の第1のセット(インデックス3、4、5、6を有する場所)は連続しており、インデックス付き場所の第2のセット(インデックス8、0、1を有する場所)も連続している。
【0052】
実装形態によっては、BottomNodesCache410は、縮小するアクティブ部分木と増大する将来の部分木とが単一の共有記憶配列に記憶されるように、循環バッファ配列として実装される。場合によっては、各部分木内のノードは、たとえばBottomNodesCache410が以下の特性を備えて実装される場合に、循環バッファ内の記憶場所を有するように保証される。すなわち、(1)デジタル署名が計算されるにつれてアクティブ部分木の記憶ノードの数が減少し、したがって循環バッファ内の記憶スペースが開放され、(2)将来の部分木の記憶ノードの数が1署名当たり1個の新規ノードの割合で増加し、循環バッファ内の開放された記憶スペースを占有する。実装形態によっては、減少するアクティブ部分木ノードは、ノードが除去されてもバッファ内で断片化しない。逆に、記憶アクティブ部分木は、減少しても連続的なままである。これにより、将来の部分木ノードは増大してキャッシュ内の連続空きスペースに入りこんでいくことができる。循環バッファの使用は、アクティブ部分木と将来の部分木の使用スペースと未使用スペースが連続的なままであるように保証することができる。したがって、場合によっては、将来の部分木の新規ノードを循環バッファメモリに記憶することにより、循環バッファメモリ内のインデックス付き場所の第1のセットと第2のセットとの間の1つまたは複数の境界がシフトし得る。
【0053】
場合によっては、署名が生成された後、アクティブ部分木内の特定のノードが、いかなる将来の署名または認証パス計算でも使用されなくなる。場合によっては、これらのノードは除去されるかまたはその兄弟ノードに置き換えられる。場合によっては、署名が計算され、使用されるにつれて、BottomNodesCache410のアクティブ部分木ノードが記憶されている部分が縮小する。一方、将来の部分木も、漸進的に構築されるように署名生成後に更新する。実施例によっては、BottomNodesCache410の将来の部分木ノードが記憶される部分は、各新規ノードの追加により増大する。実装形態によっては、BottomNodesCache410は、将来の部分木からのノードがアクティブ部分木のノードを上書きしないように、循環バッファを管理するためのインデックス付け関数によって管理される。
【0054】
図4の実施例では、アクティブ部分木は、署名インデックスの現在の値が0~7の範囲内である場合に、署名を生成するために使用される。インデックス7について署名が生成されると、アクティブ部分木はOTS署名鍵の範囲外となり、アクティブ部分木のノードはそれ以上必要ではなくなる。この場合、将来の部分木がアクティブ部分木になり、8~15などの範囲の署名インデックスの値について署名が生成されることになる。
図4にさらに示すように、アクティブ部分木ノード、たとえばA、F、CおよびG(インデックス3、4、5および6に記憶されている)と将来の部分木ノードX、Z、Y(インデックス8、0および1にそれぞれ記憶されている)が同じメモリ(BottomNodesCache410)を共有する。
【0055】
図4に示すように、アクティブ部分木における現在の署名場所はインデックス4にあり(署名インデックスq=4)、認証パスはアクティブ部分木におけるノードA、FおよびCを含む。場合によっては、BottomNodesCache410はハッシュ木の下位K個のレベルにおける認証パスノードのみを記憶する。実装形態によっては、図のように、アクティブ部分木ノードは連続した場所にまとめてグループ化され、将来の部分木ノードも連続した場所にまとめてグループ化される。場合によっては、BottomNodesCacheが循環バッファであるためノードのグループはラップアラウンドし得る。実装形態によっては、BottomNodesCacheは固定サイズである。
図4の実施例では、将来の部分木ノードXはBottomNodesCache410のインデックス8における最後のスロットにあり、将来の部分木ノード(たとえばZおよびY)がそれぞれインデックス0および1における循環バッファの先頭にラップアラウンドする。場合によっては、BottomNodesCacheのアクティブ部分木の部分は線形に縮小しない。たとえば、アクティブ部分木ノード部分は、署名生成ごとに0個、1個またはそれ以上のノードだけ減少し得る。一方、将来の部分木ノード部分は、署名生成ごとに1つのノードの一定した割合で増大し得る。
【0056】
実装形態によっては、BottomNodesCacheのノードを作成するためにアルゴリズムが使用されてもよい。場合によっては、ノードを作成するためのアルゴリズムは、M. Szydloによる“Merkle Tree Traversal in Log Space and Time” (Advances in Cryptology, EUROCRYPTO 2004, pp. 541-554)という名称の公開文献に記載されている従来のTreeHashアルゴリズムの変形に基づいてもよい。実施例によっては、ノードを作成するアルゴリズムは、BottomNodesCache(たとえば
図4に示すBottomNodesCache410)の状態を管理するために、スタック構造体ではなく循環バッファを使用する。本明細書に記載のシステムおよび技術では、部分木の葉ノードを降順に反復する(部分木を従来のTreeHashアルゴリズムと比較して逆順に有効に構築する)アルゴリズムを「TreeHash
v」と呼ぶ。
【0057】
したがって、本明細書に記載のTreeHash
v()関数は、TreeHash変形アルゴリズムの1回の反復回を計算する。この関数は、作成された葉ノードの場所を示すインデックスsにおける葉ノード
【数9】
と、計算する導出右側ノードの高さであるhとを入力とする。この関数は、木内の新たに作成されたノードのノード値を返す。実施例によっては、TreeHash
v()アルゴリズムは、以下のように動作し得る。
1.
【0058】
【数10】
とする。
2.i=0→hについて:
a.r=GetAuthPathIndex(q,i)とする。
b.SiblingNode=BottomNodesCache
rとする。
c.TempNode=NodeCalc(TempNode,SiblingNode)。
3.TempNodeを返す。
【0059】
図5に、暗号ハッシュ木の部分木500のノードの例示の作成順序を示す。実装形態によっては、部分木500のノードのそれぞれがTreeHash
vアルゴリズムを使用して生成可能である。場合によっては、
図5に示す例示の作成順序に従って作成されたノードが、
図3Bに示す配列330Bを生じさせるようにメモリに格納される。
図5に示す実施例では、ノードA(インデックス7)が最初に作成され、次にAの兄弟ノード(インデックス6)が作成される。ノードBを生成するためにノードAとその兄弟ノードがNodeCalc()に入力される。場合によっては、TreeHash
v関数の特性は、それぞれの親ノードを作成するためにすべての必要な兄弟ノードが利用可能であることである。したがって、ノードDを作成するために、ノードCの兄弟(インデックス4)がノードC(インデックス3)と結合されてBの兄弟ノードが生成され、これが次にノードBと結合されてノードDが生成される。この実施例では、ノードGの兄弟である部分木の左端の葉ノードは、その計算から右ノードが得られないため、決して計算されない。したがって、このノードは無視されてもよい。さらに、以下の例示のTreeHash
vアルゴリズムは、すべての使用ノードを廃棄しない。その代わりに、
図5で強調して示されているように、右ノードが保存され、左ノードが廃棄される。したがって、TreHash
vアルゴリズムは、TopNodesCacheとBottomNodesCacheと、(実装される場合)OTSCacheとのより良好な統合を可能にし得る。
【0060】
実装形態によっては、暗号ハッシュ木を管理するために特定の状態変数が維持される。実施例によっては、以下の状態変数が維持される。すなわち、(1)OTS署名インデックスq、(2)BottomNodesCacheの状態、および(3)TopNodesCacheの状態である。場合によってはその他の変数が維持されてもよい。
【0061】
実装形態によっては、署名インデックスqはハッシュベースの署名スキームの状態を表す。署名インデックスqは、再使用を防止するために、署名を生成するために使用されたOTS署名鍵を追跡する。署名インデックスqは、署名計算ごとに1ずつインクリメントされ、たとえばq=q+1となる。OTS署名インデックスqの値は、次の署名生成に使用されるインデックスを示す。
【0062】
実施形態によっては、BottomNodesCacheおよびTopNodesCacheの状態および内容も、連続した署名生成ごとに変化する。たとえば、場合によっては、署名インデックスqは、キャッシュの状態を判定するため、たとえばキャッシュが更新を必要としているか否かを判定するために使用され、場合によっては特定のノードがバッファに入っているか否かを判定するためにqが使用される。
【0063】
実装形態によっては、キャッシュ、たとえばTopNodesCacheおよびBottomNodesCacheの状態は、現在の署名インデックスqの認証パスを生じさせる。場合によっては、署名後、キャッシュは署名インデックスの次の値q+1の認証パスを生じさせることができる状態に更新される。場合によっては、更新によってTopNodesCacheおよびBottomNodesCache内の特定のノードが無効化され、BottomNodesCacheに別のノードが導入される。
【0064】
図6に、アクティブ部分木610、620の例示の更新動作を示す。この実施例では、署名インデックスqは、左の部分木610に示すインデックス0に初期設定される。署名インデックスの現在の値q=0についてデジタル署名を生成し、BottomNodesCacheを(左の状態630から右の状態640に)更新した後、右の部分木620に示す署名インデックスの次の値q=1についてデジタル署名を生成するために、署名インデックスが1だけインクリメントされる(たとえばq=q+1)。図のように、状態630、640の両方において、BottomNodesCache内のノードから認証パスを見つけることができる。状態630、640の相違は、右ノードD
Rがいずれの将来の認証パスにおいてもノードとして必要ではなくなり、したがってキャッシュから除去されていることである。ノードD
Rによって前に使用されていた記憶スペースがキャッシュにおいてその左の兄弟ノードであるD
Lによって上書きされる。更新手順の一部の実装形態では、除去され、その対応する左ノードに置き換えられる少なくとも1つの右ノードが常に存在することになる。この実施例では、キャッシュが状態630から状態640に更新されてもキャッシュ内の他のノードは変化しないままである。
【0065】
実装形態によっては、BottomNodesCache内にノードを記憶する循環バッファを管理するために、インデックス付け関数が使用される。たとえば、Sigma関数は、BottomNodesCacheに対する動作を行うための汎用関数の一例である。これらの関数は、(たとえばBottomNodesCacheを記憶する)循環バッファの位置インデックスrを判定する必要がある任意の時点で使用されてもよい。以下において、表記「&」はビット単位のAND演算を示し、「~a」は2の補数でのビット単位のNOT演算(単項)を示し、「a|b」はビット単位のOR演算を示し、「|a|」はaの絶対値を示す。
【0066】
場合によっては、2分木を線形配列にマッピングするためにアイツィンガーの方法を使用する代わりに、BottomNodesCacheの逆辞書式順序付けを使用して2分木を循環バッファにマッピングするために、逆関数が使用されてもよい。場合によっては、(たとえば
図3Bに示すように)整数xを逆辞書式順序にマッピングするために、関数r=Sigma(x)が以下のように動作し、ここでrは循環バッファ内のインデックス位置である。
1.r=0とする。
2.x>0の場合:
a.t=Ham(x/2)とし、ここでHamはx/2のハミング重みを計算する。
b.c=2
CTZ(x)とし、ここでCTZはxの2進形の末尾のゼロの数を返す。
c.
【0067】
【数11】
とする。
d.r=x-t+bと設定する。
3.rを返す。
たとえば、上述の関数を使用すると、整数x={0,1,2,3,4,5,6,7,...}のマッピングの結果、
図3Bおよび
図5に示すように整数r={0,1,3,2,7,4,6,5,...}が得られる。
【0068】
実装形態によっては、ノードの挿入および削除のために循環バッファ内のインデックスを見つけるために関数が使用される。たとえば、BottomNodesCache内のインデックスを判定するために関数Delta(q,h)が使用されてもよく、ここでqはアクティブ部分木または将来の部分木内の署名インデックス位置であり、hは葉レベルから始まって上方に進む対応する部分木内のレベルである。関数Delta(q,h)は、以下のように動作し得る。
1.s=2K+(K-2)の循環バッファのサイズとする。
2.a=~(2n-1)とする。
3.b=(q&a)|(2n)とする。
4.c=b&(2K-1)とする。
5.d=Sigma(c)-1とする。
6.
【0069】
【数12】
が奇数の場合、
a.e=-(d+1)とする。
b.f=e+2
k+1-2とする。
c.g=f mod sとする。
d.gを返す。
7.それ以外の場合、
a.dを返す。
【0070】
実装形態によっては、循環バッファから認証パスノードを取得するために関数が使用される。たとえば、関数GetAuthPathIndex(q,n)は、循環バッファ内の認証パスノードのインデックスrを返す。署名インデックスの現行値であるqを使用して、この関数は認証パスにおけるn番目のノードに対応する循環バッファ内のインデックスrを返す。場合によっては、nは認証ノードパス内のノードの数であり、この関数は、各認証パスノードを読み出すために署名インデックスqの同じ値を使用してn回実行されることになる。実装形態によっては、関数GetAuthPathIndex(q,n)は以下のように動作する。
1.r=Delta(q,n)とする。
2.rを返す。
【0071】
実装形態によっては、ノード挿入、たとえばBottomNodesCacheの将来の部分木へのノード挿入のために、循環バッファ内のインデックスrに将来の部分木の葉ノードインデックスq’をマッピングするために関数r=GetInsertIndex(q’)が使用される。一実施例では、GetInsertIndex(q)関数は、以下のように、ノード挿入のためのインデックスrを判定するために(上述の)GetAuthPathIndex関数を使用する。
1.n=CTZ(q’)とする。
2.a=q’-1とする。
3.r=Delta(a,n)とする。
4.rを返す。
【0072】
実装形態によっては、作成される次の新規葉インデックスを判定するために関数が使用される。たとえば、関数r=GetNextLeafCalcIndex(q)が、部分木において次の葉、たとえば将来の部分木の新規ノードが作成されることになる循環バッファ内のインデックスrを返す。この関数は、署名インデックスqの現在の値を入力として使用する。実装形態によっては、r=GetNextLeafCalcIndex(q)関数は以下のように動作し得る。
1.
【0073】
【数13】
とする。
2.b=q&(2
K-1)とする。
3.b=0の場合、c=1とし、それ以外の場合はc=0とする。
4.d=(a+c)×2
Kとする。
5.e=(2
K-b)&(2
K-1)とする。
6.r=d|eとする。
7.rを返す。
【0074】
この関数の一部の実施例では、下位レベルの数がK=3の場合、入力q={0,1,2,3,4,5,6,7,...}について結果r={0,15,14,13,12,11,10,9,...}が生成される。この実施例は、署名インデックスqの値が線形に進行する一方で、結果のr個の葉ノードが逆順に作成されることを示している。この場合、署名インデックスqは、0→2K-1ノードの範囲をカバーするアクティブ部分木における葉ノードに関連付けられ、一方rは2K→2K+1-1の範囲をカバーする将来の部分木における葉ノードに関連付けられたインデックスである。この実施例に示すように、将来の部分木は、TreeHashv関数を使用して降順(逆方向)に構築される。
【0075】
実装形態によっては、OTS署名の後の更新時に、特定の右ノードをその左ノード兄弟に置き換えるための関数が使用される。たとえば、この手続きは、
図6に関して説明しているように、アクティブ部分木における最下位レベルのノードを更新することができる。場合によっては、この手続きはTopNodesCacheにおける最上位ノードを更新する。実施例によっては、関数r=UpdataCache(q)が現在の署名インデックスであるqを入力として使用し、以下のように動作する。
1.τ=CTZ(q+1)とする。
2.
【0076】
【数14】
、qにおける葉ノードとする。
3.a=qとする。
4.s=min(τ-1,H-2)とする。
5.h=0→sについて:
a.
【0077】
【数15】
とする。
b.
【数16】
、レベルhのnの兄弟ノードとする。
c.aが奇数の場合、親ノードn=Hash(m||n)を計算し、それ以外の場合は、n=Hash(n||m)を計算する。
d.
【0078】
【数17】
とする。
6.s<Kの場合:
a.i=GetAuthPathIndex(q,s)とする。
b.インデックスiにおいて循環バッファからノードを削除する。
c.インデックスiにおいて循環バッファにnを挿入する。
7.それ以外のs≧Kの場合:
a.i=2
H-s-1-1+[q/2
s]とする。
b.インデックスiにおいてTopNodesCacheからノードを削除する。
c.インデックスiにおいてTopNodesCacheにnを挿入する。
【0079】
実装形態によっては、上記のr=UpdateCaches(q)関数のステップ7(a)は、TopNodesCacheを更新するときにアイツィンガーの方法を使用してノードを記憶するための位置インデックスを判定する。
【0080】
実装形態によっては、ハッシュベースの署名スキームが以下のように初期設定される。ハッシュベースの署名スキーム鍵ペア(たとえば、完全ハッシュ木とすべてのOTS鍵)が生成され、TopNodesCacheとBottomNodesCacheとが初期設定される。場合によっては、初期設定時に、(カットオフレベルより上の)木の上部の右ノードのすべてが、レベルHからレベルH-Kまで順次にTopNodesCacheに記憶される。場合によっては、たとえば
図3Aに関して説明したようにアイツィンガーの方法を使用して、ノードがTopNodesCache内の位置に挿入される。場合によっては、最初のアクティブ部分木のために選択されたノード値によってBottomNodesCacheが初期設定される。場合によっては、たとえばGetInsertIndex(q)関数を使用して、
図3Bに示すように、アクティブ部分木の右ノードがBottomNodesCacheに挿入される。実装形態によっては、ハッシュ木のルートはハッシュベースの署名スキームの公開鍵である。したがって、ルートノード値が公開鍵として返されてもよい。場合によっては、使用されないすべての中間ノード、たとえばTopNodesCacheまたはBottomNodesCacheに記憶されていないノードは、メモリから削除される。場合によっては、署名インデックスqが0に初期化される。実装形態によっては、OTS署名鍵が復元可能でない場合、OTS署名鍵が記憶されてもよい。署名鍵が復元可能な場合は、シードが記憶されてもよい。
【0081】
実装形態によっては、初期設定の後、ハッシュベースの署名スキームがデジタル署名を生成する。場合によっては、署名インデックスqについてワンタイム署名を生成するためにOTSアルゴリズムOTS_Sigq=OTSSIG(m,SigKeyq)が使用される。場合によっては、上述のようにTopNodesCacheおよびBottomNodesCacheについて関数を使用して、認証パスAuthPathqが計算される。たとえば、署名インデックスqの認証パスは、以下の関数によって計算されてもよい。
1.h=0→(K-1)について:
a.r=GetAuthPathIndex(q,h)とする。
b.
【0082】
【数18】
。
2.h=K→(H-2)について:
a.i=[q/2
h+1]とする。
b.b=i+2
h-1とする。
c.
【0083】
【数19】
。
3.AuthPath
qを返す。
場合によっては、上記のステップ2におけるTopNodesCacheからの読み出しは、アイツィンガーの方法に従う。
【0084】
実装形態によっては、BottomNodesCacheの将来の部分木内の葉ノードが、(たとえば署名後の更新時に)たとえば上述のようにインデックス付け関数を使用して生成される。実施例によっては、葉ノードを生成し、葉ノードをBottomNodesCacheの適切なインデックス場所rに記憶するために、以下の関数が使用される。
1.r=GetInsertIndex(q+2K-1)とする。
2.s=GetNextLeafCalcIndex(q mod2K)とする。
3.q mod2K≠0およびr<2Hの場合:
a.h=CTZ(s+1)とする。
b.
【0085】
【数20】
。/
*インデックスsにおける葉ノードを生成する。
c.
【数21】
。/
*中間ノードを生成する。
d.
【数22】
。
【0086】
場合によっては、OTS_Sigq、AuthPathq、およびqを使用してワンタイム署名が作成される(たとえばSig=(q,OTS_Sigq,AuthPathq))。場合によっては、OTS署名生成時に計算された
【0087】
【数23】
を使用し、インデックス関数UpdateCaches(q)を使用してTopNodesCacheおよびBottomNodesCacheが更新され、署名インデックスqが次の値(たとえばq=q+1)に進められる。
【0088】
場合によっては、ハッシュベースの署名スキームが、追加の記憶場所OTSCacheを使用することができ、それによって記憶域使用を犠牲にしてCPU使用率を低減するように連係して作用するキャッシュのシステムを提供することができる。
図7に示すように、ハッシュ木700における葉ノードのためにウィンターニッツチェーンから中間ノードが選択され、OTS状態で結合される。次に複数のOTS状態が単一の連続した記憶場所であるOTSCacheで結合されてもよい。OTS状態は、1チェーン当たりのハッシュ関数呼び出し数を削減することによって署名の作成の助けとなる。署名時、OTSスキームの実装形態は、チェーンの最下部から計算を開始するか、またはOTSCache内にキャッシュされているノードから開始するかを決定する。
【0089】
実装形態によっては、BottomNodesCacheのアクティブ部分木と将来の部分木と連係してOTSCacheが使用され、更新される。たとえば、署名時、アクティブ部分木の部分がインデックスqにおける所与の葉ノードのための認証パスの部分を提供する。場合によっては、OTSの計算を容易にするために、OTSCacheでqにおけるOTS状態が照会される。ワンタイム署名を生成するためにその結果のOTSと認証パスとが結合される。
【0090】
場合によっては、署名時、将来の部分木の1つの新規葉ノードが生成される。新規葉ノードの生成の一部として、OTS検証鍵が計算される。場合によっては、その計算の一部としてOTS状態が生成され、OTSCacheに挿入される。言い換えると、OTS状態は葉の計算の副産物である。場合によっては、これはBottomNodesCacheを実装するシステムが、特に、署名時のOTS状態の除去と、木の更新時の新規OTS状態の挿入のために、OTSCacheをシームレスに使用することができるようにする。場合によっては、BottomNodesCacheはOTSCacheへの新規OTS状態の挿入を扱い、一方、OTS生成プロセスはそれらの除去を扱う。
【0091】
実装形態によっては、選ばれたOTS状態がOTSCacheに記憶されてもよい。場合によっては、OTS状態がK個のレベルにおける右ノードの計算の結果として生成されてもよい。場合によっては、署名計算と検証鍵生成の高速化のためにOTSCacheが使用されてもよい。たとえば、
図7に示すウィンターニッツOTS状態を実装する場合に、たとえばウィンターニッツ窓のサイズについて署名鍵に対してハッシュ演算を繰り返し適用する代わりに、OTS状態により少ないハッシュ演算を適用することによって対応する検証鍵を計算することができる。
【0092】
実装形態によっては、OTSCacheはシステム初期設定時に初期設定されてもよく、記憶効率を最大限にするためにOTS署名後に更新されてもよい。場合によっては、OTSCacheはTopNodesCacheおよびBottomNodesCacheの初期設定後、OTSインデックスqの初期設定の前に初期設定される。場合によっては、OTSCacheには、最初のKサイズの部分木、たとえばアクティブ部分木の分類に入る2
K-1個のOTS状態が格納される。場合によっては、OTSCacheのサイズは一定している。たとえば、実装形態によっては、OTSCacheは、最初は、場所InitLeaves={1,2,...,2
K-1}における葉ノードに対応するOTS状態からなる。場合によっては、場所0におけるOTS状態は除外される。場合によっては、OTSCacheは、初期OTSCache構成であっても2
K-1個のOTS状態を超えることはない。
図7は、図では強調して示されているOTSCacheに記憶可能な初期OTS状態の一例を示している。
【0093】
図8に、暗号ハッシュ木800に関連するOTS状態のための例示の記憶方式810を示す。この実施例では、ハッシュ木800は高さH=4で、カットオフレベルがK=2である。図のように、記憶スキーム810は、OTSCacheに連結された、BottomNodesCacheに連結されたTopNodesCacheを使用する。この実施例では、TopNodesCacheは2
H-K-1-1個のノードのための記憶スペースを有し、BottomNodesCacheは、2
K+(K-2)個のノードのための記憶スペースを有し、OTSキャッシュは2
K-1個のOTS状態のためのスペースを必要とする。これらのキャッシュのサイズはこの実施例では固定的であるため、
図8に示すように互いに連結可能である。
【0094】
場合によっては、OTSCacheは、OTS状態の線形配列である。場合によっては、デジタル署名の生成時、署名計算の助けとなるようにOTSCacheでOTS状態が照会される。OTS状態が使用された後は、そのOTS状態は必要ではなくなり、キャッシュ内で使用していたスペースが解放可能になる。場合によっては、OTSCache内のOTS状態の場所のインデックスrを判定するためにr=GetOTSCacheIndex(q)関数が使用される。この関数は、以下のように動作し得る。
1.a=q&(2K-1)とする。
2.[q/2K]が奇数の場合、b=2Kとし、それ以外の場合はb=0とする。
3.r=|a-b|-1とする。
4.rを返す。
【0095】
q mod2K≠0の場合、署名インデックスqのOTS状態を記憶するOTSキャッシュのインデックスを取得するために、r=GetOTSCacheIndex(q)関数が使用されてもよい。その場合、OTS状態が署名計算において以下のように使用される。
OTSStateq=OTSCacher
OTS_Sigq=OTSSIG(m,SigKeyq,OTSStateq)
【0096】
場合によっては、OTS状態はqにおける葉ノードを計算するためにも使用することができる。たとえば、OTS状態が入手可能な場合、葉ノードは以下のように計算可能である。
【数24】
【0097】
q mod2K=0の場合、OTSキャッシュには使用するOTS状態がない可能性がある。そのような場合、OTSキャッシュが鍵ペアに使用されていないかのように、デジタル署名がシード値から計算されてもよい。
【0098】
場合によっては、OTSCacheは位置インデックスrにおける新規OTS状態で更新される。OTSC状態を使用し、追跡するハッシュベースの署名スキームでは、その新規OTS状態を生成するために関数が使用されてもよい。たとえば、OTSCacheを更新するために使用される関数には、前述の将来の部分木における新規ノードの生成と記憶のために使用される例示の関数の変形が含まれ得る。たとえば、更新は以下のように進行可能である。
1.r=GetNextInsertIndex(q+2K-1)とする。
2.s=GetNextLeafCalcIndex(q)mod2Kとする。
3.t=GetOTSCacheIndex(q)とする。
4.q mod2K≠0およびr<2Hの場合:
a.h=CTZ(s+1)とする。
b.OTSStates=GenOTSState(s)。/*新規OTS状態を生成する。
c.
【0099】
【数25】
。/
*新規葉ノードを生成する。
d.
【数26】
。/
*新規将来の部分木ノードを生成する。
e.
【数27】
。
f.OTSCache
t=OTSState
s。
【0100】
図9は、ハッシュベースのデジタル署名スキームの例示のプロセス900を示す流れ図である。例示のプロセス900は、たとえば、通信チャネルを介して情報をやり取りすることができるコンピュータシステムによって行うことができる。たとえば、プロセス900の動作は、
図1に示す例示の通信システム100または他の種類のシステムにおけるデバイス102、104によって行われてもよい。一例として、署名デバイスが
図1のデバイス102であってもよく、検証デバイスが
図1のデバイス104であってもよい。例示のプロセス900は、追加の動作または異なる動作を含んでもよく、動作は図の順序で、または別の順序で行われてもよい。場合によっては、
図9に示す動作のうちの1つまたは複数の動作が、複数の動作、サブプロセスまたは他の種類のルーチンを含むプロセスとして実装される。場合によっては、動作は組み合わされ、並列して行われ、反復され、またはその他の方法で繰り返され、または別の方式で行われることが可能である。
【0101】
実施形態によっては、1つまたは複数のキャッシュが暗号ハッシュ木のノード(たとえばマークル木のノードのサブセット)で初期設定される。アクティブ部分木のノードの第1のサブセットが、キャッシュメモリ内のインデクス付き場所の第1のセットに記憶されてもよく、将来の部分木のノードの第2のサブセットがキャッシュメモリ内のインデックス付き場所の第2のセットに記憶されてもよい。アクティブ部分木と将来の部分木とは暗号ハッシュ木の重なり合わないノードであり、各部分木はハッシュ木のカットオフレベルより下位のノードを含む。実装形態によっては、キャッシュメモリは循環バッファメモリである。実施例によっては、アクティブ部分木のノードの第1のサブセットは、アクティブ部分木の右ノード、たとえば
図3Bに示す部分木300Bの右ノードである。場合によっては、インデックス付き場所の第1のセットは、循環バッファメモリ内の連続した場所(たとえば
図4のBottomNodesCache410のインデックス付き場所3、4および5)である。実装形態によっては、ノードは各ノードのそれぞれの存続期間に従ってインデックス付き場所において順序付けられる。たとえば、
図3Bに、ノードDが最初に使用され、ノードBが2番目に使用されることになり、一方、ノードGが最後に使用され、これらのノードがBottomNodesCache330Bに記憶されるときにそれに応じて順序付けられる様子を示す。場合によっては、インデックス付き場所の第2のセットは、循環バッファメモリ内の連続した場所(たとえば、
図4のBottomNodesCache410のインデックス付き場所8、0および1)である。場合によっては、第2のキャッシュメモリ(たとえば
図2Bに示すTopNodesCache)に、暗号ハッシュ木のカットオフレベルより上位のレベルの右ノードが格納され、第3のキャッシュ配列にアクティブ部分木のOTS状態が格納される。
【0102】
場合によっては、アクティブ部分木においてノードが使用されるにつれて、インデックス付き場所の第1のセットとインデックス付き場所の第2のセットは右がシフトされる。たとえば、
図4で、メモリの最後に達するように将来の部分木のノードを記憶するインデックスが右にシフトされ、将来の部分木のインデックスがメモリBottomNodesCache410のインデックスにラップアラウンドする。またBottomNodesCache410において、アクティブ部分木と将来の部分木のノードがメモリ内の連続した場所に記憶される。場合によっては、アクティブ部分木に関連付けられたキャッシュメモリのインデックス付き場所の第1のセットにおいてノードが枯渇すると、将来の部分木に関連付けられたキャッシュメモリの第2の部分におけるノードがアクティブ部分木ノードになる。
【0103】
904で、現在の署名インデックスについてワンタイム署名(OTS)が生成される。場合によっては、たとえば
図4に示すように、アクティブ部分木に現在の署名インデックスが関連付けられる。
【0104】
906で、OTSの認証パスが生成される。場合によっては、認証パスは、キャッシュメモリのインデックス付き場所の第1のセットのうちの1つまたは複数の場所から取り出された1つまたは複数のノードを含む。
図4に示す実施例では、認証パスはアクティブ部分木のノードA、FおよびCを含み、これらのノードはインデックス3、4および5におけるBottomNodesCache410から取り出される。場合によっては、認証パスは、暗号ハッシュ木のカットオフレベルより上位の1つまたは複数のノードを含む。
図4に示す実施例では、認証パスは、署名インデックス4のカットオフレベルKより上のノード420を含む。
【0105】
908で、将来の部分木の新規ノードが生成される。場合によっては、ハッシュベースの署名スキームが署名インデックスの一連の値をたどって進行するにつれて、将来の部分木の新規ノードが暗号ハッシュ木ノード順序の逆の順序で生成される。
図5に、ノードの作成の逆順の一例を示し、
図4に、将来の部分木の最後のノードZ、XおよびYがたとえば上述のSigma関数を使用して先に生成される一実施例を示す。場合によっては、新規ノードの計算は、暗号ハッシュ木の1つの新規葉ノードのみが生成されるだけでよい。場合によっては、新規ノードはキャッシュメモリに記憶され、将来の部分木のノードの第2のサブセットのうちの1つのノードになる。たとえば、新規ノードは将来の部分木がアクティブ部分木になると、たとえばハッシュ木400のアクティブ部分木の部分に示すように、ノードが順に走査されることができるように循環バッファメモリ内の場所に記憶されてもよい。
【0106】
910で、OTSと認証パスとを含むデジタル署名が生成される。実施例によっては、デジタル署名は、署名側実体から検証側実体に伝達されるメッセージ上の署名である。たとえば、
図1に示す実施例でデバイス102は他方のデバイス104のためのメッセージに基づいてデジタル署名を生成してもよい。デジタル署名は(認証パスおよび公開鍵とともに)、検証側実体が、たとえば、メッセージが改変または破壊されていないことを検証するために、署名側実体からのメッセージの真正性を検証することができるようにする。
【0107】
デジタル署名と認証パスは、次に、通信システムにおける送信のために提供されてもよい。たとえば、
図1に示す実施例では、デバイス102がチャネル106を介した他方のデバイス104への送信のための情報を提供してもよい。デジタル署名と認証パスは、たとえば、署名側実体から検証側実体に送信されてもよい。場合によっては、デジタル署名と認証パスは、デジタル署名と認証パスを使用して検証可能なメッセージに関連付けられて送信される。
【0108】
912で、キャッシュメモリが更新される。たとえば、BottomNodesCache、TopNodesCacheおよびOTSCacheのうちの1つまたは複数のキャッシュが更新されてもよい。たとえば、BottomNodesCache、TopNodesCacheを更新するために上述のUpdateCaches関数が使用されてもよい。
【0109】
914で、現在の署名インデックスが次の署名インデックスに前進させられる。署名インデックスの前進により、署名インデックスがOTS生成のための次の署名鍵に関連付けられた値に変化する。場合によっては、署名インデックスqは、qを1だけインクリメントすることによって、次の値、たとえばq=q+1に前進させられる。たとえば、
図6に署名インデックス値0に関連付けられた状態630から署名インデックス1に関連付けられた状態640への変化を示す。場合によっては、アクティブ部分木のインデックス付き場所の第1のセットにおける右ノードに関連付けられたインデックスが判定され、その右ノードが左の兄弟ノードに置き換えられる。
図6の実施例に示すように、右ノードは認証パス内で使用されなくなるため、キャッシュメモリのインデックス0における右ノードD
Rが、キャッシュメモリのインデックス0におけるその兄弟の左ノードD
Lに置き換えられる。
【0110】
本明細書に記載の主題および動作の一部は、本明細書で開示されている構造体およびその構造的同等物またはそれらのうちの1つまたは複数の組み合わせを含む、デジタル電子回路で、またはコンピュータソフトウェア、ファームウェアまたはハードウェアで実装可能である。本明細書に記載の主題の一部は、1つまたは複数のコンピュータプログラム、たとえば、データ処理装置によって実行されるか、またはデータ処理装置の動作を制御するための、コンピュータ記憶媒体上で符号化されたコンピュータプログラム命令の1つまたは複数のモジュールとして実装可能である。コンピュータ記憶媒体は、コンピュータ可読ストレージデバイス、コンピュータ可読ストレージ基板、ランダムまたは順次アクセスメモリアレイまたはデバイス、またはこれらのうちの1つまたは複数の組み合わせとすることができるか、またはこれらに含まれることができる。また、コンピュータ記憶媒体は伝播信号ではないが、コンピュータ記憶媒体は人工的に生成された伝播信号で符号化されたコンピュータプログラム命令の供給源または供給先とすることができる。コンピュータ記憶媒体は、1つまたは複数の別個の物理コンポーネントまたは媒体(たとえば複数のCD、ディスクまたはその他のストレージデバイス)であるか、またはこれらに含まれ得る。
【0111】
本明細書に記載の動作の一部は、データ処理装置によって、メモリに(たとえば1つまたは複数のコンピュータ可読ストレージデバイスに)記憶されているかまたは他の供給源から受け取ったデータに対して行われる動作として実装可能である。「データ処理装置」という用語は、たとえばプログラマブルプロセッサ、コンピュータ、1つのチップまたは複数のチップ上のシステム、またはこれらの組み合わせを含む、データを処理するためのあらゆる種類の装置、デバイスおよび機械を包含する。装置は、特殊目的ロジック回路、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)を含むことができる。装置は、ハードウェアに加えて、プロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、クロスプラットフォーム実行時環境、仮想マシンまたはこれらのうちの1つまたは複数の組み合わせを構成する、対象コンピュータプログラムたとえばコードのための実行環境を生じさせるコードも含むことができる。場合によっては、データ処理装置は、1組のプロセッサを含む。1組のプロセッサは同一場所にあってもよく(たとえば同じコンピュータデバイス内の複数プロセッサ)、または互いに異なる場所にあってもよい(たとえば分散コンピューティングデバイスにおける複数プロセッサ)。データ処理装置によって実行されるデータを記憶するメモリは、データ処理装置と同一場所にあってもよく(たとえば同じコンピューティングデバイスのメモリに記憶された命令を実行するコンピューティングデバイス)、またはデータ処理装置とは異なる場所にあってもよい(たとえばサーバデバイス上に記憶された命令を実行するクライアントデバイス)。
【0112】
コンピュータプログラム(プログラム、ソフトウェア、ソフトウェアアプリケーション、スクリプトまたはコードとも呼ばれる)は、コンパイラ言語またはインタプリタ型言語、宣言型言語、または手続き型言語を含む、任意の形態のプログラミング言語で書くことができ、スタンドアロンプログラムとして、またはモジュール、コンポーネント、サブルーチン、オブジェクトまたは、コンピューティング環境での使用に適するその他の単位を含む、任意の形態で配備可能である。コンピュータプログラムは、ファイルシステムにおけるファイルに対応し得るが、必ずしもその必要はない。プログラムは、他のプログラムまたはデータを保持するファイルの一部に(たとえば、マークアップ言語ドキュメントに記憶された1つまたは複数のスクリプト)、そのプログラム専用の単一ファイルに、または複数の連係ファイルに(たとえば1つまたは複数のモジュール、サブプログラムまたはコードの一部を記憶するファイル)記憶可能である。コンピュータプログラムは、1つのコンピュータ上、または1つの場所にあってまたは複数の場所に分散され、通信ネットワークによって相互接続された複数のコンピュータ上で実行されるように配備可能である。
【0113】
コンピュータプログラムの実行に適するプロセッサには、たとえば、汎用と専用の両方のマイクロプロセッサ、および任意の種類のデジタルコンピュータのプロセッサが含まれる。一般に、プロセッサは、読み取り専用メモリまたはランダムアクセスメモリあるいはその両方から命令およびデータを受け取ることになる。コンピュータの要素は、命令に従ってアクションを行うプロセッサと、命令およびデータを記憶する1つまたは複数のメモリデバイスとを含み得る。コンピュータは、データを記憶するための1つまたは複数の大容量ストレージデバイス、たとえば非磁性ドライブ(たとえばソリッドステートドライブ)、磁気ディスク、光磁気ディスク、または光ディスクも含んでもよく、またはそれらからデータを受信し、またはそれらにデータを転送し、あるいはその両方を行うようにそれらに動作可能に結合されてもよい。しかし、コンピュータはそのようなデバイスを有しなくてもよい。また、コンピュータは、別のデバイス、たとえば、電話、タブレットコンピュータ、電子機器、モバイルオーディオまたはビデオプレーヤ、ゲームコンソール、グローバルポジショニングシステム(GPS)受信機、物のインターフェース(IoT)デバイス、マシンツーマシン(M2M)センサまたはアクチュエータ、または可搬型ストレージデバイス(たとえばユニバーサルシリアルバス(USB)フラッシュドライブ)に内蔵可能である。コンピュータプログラム命令およびデータを記憶するのに適するデバイスは、たとえば、半導体メモリデバイス(たとえばEPROM、EEPROM、フラッシュメモリデバイスなど)、磁気ディスク(たとえば内部ハードディスク、取り外し可能ディスクなど)、光磁気ディスク、およびCD ROMおよびDVD-ROMディスクを含む、あらゆる形態の不揮発性メモリ、媒体、およびメモリデバイスを含む。場合によっては、プロセッサおよびメモリは、専用ロジック回路によって補完されてもよく、または専用ロジック回路に組み込まれてもよい。
【0114】
ユーザとの対話を可能にするために、ユーザに対して情報を表示するためのディスプレイデバイス(たとえば、モニタまたは他の種類のディスプレイデバイス)と、ユーザがコンピュータに入力を提供することができるキーボードおよびポインティングデバイス(たとえばマウス、トラックボール、スタイラス、タッチスクリーンまたは他の種類のポインティングデバイス)とを有するコンピュータ上で動作を実装することとができる。ユーザとの対話を可能にするために他の種類のデバイスも使用することができる。たとえば、ユーザに提供されるフィードバックは、任意の形態の感覚フィードバック、たとえば視覚フィードバック、聴覚フィードバック、または触覚フィードバックとすることができ、ユーザからの入力は、音響入力、音声入力または触覚入力を含む、任意の形態で受け取ることができる。さらに、コンピュータは、ユーザによって使用されるデバイスにドキュメントを送信し、ユーザによって使用されるデバイスからドキュメントを受信することによって、たとえば、ウェブブラウザから受信した要求に応答してユーザのクライアントデバイス上のウェブブラウザにウェブページを送信することによって、ユーザと対話することができる。
【0115】
コンピュータシステムは、単一のコンピューティングデバイス、または、近傍でまたは一般には互いに遠隔で動作し、典型的には通信ネットワークを介して対話する複数のコンピュータデバイスを含み得る。通信ネットワークは、ローカルエリアネットワーク(「LAN」)、ワイドエリアネットワーク(「WAN」)、インターネットワーク(たとえばインターネット)、衛星リンクを含むネットワーク、およびピアツーピアネットワーク(たとえばアドホックピアツーピアネットワーク)のうちの1つまたは複数のネットワークを含み得る。クライアントとサーバの関係は、それぞれのコンピュータ上で実行され、互いにクライアント-サーバ関係を有するコンピュータプログラムによって生じ得る。
【0116】
本明細書に記載の実施例の一般的な態様では、デジタル署名スキームは、暗号ハッシュ木のノードをバッファメモリに記憶する。
【0117】
第1の実施例では、暗号ハッシュ木のノードはバッファメモリに記憶される。ノードをバッファメモリに記憶することは、アクティブ部分木のノードの第1のサブセットをバッファメモリ内のインデックス付き場所の第1のセットに記憶することと、将来の部分木のノードの第2のサブセットをバッファメモリのインデックス付き場所の第2のセットに記憶することとを含む。アクティブ部分木と将来の部分木とは、同じサイズの重なり合わない部分木である。署名インデックスの現在の値に関連付けられた署名鍵に基づいてワンタイム署名(OTS)が生成される。署名インデックスの現在の値は、アクティブ部分木の現在の葉ノードにも関連付けられる。署名インデックスの現在の値に基づいてOTSの認証パスが生成される。認証パスの生成は、バッファメモリからノードの第1のサブセットのうちの1つまたは複数のノードを取り出すことを含む。OTSと認証パスとを含むデジタル署名が、メッセージ受信側への送信のために提供される。署名インデックスの現在の値に基づいて将来の部分木の新規ノードが計算される。将来の部分木の新規ノードはバッファメモリに記憶される。署名インデックスは次に、現在の値から署名インデックスの次の値に前進させられる。
【0118】
第1の実施例の実装形態は、以下の特徴のうちの1つまたは複数の特徴を含み得る。インデックス付き場所の第1のセットの第1の記憶場所に記憶された右ノードが特定される。右ノードは第1の記憶場所においてその左の兄弟ノードに置き換えられる。アクティブ部分木と将来の部分木は、高さKの部分木であり、ノードの第1のサブセットと第2のサブセット内のノードの合計数は2K+(K-2)に等しい。
【0119】
第1の実施例の実装形態は、以下の特徴のうちの1つまたは複数の特徴を含み得る。バッファメモリは、下位ノードキャッシュであり、アクティブ部分木と将来の部分木はそれぞれ、暗号ハッシュ木のカットオフレベルより下のノードを含み、認証パスの生成は、上位ノードキャッシュから、暗号ハッシュ木のカットオフレベルより上の1つまたは複数のノードを取り出すことを含む。アクティブ部分木に関連付けられたOTS状態をOTSキャッシュに記憶することができ、OTS署名の生成は、署名インデックスの現在の値に関連付けられたOTS状態のうちの1つまたは複数のOTS状態を使用することを含み得る。上位ノードキャッシュの第1の記憶場所に記憶されている右ノードを特定することができ、第1の記憶場所において右ノードを、その左兄弟ノードを第1の記憶場所に記憶することによって置き換えることができる。
【0120】
第1の実施例の実装形態は、以下の特徴のうちの1つまたは複数の特徴を含み得る。バッファメモリは循環バッファメモリとすることができる。インデックス付き場所の第1のセットは、循環バッファメモリ内で連続していることができ、インデックス付き場所の第2のセットは循環バッファメモリ内で連続していることができる。循環バッファメモリに将来の部分木の新規ノードを記憶することにより、循環バッファメモリ内のインデックス付き場所の第1のセットと第2のセットとの境界をシフトさせることができる。バッファメモリに将来の部分木の新規ノードを記憶すると、バッファメモリからアクティブ部分木のノードが枯渇し、署名インデックスの次の値が将来の部分木における葉ノードに関連付けられ得る。将来の部分木は、次に、(たとえば署名インデクスの次の値に基づいて次のOTSを生成するために)アクティブ部分木になる。
【0121】
第1の実施例の実装形態は、以下の特徴のうちの1つまたは複数の特徴を含み得る。バッファメモリに将来の部分木の新規ノードを記憶することは、新規ノードを第1のインデックス値に関連付けられた第1の記憶場所に記憶することを含む。第1のインデックス値は、(たとえば、上述のようにr=GetInsertIndex(q+2K-1)を使用して、または別の関数を使用して)署名インデックスの現在の値に基づいて特定されてもよい。署名インデックスの現在の値に基づいて将来の部分木の新規ノードを計算することは、(たとえば、上述のようにs=GetNextLeafCalcIndex(q)mod2Kを使用して、または別の関数を使用して)署名インデックスの現在の値に基づいて将来の部分木の葉ノードのインデックスを特定することと、(たとえば上述のように
【0122】
【数28】
を使用して、または別の関数を使用して)葉ノードのインデックスに基づいて将来の部分木の新規ノードを計算することとを含み得る。
【0123】
第1の実施例の実装形態は、以下の特徴のうちの1つまたは複数の特徴を含み得る。第1の実施例の動作は、ハッシュベースの署名スキームに従って実行可能である。このハッシュベースの署名スキームは、署名インデックスの値が一連の値をたどって前進する(たとえば増加する)につれて、将来の部分木の新規葉ノードを逆順(たとえば降順)で計算してもよい。ハッシュベースの署名スキームは、署名インデックスのそれぞれの現在の値に基づいて将来の部分木の各新規ノードを計算してもよい。ハッシュベースの署名スキームは、将来の部分木の各新規ノードの計算が暗号ハッシュ木の1つの葉ノードのみの計算だけで済むように、アクティブ部分木と将来の部分木のノードをバッファメモリに記憶し、アクセスしてもよい。
【0124】
実装形態によっては、コンピューティングシステムが、1つまたは複数のプロセッサと、1つまたは複数のプロセッサによって実行されると第1の実施例の1つまたは複数の動作を行うように動作可能な命令を記憶するメモリとを含む。実装形態によっては、コンピュータ可読媒体が、データ処理装置によって実行されると第1の実施例の1つまたは複数の動作を行うように動作可能な命令を記憶する。
【0125】
本明細書には多くの詳細が記載されているが、これらの詳細は特許請求可能な対象の範囲の限定と理解されるべきではなく、特定の実施例に固有の特徴の説明と理解すべきである。別々の実装形態の文脈で本明細書に記載されているかまたは図面に示されている特定の特徴を組み合わせることができる。逆に、単一の実装形態の文脈で記載されているかまたは図示されている様々な特徴を、複数の実施形態で別々に、または任意の適切な部分的な組み合わせで実装することもできる。
【0126】
同様に、図面では動作が特定の順序で記載されているが、このことは、望ましい結果を得るために、そのような動作が図示されている特定の順序で、または順次的な順序で行われること、または示されているすべての動作が行われることを必要としているものと理解されるべきではない。特定の状況では、マルチタスク処理および並列処理が有利な場合がある。また、上述の実装形態における様々なシステムコンポーネントの分離は、そのような分離がすべての実装形態において必要であるものと理解されるべきではなく、記載されているプログラムコンポーネントおよびシステムは全体が単一の製品として統合され、または複数の製品にパッケージ化されることが可能であるものと理解すべきである。
【0127】
いくつかの実施形態について説明した。しかし、様々な変更を加えることができることは理解されるであろう。したがって、その他の実施形態も以下の特許請求の範囲に含まれる。
【国際調査報告】