【文献】
S. Chow, P. Eisen, H. Johnson, P. C. Oorschot,“White-Box Cryptography and an AES Implementation”,SELECTED AREAS IN CRYPTOGRAPHY: 9TH ANNUAL INTERNATIONAL WORKSHOP,2002年 8月15日,VOL. 2595,PAGES 1-18
(58)【調査した分野】(Int.Cl.,DB名)
前記入力メッセージは、符号化された形式で受信され、前記入力メッセージを符号化する工程は、内部符号化により前記入力メッセージを再符号化する工程を含む、請求項1または請求項2に記載の方法。
前記暗号ハッシュ関数は、SHA−1、SHA−224、SHA−256、SHA−384、またはSHA−512である、請求項1から請求項3のいずれか1項に記載の方法。
前記入力メッセージは、符号化された形式で受信され、前記入力メッセージを符号化する工程は、内部符号化により前記入力メッセージを再符号化する工程を含む、請求項13または請求項14に記載のコンピュータ可読媒体。
前記暗号ハッシュ関数は、SHA−1、SHA−224、SHA−256、SHA−384、またはSHA−512である、請求項13から請求項15のいずれか1項に記載のコンピュータ可読媒体。
【発明を実施するための形態】
【0012】
一般的に、本発明は、ホワイトボックス環境での攻撃に対抗する暗号ハッシュ関数の保護されたソフトウェアの実行を生成する方法およびシステムを提供する。本明細書で、ホワイトボックス環境とは、ある攻撃者が実行環境およびソフトウェアの実行を完全にコントロールする環境のことをいう。つまり、その攻撃者は、コード、データ構成、および実行環境に対するアクセス権を持つ。ジョンソン氏らへ付与された米国特許7,397,916号、発明の名称「SYSTEM AND METHOD FOR OBSCURING BIT−WISE AND TWO’S COMPLEMENT INTEGER COMPUTATIONS IN SOFTWARE」は、ホワイトボックス攻撃環境に関する背景情報を含み、引用することにより本明細書に含まれる。
【0013】
本明細書にて記載される保護された暗号ハッシュの実行により、ハッシュ演算の入力と出力を符号化することができる。本明細書で、符号化とは、可逆関数のことをいい(例えば、バイトからバイトへ、または、ワードからワードへ)、極秘データを隠すために使用される。本開示では、メモリ内の符号化されていない値(すなわち、メッセージ、ダイジェストおよびその中間値)を露出することなく、どのように符号化されたメッセージを受け付け、どのように符号化されたダイジェストを作成するかを記載する。
【0014】
本開示の実施形態は、ハッシングアルゴリズムを変換し、変換されたドメイン内で演算を行う。そして、どんな場合でも保護された情報を露出することなく、効果的な方法で、変換された入力に作用する、および/または、変換された出力を作成する。これにより、ハッシュ関数の演算をホワイトボックス攻撃から保護する。実施形態は、元のハッシングアルゴリズムとの互換性を保ちながら、このような保護を実現する。本明細書内での互換性とは、符号化されたメッセージ入力を受信し、符号化されていない出力オブジェクトを作成する保護された実行が、符号化されていないメッセージ入力を受信する標準的なハッシュ関数の実行と同じ結果となるようにすることを意味する。
【0015】
従来のハッシングアルゴリズム
暗号ハッシュ関数の一例としては、2008年10月のFIPS PUB 180−3(米国商務省)のSecure Hash Standard(SHS)に記載されるようなSHA−256アルゴリズムがある。
図1〜4と、それらに伴う記載によって、SHA−256アルゴリズムの従来の実行が説明されている。SHA−256アルゴリズムは、単なる例として提示され、本発明を示すために使用される。ただし、当然のことながら、当業者は、本開示の実施形態がいかなる暗号ハッシュ関数にも適用できることを理解するであろう。
【0016】
図1は、SHA−256アルゴリズムのバイト指向ハッシュの実行の高レベルでの概観を示すフローチャートである。当業者は当然理解するであろうが、ビット指向の実行も支持される。
【0017】
まず、8個の初期ハッシュ値H
i(以下、状態変数とも言う)と、64個の定数値K
jとが、アルゴリズムの仕様内で定義されているように特定の定数値に初期化される(ステップ102および104)。
【0018】
そして、入力メッセージMが前処理される。メッセージはまず、
図2のアルゴリズムによりパディングされる(ステップ106)。
図2に示すように、0x80バイトがメッセージMの最後に追加される(ステップ202)。それから、(バイトでの)Mの長さが64を法として56と合同になるまで、さらにパディング用の0x00バイトがメッセージMの最後に追加される(ステップ204、206)。そして、64ビットでビッグエディアン方式の整数(つまり、8バイト)として、ビットでのMの元の長さが、Mに追加される(ステップ208)。よって、パディング処理は、バイトでの長さが64を法として0と合同である、パディングされたメッセージを生成する。再度、
図1を参照すると、その後、そのメッセージは、64バイトのブロックに分割され、各ブロックは、16個の32ビットでビッグエディアン方式のワードの配列mであると解釈される(ステップ108)。
【0019】
中間値a、b、・・・hが初期化された後(ステップ110)、
図3で詳細に説明されるように、各配列mは、64個の32ビットのワードの配列Wに拡張される(ステップ112)。
図3に示されるように、0≦i≦15の要素はW
i=M
iであり、16≦i≦63の要素はW
i=W
i−16+s
0(W
i−15)+W
i−7+s
1(W
i−2)であり、ここで、s関数は、「右回りのローテート」(ROTR)関数と、「右シフト」(SHR)関数とにより、図に示されたように定義される。
【0020】
配列Wの各要素について、パディングされたメッセージMの全てのブロックが処理される(ステップ118)まで、8個のハッシュ値H
iが、一時的な処理のための値(a〜h)にコピーされ(ステップ114)、8個の中間ダイジェスト値H
iに返される(ステップ116)。値(a〜h)は、
図4のフロー図で示されるようにマッピングされる。最終的なハッシュダイジェストは、256ビットの値であり、全てのメッセージブロックmが処理された後に最終的な8個の値H
iを結合することによって形成される(ステップ120)。
【0021】
以下は、標準的なSHA−256アルゴリズムの特徴であり、ホワイトボックスでの攻撃者がいかに実行を獲得するかを考える上で重要であり、上記の説明から推測することができる。
1.上記W配列を構築するために、入力メッセージはアクセス可能(可読)でなければならない。
2.
図3で示すようなW配列の構築では、「シフト」演算、「排他的論理和」(XOR)演算、「追加」演算のみが使用される。よく知られているように、ローテート演算は、「シフト」とXORにより実行することができる。例えば、32ビットのワードxがNビット分回転する右回りの循環は、xを(32−n)分、左シフトさせ、xを排他的論理和n分、右シフトさせることで行うことができる。
3.W配列内の最初の16個の値は、ちょうど16個のワードmであり、その時点で処理されているMの512ビットちょうどである。
4.パディング用ビットが、最後のメッセージブロックに存在し、メッセージMの長さによっては、2番目以降のメッセージブロックに存在しうる。これらパディング用ビットは、既知値である。攻撃者は、Mの長さを知っていると考えられ、よって、全てのパディング用ビット、および、どこからパディングが開始されるかを知っていると考えられる。
5.
図4で示される方法で最初のメッセージブロックが処理される間、値Hは、従って、値a〜hも、全て固定の既知値であり、使用されるアルゴリズムに基づいて予測できる。
図4に示すように、「未知の」値(メッセージビット、または、メッセージビットから派生した値)は、T
1の構成において、W配列を介してのみ、混ぜられる。これら未知の値は、ラウンド毎に2つの割合で、T
1の追加を経た状態変数内に、また、状態変数を経た値の数列に広まる(ラウンド1の後にaとe、ラウンド2の後にa、e、b、fなど)。最初のメッセージブロックのラウンド4が終了して初めて、状態値は全て、「未知の」データを含む。後続のメッセージブロックは、直前のブロックの最後の状態から始まるので、始めから未知のデータを含む。
6.
図4のアルゴリズムのメッセージブロックの処理または圧縮では、シフト演算(shift)、排他的論理和演算(exclusive or)、論理積演算(and)、否定演算(not)、および、加算演算(add)のみが使用される。排他的論理和は加算(add)と論理積(and)の組み合わせで表現することができる。
7.多くの応用において、メッセージとダイジェストとはバイトの配列として扱われるが、SHA−2アルゴリズム内では、メッセージとダイジェストとは、32ビットもしくは64ビットのワードとして演算が行われる。
[符号化関数]
【0022】
暗号関数および復号関数の保護されたソフトウェアの実行に対する、入力および/または出力は、符号化されたパラメータからなる。そのパラメータは、保護されたソフトウェアの実行と連動するモジュール内での特定の適応が必要なものである。
図5は、関数Eを用いて入力ドメインIDを出力ドメインODにマッピングする演算の応用を示す。逆算Dによって、出力値は入力ドメインID内の値にマッピングされる。
図5はまた、入力ドメインIDを符号化された入力ドメインID’にマッピングする変換T
Aと、符号化された出力ドメインOD’内の値を出力ドメインODにマッピングする変換T
Bとを示す。T
AとT
Bとは、全単射である。
【0023】
暗号関数EとDと共に、符号化関数T
AとT
Bとを用いるということは、以下のことを意味する。つまり、入力ドメインIDのデータ要素を符号化関数Eに入力し、出力ドメインODの暗号化されたデータ要素を得るのではなく、T
Aを適用して、ドメインID’の変換されたデータ要素が、変換された暗号化関数E’に入力されることを意味する。変換された暗号化関数E’は、符号化演算において、逆変換関数T
A−1および/またはT
B−1を組み合わせて、鍵などの機密情報を保護する。そして、ドメインOD’の、変換され、暗号化されたデータ要素が得られる。同様に、D’が、OD’内のデータ値を復号し、ID’内の値にマッピングする。保護された実行内でT
AとT
Bとを行うことにより、変換されたデータの空間内の入力データおよび出力データを分析した時に、暗号化関数Eと復号関数Dとの鍵を読み出すことはできない。
【0024】
変換関数T
AとT
Bの少なくとも一つは、非自明の関数であるべきである(つまり、恒等関数とは異なるべきである)。T
Aが恒等関数である場合、入力ドメインIDとID’は、当然、等しいドメインになるであろう。T
Bが恒等関数である場合、出力ドメイン同士は、当然、等しいドメインになるであろう。
[ハッシングアルゴリズムにおける符号化]
【0025】
OMAのDRMの例では、ハッシュ関数の出力は、コンテンツ暗号化キーを復元するのに使用された。よって、この状況では、少なくとも、ダイジェストが符号化されるべきである。しかしながら、ダイジェストのみを符号化するのでは、十分な保護とはならない。ハッシュ関数には鍵がかけられていないので、攻撃者が符号化されていない入力を入手した場合、OMAの仕様書内で定義されているハッシュ関数を攻撃者自身が実行し、利用することで、符号化されていない出力を計算できてしまう。従って、実施形態においては、ハッシュ関数への入力も符号化される。
【0026】
暗号ハッシュ関数の保護された実行が必要な状況では、ほとんどの場合、入力メッセージを符号化しなければならない。符号化することは、メッセージを攻撃者から守秘するのに役立つ(つまり、メッセージを簡単に読むことはできない)、そして、攻撃者が意図的にメッセージを変更するのが難しくなる。よって、メッセージの方式を完全性があるものにする。攻撃者が、中間状態からさかのぼって作業し、符号化されていない入力メッセージとなりうるものを計算するのが難しくなるように、符号化は、少なくともいくつかのハッシングアルゴリズムを通して維持されなければならない。
【0027】
なお、符号化されたメッセージから符号化されていないダイジェストを作成すると、必ず符号化されていないメッセージが露呈するわけではない。保護暗号ハッシュ関数の一方向関数という特性は、コンピュータ上で、入手したダイジェストを作成する入力メッセージを探すのは不可能であることを意味する。よって、応用において、符号化されていない出力を伴うハッシュ関数の保護された実行を利用することが可能性である。しかしながら、ダイジェストを符号化することは、メッセージをホワイトボックス攻撃者から守秘するのに役立ち、攻撃者が意図的にメッセージを改竄するのを難しくする。
【0028】
上記のように、本開示の実施形態は、SHA−256ハッシュアルゴリズムを使用する。以下に、ホワイトボックス攻撃に対抗するSHA−256の実行の作成方法の例を説明する。当業者は当然理解するであろうが、説明される方法やシステムは、若干の変更のみを伴い、同様の方法で、SHA−2族の他の暗号ハッシュ関数(SHA−224、SHA−384、SHA−512)を保護するためにも使用されうる。さらに、当業者が、SHA−1、MD5、それ以前のものなど、他の暗号ハッシュ関数を同様に保護するには、本方法および説明で十分足りる。
【0029】
ホワイトボックス攻撃に対する耐性は、ハッシュアルゴリズムの入力、出力、その中間の状態値の符号化を利用することで達成される。メッセージ(入力)とダイジェスト(出力)は、別々に保護することができ、符号化してしまうと、メッセージやダイジェストは、実行中のいかなる時点でも、それぞれの元の、符号化されていない形式で現れることはない。アルゴリズムの基本的な機能性は変更されない、それは、保護された実行により作成された符号化されたダイジェストと、保護されていない実行により作成されたダイジェストを同様に符号化することによって作成された、符号化されたダイジェストとは、同一のものであることを意味する。
[強固なハッシング]
【0030】
ハッシング演算を保護することとは、可逆符号化関数を適用して、ハッシュ関数のメッセージ(入力)および/またはダイジェスト(出力)を変換することを基本的に含んでいる。この符号化関数は、固定値を用いたXORと同じように簡単にできる、もしくは、任意の複合関数とすることができる。本開示の実施形態は、保護された情報をいかなる時も露出することなく、効率的な方法で、ハッシングアルゴリズムを変更し、変換された入力に作用する、および/または、変換された出力を作成する。その一方で、元のハッシングアルゴリズムとの互換性は維持される(つまり、実施形態が、変換されたメッセージ入力と符号化されていない出力ダイジェストを伴う、ホワイトボックスでの実行である場合、符号化されていない形式である同メッセージを伴う、標準的な実行と同じハッシュ効果がある)。本開示の実施形態は、(8ビットまたは32ビットのそれぞれの変換係数を用いて、8ビットまたは32ビットを同時に変換する)8ビットおよび32ビットのサイズの変換により、変換空間をより大きくすることができる。ハッシングアルゴリズムのいくつかの部分は、変換方式の詳細を露出することなく、変換された入力を変換された出力に効果的にマッピングできる表参照演算に置き換えられる。
【0031】
本開示のいくつかの実施形態では、メッセージとダイジェストの両方が変換されることを前提とする。この構成により、最高レベルのセキュリティが提供される。しかしながら、セキュリティ特性の弱体化という代償を伴いはするが、変換されていないメッセージ、または、変換されていないダイジェストを用いることもできる。限定的な保護はできるので、変換されていないメッセージと変換されていないダイジェストの両方を用いる構成とすることも可能であるが、推奨はしない。説明の実施形態では、メッセージとダイジェストの両方に対して、8ビット変換が用いられることを前提とするが、以下に説明するように、32ビット変換も支持される。
【0032】
図6は、暗号ハッシュ関数の演算を保護するシステムの高レベルでのブロック図である。
図7〜10を参照し、本開示のある実施形態による、SHA−256アルゴリズムの保護された実行を説明する。入力の符号化または出力の符号化を利用しない実施形態は、恒等変換にT
MまたはT
dを設定することにより、容易に上記から導かれる(なお、T
MおよびT
dは、それぞれ、メッセージ入力の符号化およびダイジェスト出力の符号化するものである)。これは、T
MからT
IMへのマッピング、および、T
HからT
dへのマッピングにのみ影響する。しかしながら、これらのインスタンスは、既知値が内部変換によって符号化されるであろうし、攻撃者がその内部変換を攻撃し、符号化された情報を復元することができうるので、安全性が低い。
【0033】
図6に示すように、入力メッセージMは、符号化関数T
Mにより符号化されており、再符号化され、符号化関数T
IM602を入力する。そして、その結果である、IMドメイン内の符号化されたメッセージT
IM(M)は、パディング関数604によって、暗号ハッシュ関数で決定された長さにパディングされる。例えば、SHA−256に関しては、T
IM符号化された入力メッセージのパディング後の長さは、64バイトを法として0に合同である。以下により詳しく述べられるように、パディング用バイトは、ある実施形態においては、メッセージの長さを4バイトの倍数にするのに必要な初期のパディング用バイトを除いて、符号化されていない。当該初期のパディング用バイトは、T
IMドメイン内で符号化したものである。本実施形態は、符号化されていないパディング用バイトが、同一ワード境界内のメッセージバイトに付属しないことを確実にするので、追加的なセキュリティを提供する。これにより、ワードのある部分は符号化され、他の部分は符号化されないという心配なく、確実に、メッセージバイトが均一にワードに分割される。しかしながら、当業者は当然理解するであろうが、本開示の実施形態は、たとえ、全てのパディング用バイトが符号化されていなくても、機能するであろう。
【0034】
パディング後のT
IM符号化されたメッセージは、それから、前処理され、ブロッキングまたは分割の関数606により所定の長さのワードのブロックに分割される。例えば、SHA−256の保護された実行において、パディング後のT
IM符号化された入力メッセージは、まず、64バイトの「チャンク」に分割され、続いて、各チャンクが16ビット、32ビットのワードのブロックに分割され、結果、16ワードの符号化された配列T
IM(m)となる。
【0035】
それから、各配列T
IM(m)は、T
IMドメイン内の変換された関数を適用し、処理される。変換されたSHA−2ハッシュ関数に関しては、図に示すように、任意の配列T
IM(m)が、まず、T
IMドメイン内の拡張関数608により処理され、符号化された配列T
W(W)が提供される。例えば、SHA−256に関しては、拡張関数の結果、符号化された配列T
W(W)は64個の32ビットのワードで構成される。そして、この拡張された配列は、T
Wドメイン内にある圧縮関数601により圧縮され、その結果、符号化された、中間値T
W(a、b、・・・h)となる。メッセージの全てのチャンクが処理されると、最終的な中間値は、符号化関数T
H612を用いて、任意で符号化され、符号化された出力ハッシュ値T
W(H
0、H
1、・・・H
7)が提供される。そして、これら出力ハッシュ値は、連結関数614によって連結され、元の入力メッセージMに対する符号化された出力ダイジェストT
d(D)が一つ生成される。
【0036】
図7〜10に示しながら、本方法の演算は、SHA−256の変換された実行を参照し、より詳細に説明される。
図7に示されるように、状態変数H
0〜H
7は、ハッシュ関数の基準により規定されるような値に初期化される(ステップ702)。64個の値K
0〜H
63も、ハッシュアルゴリズム仕様書内で定義されるような、それらの定数値に初期化される(ステップ704)。これらの変数は、初期の段階では、符号化されておらず、攻撃者が既知の定義された値を用いて、H
0〜H
7の変換を攻撃することを、確実にできないようにするのに役立っている。
【0037】
メッセージデータMは、符号化方式T
Mを用いて符号化された形式のアルゴリズムに入力される。この変換は、バイト指向、または、ワード指向のものでありうる。T
Mは、ハッシュ実行と保護されたハッシュ関数を用いるモジュールとの間の「インターフェイス」符号化である。T
M符号化は、その応用特有の、もしくは、その応用内でのハッシングアルゴリズムの使用のインスタント特有のものでありえる。いくつかの実施形態において、外部の変換T
Mは、内部の、任意に選ばれた、8ビットの変換T
IMに変換される。T
M符号化されたバイト/ワードは、T
IM符号化により、再符号化される(例えば、x’=T
IM(T
−1M(x)))。好ましい実施形態によると、再符号化は、復号の後に符号化するよりも、組み合わせた操作として行われる方が好ましく、このやり方だと、符号化方式が露出することがない。以下に説明するように、T
IM変換は、変換T
Mを露出することなくパディング用バイトを処理するのに有効である。そして、メッセージMは、パディングされ(ステップ706)、パディング済みの符号化されたメッセージとなる。
【0038】
パディング方法は、
図8に示される。一般的に、パディング用バイトは、符号化されていない形式で追加され、既知のパディング用バイトが、メッセージ上のT
IM変換を攻撃するために用いられるかもしれないリスクを減らす。メッセージバイトをメッセージワードに分割するのを容易にするために、符号化された形式から符号化されていない形式への移行は、32ビットのワード境界で行われるのが好ましい。符号化されたメッセージMの長さが、4を法として0と合同である場合、パディングされたメッセージの長さが、64を法として56と合同になるまで、符号化されていない0x80バイト、さらに必要であれば、符号化されていない0x00バイトが、メッセージの最後に追加される(ステップ802,804)。符号化されたメッセージMの長さが、4を法として0と合同でない場合、その長さが4を法として0になるまで、T
IM符号化された0x80バイト、および、0〜2個のT
IM符号化された0x00バイトが、符号化されたメッセージの最後に追加される(ステップ806,808)。その後、パディングされたメッセージの長さが、64を法として56と合同になるまで、符号化されていない0x00バイトが、メッセージの最後に追加される(ステップ804)。これらT
IM符号化された0x80および0x00の値は、ランタイムで決められるのではなく、先に計算されうる。T
IM変換は、値0x80と0x00とを露出することで、他の値の露出が必要とされることがないように、選ばれるのが好ましい。そして、(ビットでの)メッセージMの元の長さが、64ビットの整数として、パディングされたメッセージに追加される(ステップ810)。なお、この長さのフィールドは、常に8バイトであり、512ビットのチャンクで終わるので、常にワード整合される。なお、これは、簡潔化された実行であり、全てのメッセージがビット単位で、8を法として0と合同である長さである場合の応用に適している (つまり、メッセージは、ビット指向ではなく、バイト指向である)。(T
IM変換での露出よりもセキュリティに影響を及ぼす可能性がある)初期「1」のパディング用ビットを含むバイトの残りの値でありうるものを対象とする追加の符号化された値を用いて、この方式をビット指向メッセージに拡大して適用することができる。しかしながら、ハッシングアルゴリズムの様々な応用において、ビット単位のハッシングは必要とされない。
【0039】
図7に戻ると、パディング処理により、バイト単位で64を法として0と合同である長さのパディングされたメッセージが生じる。よって、T
IM符号化されたメッセージバイトは、64バイトのチャンクに分割される(ステップ708)。各チャンク内のバイトは、さらに32ビットのビッグエディアン形式のワードに分割され、16個のワードの配列mを形成する。中間値a、b、・・・hを現時点の値H
0、・・・H
7に初期化した(ステップ710)後、
図9に示すメッセージ拡張関数を用いて、配列Wが構築される(ステップ712)。
【0040】
図9に示すように、配列Wの最初の16の要素(W
iは0≦i≦15)が、まず決定され、格納される。処理中は、メッセージバイトが、いくつかのポイントで、符号化されていないパディング用バイトに移行する。符号化されていないパディング用バイトが、符号化されていない形式の配列Wに格納される。上記の
図8に概要が示されるように、パディング処理は、符号化されたメッセージバイトから符号化されていないメッセージバイトへの移行は、ワード境界のみで起こりうることを確実にする。従って、メッセージワードm
iのそれぞれは、4個の符号化されたバイトか、もしくは、4個の符号化されていないバイトからなり、符号化されたバイトと符号化されていないバイトとの組み合わせからなることはありえない。m
iが符号化されていない場合は(つまり、m
iがパディング用バイトのみからなる場合)、W
i=m
iが成り立つ(ステップ902)。
【0041】
m
iが符号化されている場合は、W
i=T
w(T
−1IM(m
i))が成り立つ。好ましい実施形態によると、再符号化は、復号の後に符号化するよりも、組み合わせた操作として行われる方が好ましく、このやり方だと、符号化方式が露出することがない。(ステップ902)。T
wは、バイトからワードへの関数である。
【0042】
そして、配列Wのこれら初期の16個のワードは、64個の32ビットの符号化されたワードの配列Wに拡張される。配列Wのこれらの残りの要素は、ルックアップテーブルLS
0、LS
1、SLS
0、SLS
1を使って計算される。当業者は当然理解するであろうが、SHA−256アルゴリズムは6つの論理関数を使用し、各関数は、x、y、zで表される、32ビットのワードに作用する。関数は以下の通りである。
【数1】
ここで、ROTR
n(x)は「右回りのローテート」演算、もしくは、「右循環シフト」演算である。xがwビットの符号なしのワードで、nが0≦n<wの整数である場合、その時は、ROTR
n(x)は、以下のようになる。
【数2】
同様に、SHR
n(x)は、以下のような「右シフト」演算である。
【数3】
これらの関数それぞれの結果が、新しい32ビットのワードとなる。
【0043】
本開示のある実施形態によると、ルックアップテーブルは、T
IM変換されたドメイン内の関数s
0およびs
1を実行するのに使用される。関数s
0およびs
1は、32ビットのワードに作用する。しかしながら、32ビットのワードを32ビットのワードにマッピングするルックアップテーブルはとても大きく、何らかの方法で、より小さいルックアップテーブルを使用することが望ましい。これは、関数sが共に、一次関数であることに注目すれば達成できうる。ワード入力xをバイトb
0、b
1、b
2、b
3の配列で表した場合、関数sの線形から、以下の式を導くことができる。
【数4】
式では、他のバイトをゼロに設定し、入力の個々のバイトに関数sを適用ことができることを示す。4つの関数を適用した結果、バイトb
iごとに論理和を取ることが可能であり、ワードxに関数sを適用した場合と同一の結果が得られる。
【0044】
s演算を実行するにあたって、T
w符号化されたワードは、まず、ワードからバイトへの再符号化関数を用いて、任意のバイト単位の変換T
sに再符号化される。ルックアップテーブルLS
0、LS
1(それぞれ4つが、関数s
0およびs
1に対応する)は、それぞれ、T
s符号化されたバイトをT
w符号化されたワードにマッピングする。T
w符号化されたワードは、ワード内の4か所のそれぞれで、関数sが特定のバイトに適応されることを表している。これらの4か所で部分的に結果が導かれているワードは、符号化された論理和演算を用いて、組み合わされ、完全なワードS
0、S
1が形成される(ステップ906、908)。従って、ルックアップテーブルLS
0、LS
1はそれぞれ、入力の可能性があるバイトに対する256のエントリを持つ4つのテーブルを含み、出力ワードの各エントリは、4バイトから成り立ち、合計サイズは、4096バイトになる。
【0045】
ルックアップテーブルSLS
0、SLS
1(やはり、それぞれ、関数s
0およびs
1に対応する)は、符号化されていないバイトをT
w符号化され、シフトおよびローテートされたワードにマッピングする。表SLS
nは、メッセージ内の符号化されていないパディング用バイトをs演算するのに用いられる(ステップ910、912)。これら表は、W
i−2のワードもしくはW
i−15のワードが符号化されていないパディング用ワードである時に使用される。これら表は、入力が符号化されないことを除けば、表LSと同じような構造である。表SLS、LSは全く別の出力符号化方式を使用する。この表SLS、LSの全く別の出力符号化方式により、入力のT
w符号化方式を求めるのがさらに難しくなる。例えば、表SLS、LSが同じ符号化方式を作成し、SLS(x)=LS(y)である、符号化されていないワードxおよび符号化されたワードyが与えられたとすると、T
w(x)=yとなり、この情報は、変換T
wの攻撃に使われかねない。
【0046】
最終的なW
iの値は、符号化された追加関数(+
t)により計算される(ステップ914)。値S
0、S
1は常にT
w符号化されたものである一方で、値W
i−16およびW
i−7は、符号化された、もしくは、符号化されていないパディング用ワードでありうる。別の追加関数が、別の符号化処理に使用されうる。
【0047】
図10に示される圧縮関数は、ひとつのチャンクのデータのハッシュを完結するために実行される。M内の各m
iにおいて、現時点のハッシュ値Hが一時的な処理値(a〜h)にコピーされ、処理値(a〜h)は
図10に示すようにマッピングされる。全ての演算(追加、論理和、否定)は、全てが符号化された値、もしくは、一方が符号化され、他方は符号化されていない値に作用し、符号化された値を作成する。値W
iは、パッディング用ワードであるとき、符号化されていない値でありうる(これは、0≦i<16の時のみ、真であるとされる)。表US
nは、上記の表LS
nと同様である。これらの表は、Σ演算の実行表であり、σ操作と同様の方法により、ワードを構成するバイト上で、Σ関数の4つのsub applicationに分類される。アルゴリズム内の値aとeは常に符号化された値であるので、メッセージの拡張ステップにおいて、表SLSと対応する表SUSは存在しない。64のW
iの値がそれぞれ処理されると、値HをT
H変換する、符号化された追加関数を用いて、値a〜hは、それぞれ、存在するH
0〜H
7の値に追加される(ステップ1002)。
【0048】
先頭のメッセージチャンクの最初の4ラウンドは、特に、値H
nおよび値a・・・hに作用する符号化方式をより良く保護するために処理することができる。各ワードH
nにおいて、内部の変換T
Hは外部のダイジェスト変換T
dに変換することができ、結合して、出力ダイジェストを形成する。メッセージの初期の512バイトの最初の4ラウンドにおいて、状態変数a〜hのいくつか、もしくは、全てが、アルゴリズムにより固定された値となる。これにより、メッセージの最初のチャンクの最初の4ラウンドにたいして、上記「特別なケース」を利用しやすくなる。
1.第一のラウンドにおいて、値T
1のみが未知の値となる。T
1は、先に計算された定数値とW
0を追加することによって計算される。よって、ラウンド1の終わりでは、eとaとを除いた全ての変数が既知の固定値となり、符号化されるべきではない。
2.ラウンド2において、T
1、T
2は共に、未知の値からなり、b、c、d、f、g、hは全て、既知の固定値である。
3.ラウンド3において、c、d、g、hは既知の固定値である。
4.ラウンド4において、d、hのみが既知の固定値である。
5.最初のチャンクの残りのラウンドすべてにおいて、そして、後続のチャンクすべてにおいて、8つの中間状態値はすべてメッセージビットと混ぜ合わされ、「未知である」とされる。
【0049】
これら「特別なケース」を利用することによって、8つの状態変数のすべてが「符号化されておらず」、元の符号化されていない値Hで初期化されていると、まず考えることができる。最初のメッセージチャンクの最初の4ラウンドそれぞれで、2つの状態変数が「符号化されていない」状態から「符号化された」状態に移行することが、データとして、T
1の符号化された追加関数を用いて、値aとeに混ぜ合わされる。後続のラウンドのそれぞれで、これら変数の値は、操作で使用される時は、符号化されていると見なされる。これは、攻撃者が、最初の4ラウンドの状態変数の内容を予測し、それを使って、状態変数の変換を攻撃することを、確実に不可能とするために役立つ。最高の保護にするためには、符号化されたメッセージMは、少なくとも4つのワードのデータを含み、各ステップにおいて、符号化されたデータが確実にT
1に混ぜ合わされるようにするべきである。短いメッセージについてのこのような弱点は、多くの場合、顕著ではない。なぜならば、極端に短いメッセージは、容易に、総当たり攻撃(ブルートフォースアタック)の対象となりえるからである。
【0050】
本実行の第一の目的は、攻撃者が、アルゴリズムの入力、出力、その中間の内部状態を観察し、符号化されていないメッセージもしくはダイジェストを断定するのを防ぐことである。入力メッセージとダイジェストが共に符号化されている場合において、本実行は、下記の特徴が見られる。
1.配列W内のワードはすべて、符号化されたメッセージワードであるか、1つ以上の符号化されたメッセージバイトと、それに付随する1つ以上の符号化されたパディング用バイトからなるワードであるか、もしくは、符号化されていないパディング用ワードである。W内のワードはいずれも、符号化されていないメッセージバイトを含まない。
2.パディング用バイトはいずれも、T
IM符号化されたものである値0x80と0x00を除いて、符号化されない。この変換は、外部のメッセージ変換T
Mとは明確に異なり、二つの既知値を露出することで、容易に攻撃者が他の値を断定できることがないように選択されるべきである。例えば、任意のバイトを任意のバイトにマッピングする関数(例えば、256バイトのルックアップテーブル)は、この特性を有する。この表では、値0x80と0x00に対するマッピングのみが露出される必要があり、マッピングを完全に露出する必要はない。
3.符号化されたパディング用データから派生したT
w符号化されたWワードはいずれも、少なくとも1バイトの符号化されたメッセージデータを含む。
4.入力としてWワードを取る全ての演算は、符号化されたデータを出力する。
5.状態変数a〜hを計算する演算はすべて、符号化されていない入力を含み、その場合、その入力は符号化されないままである。もしくは、少なくとも一つの符号化された入力を含み、その場合は、その出力は符号化される。
6.最初のメッセージチャンクのラウンド4の後、状態変数a・・・hは全て符号化される。
7.最初のメッセージチャンクを処理した後、値H
0〜H
7は全て符号化される。
8.既知値(H
0〜H
7の初期値、値K)が、未知のデータとするために用いられるのと同じ符号化方式で符号化されることはない。
9.符号化されていないパディング用データを含むσ演算の出力(表SLS)と符号化されたデータに対するσ演算の出力(表LS)は、全く異なる符号化方式を用いる。これらの値を用いた追加演算は、全く異なるものである。
【0051】
上記の理由から、メッセージ拡張の間も、ハッシュ処理の間も、入力メッセージバイトが明かされることは絶対にない。それら入力メッセージバイトは、アルゴリズムの定数やパディング用の値などの既知の固定データを符号化するために用いられることのない符号化方式で符号化される。これにより、メッセージの値が符号化されていない形式で露出することは絶対にないこと、そして、また、プレーンテキスト形式の攻撃を頓挫させること、が確実になる。なぜなら、パディング用の値および固定値は、すべて、符号化されていないか、もしくは、メッセージや状態データとは異なる方法で符号化されるからである。本開示の実施形態のいくつかでは、追加的な保護特性を使用することができる。例えば、さらにアルゴリズムを難読化するために、制御フロー変換をアルゴリズムに用いることができる。
【0052】
パディング用バイトを符号化されていない値として処理する手法は、メッセージMの任意の部分が符号化されていない値を渡すことができるように、拡大して適用することができる。セキュリティの観点から、パディング用の値を符号化していない状態に保つことが望ましい。なぜなら、それによって、メッセージ変換に対する既知のプレーンテキスト形式の攻撃のいくつかが抑止されるからである。構造化文書やフォーマット済みデータなどの部分的に既知値(もしくは容易に推測できる値)を含むメッセージへの応用としては、メッセージの慎重に扱うべき部分のみ符号化するようにし、メッセージデータの残りの部分は符号化されないようにするのが望ましい。この一例として、既知もしくは容易に推測されるフォーマットのデータ構成内部に含まれる暗号キー(例えば、ASN1で符号化されたRSAキー)のハッシュを計算することである。ストリーム内のどこで移行が行われるかを示すように、適切なメタデータが維持されることにより、いずれのワード境界でも符号化された値と符号化されていない値の間の移行ができるように、上記の方式は、容易に拡大して適用される。パディングのメカニズムは、Message Authentication Codes(MAC)などの鍵がかけられた暗号ハッシュ関数においても、有効であり得る。
【0053】
上記では、実施形態を完全に理解してもらうために、説明を目的として、具体的な数字が示された。しかしながら、当業者には当然のことながら、これら特定の詳細内容が必要であるわけではない。他の例では、理解をさまたげないように、ブロック図形式で既知の電気的構造や回路が示されている。例えば、特定の詳細内容は、本明細書に記載の実施形態が、ソフトウェアルーチンとして実施されるのか、ハードウェア回路としてなのか、ファームウェアとしてなのか、それとも、それらの組み合わせとして実施されるのかを示すものではない。
【0054】
本開示の実施形態は、(単数または複数の)機械可読媒体(コンピュータ可読媒体、プロセッサ可読媒体、もしくは、コンピュータ可読プログラムコードを内部に含むコンピュータで使用可能な媒体とも言う)に格納されたコンピュータプログラム製品として表すことが可能である。機械可読媒体は、ディスケット、コンパクトディスクリードオンリーメモリ(CD−ROM)、(揮発性もしくは不揮発性の)メモリ装置、あるいは、同様の記憶媒体を含む、磁気記憶媒体、光学記憶媒体、もしくは、電気的記憶媒体などの適切な具体的な非一時的媒体であってよい。機械可読媒体は、様々な指示、符号配列、構成情報、その他のデータを含んでよく、それらが実行されることで、プロセッサに、本開示の実施形態による方法のステップを実行させる。本件記載の実行を行うために必要な他の指示や操作も機械可読媒体に記憶されてもよいことは、当業者であれば、当然理解するであろう。記載の処理を行うために、機械可読媒体に記憶される指示は、プロセッサまたは、他の適切な処理装置で実行されてよく、回路と連動してもよい。
【0055】
本発明の上記実施形態は、単なる例示のみを目的とする。当業者により、発明の範囲を逸脱することなく、特定の実施形態に対する変更、改良、変形が可能である。発明の範囲は、添付の特許請求の範囲によってのみ定義される。