JP5327380B2 - 暗号処理装置および暗号処理方法 - Google Patents
暗号処理装置および暗号処理方法 Download PDFInfo
- Publication number
- JP5327380B2 JP5327380B2 JP2012507907A JP2012507907A JP5327380B2 JP 5327380 B2 JP5327380 B2 JP 5327380B2 JP 2012507907 A JP2012507907 A JP 2012507907A JP 2012507907 A JP2012507907 A JP 2012507907A JP 5327380 B2 JP5327380 B2 JP 5327380B2
- Authority
- JP
- Japan
- Prior art keywords
- value
- window
- bit
- range
- random
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000012545 processing Methods 0.000 title claims abstract description 210
- 238000003672 processing method Methods 0.000 title claims description 7
- 238000012937 correction Methods 0.000 claims abstract description 291
- 238000000034 method Methods 0.000 description 271
- 230000014509 gene expression Effects 0.000 description 138
- 230000008569 process Effects 0.000 description 102
- 238000004364 calculation method Methods 0.000 description 91
- 230000000052 comparative effect Effects 0.000 description 52
- 238000007792 addition Methods 0.000 description 33
- 238000004891 communication Methods 0.000 description 29
- 238000012986 modification Methods 0.000 description 22
- 230000004048 modification Effects 0.000 description 22
- 238000010586 diagram Methods 0.000 description 18
- 239000004403 ethyl p-hydroxybenzoate Substances 0.000 description 15
- 235000010228 ethyl p-hydroxybenzoate Nutrition 0.000 description 15
- 239000004176 azorubin Substances 0.000 description 14
- 239000004301 calcium benzoate Substances 0.000 description 14
- 235000010237 calcium benzoate Nutrition 0.000 description 14
- 239000004300 potassium benzoate Substances 0.000 description 14
- 235000010235 potassium benzoate Nutrition 0.000 description 14
- 239000004299 sodium benzoate Substances 0.000 description 14
- 235000010234 sodium benzoate Nutrition 0.000 description 14
- 239000004175 ponceau 4R Substances 0.000 description 12
- 238000013459 approach Methods 0.000 description 11
- 238000012805 post-processing Methods 0.000 description 11
- 239000004235 Orange GGN Substances 0.000 description 10
- 238000007781 pre-processing Methods 0.000 description 9
- 230000000694 effects Effects 0.000 description 7
- 230000001629 suppression Effects 0.000 description 7
- 239000004297 potassium metabisulphite Substances 0.000 description 6
- 235000010263 potassium metabisulphite Nutrition 0.000 description 6
- 230000009467 reduction Effects 0.000 description 6
- 239000004289 sodium hydrogen sulphite Substances 0.000 description 6
- 235000010267 sodium hydrogen sulphite Nutrition 0.000 description 6
- 239000004258 Ethoxyquin Substances 0.000 description 5
- 230000008901 benefit Effects 0.000 description 5
- 230000008859 change Effects 0.000 description 5
- 238000013479 data entry Methods 0.000 description 5
- 239000000787 lecithin Substances 0.000 description 5
- 235000010445 lecithin Nutrition 0.000 description 5
- 239000004172 quinoline yellow Substances 0.000 description 5
- 239000002151 riboflavin Substances 0.000 description 5
- 239000004149 tartrazine Substances 0.000 description 5
- 239000000196 tragacanth Substances 0.000 description 5
- 235000010487 tragacanth Nutrition 0.000 description 5
- 239000004229 Alkannin Substances 0.000 description 4
- 239000004283 Sodium sorbate Substances 0.000 description 4
- 239000001912 oat gum Substances 0.000 description 4
- 235000019250 sodium sorbate Nutrition 0.000 description 4
- 239000004263 Guaiac resin Substances 0.000 description 3
- 239000000205 acacia gum Substances 0.000 description 3
- 235000010489 acacia gum Nutrition 0.000 description 3
- 239000001809 ammonium phosphatide Substances 0.000 description 3
- 235000010986 ammonium phosphatide Nutrition 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 3
- 239000004303 calcium sorbate Substances 0.000 description 3
- 235000010244 calcium sorbate Nutrition 0.000 description 3
- 239000000555 dodecyl gallate Substances 0.000 description 3
- PEDCQBHIVMGVHV-UHFFFAOYSA-N glycerol Substances OCC(O)CO PEDCQBHIVMGVHV-UHFFFAOYSA-N 0.000 description 3
- 235000011187 glycerol Nutrition 0.000 description 3
- 239000001194 polyoxyethylene (40) stearate Substances 0.000 description 3
- 235000011185 polyoxyethylene (40) stearate Nutrition 0.000 description 3
- 239000004302 potassium sorbate Substances 0.000 description 3
- 235000010241 potassium sorbate Nutrition 0.000 description 3
- 238000002360 preparation method Methods 0.000 description 3
- 239000001879 Curdlan Substances 0.000 description 2
- 239000001856 Ethyl cellulose Substances 0.000 description 2
- 239000004262 Ethyl gallate Substances 0.000 description 2
- 235000010385 ascorbyl palmitate Nutrition 0.000 description 2
- 239000011692 calcium ascorbate Substances 0.000 description 2
- 235000010376 calcium ascorbate Nutrition 0.000 description 2
- 238000006243 chemical reaction Methods 0.000 description 2
- 230000000295 complement effect Effects 0.000 description 2
- 239000004316 dimethyl dicarbonate Substances 0.000 description 2
- 235000010300 dimethyl dicarbonate Nutrition 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 235000019325 ethyl cellulose Nutrition 0.000 description 2
- 239000000542 fatty acid esters of ascorbic acid Substances 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 239000000665 guar gum Substances 0.000 description 2
- 235000010417 guar gum Nutrition 0.000 description 2
- 239000000574 octyl gallate Substances 0.000 description 2
- 239000004306 orthophenyl phenol Substances 0.000 description 2
- 235000010292 orthophenyl phenol Nutrition 0.000 description 2
- 239000000256 polyoxyethylene sorbitan monolaurate Substances 0.000 description 2
- 235000010486 polyoxyethylene sorbitan monolaurate Nutrition 0.000 description 2
- 239000001205 polyphosphate Substances 0.000 description 2
- 235000011176 polyphosphates Nutrition 0.000 description 2
- 239000004323 potassium nitrate Substances 0.000 description 2
- 235000010333 potassium nitrate Nutrition 0.000 description 2
- 239000004307 sodium orthophenyl phenol Substances 0.000 description 2
- 235000010294 sodium orthophenyl phenol Nutrition 0.000 description 2
- 239000001226 triphosphate Substances 0.000 description 2
- 235000011178 triphosphate Nutrition 0.000 description 2
- -1 E113 Substances 0.000 description 1
- 240000006829 Ficus sundaica Species 0.000 description 1
- 239000000728 ammonium alginate Substances 0.000 description 1
- 235000010407 ammonium alginate Nutrition 0.000 description 1
- 230000002238 attenuated effect Effects 0.000 description 1
- 239000000648 calcium alginate Substances 0.000 description 1
- 235000010410 calcium alginate Nutrition 0.000 description 1
- 230000001066 destructive effect Effects 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 239000000737 potassium alginate Substances 0.000 description 1
- 235000010408 potassium alginate Nutrition 0.000 description 1
- 235000019275 potassium ascorbate Nutrition 0.000 description 1
- 238000007639 printing Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 239000001632 sodium acetate Substances 0.000 description 1
- 235000011091 sodium acetates Nutrition 0.000 description 1
- 239000000661 sodium alginate Substances 0.000 description 1
- 235000010413 sodium alginate Nutrition 0.000 description 1
- PPASLZSBLFJQEF-RKJRWTFHSA-M sodium ascorbate Substances [Na+].OC[C@@H](O)[C@H]1OC(=O)C(O)=C1[O-] PPASLZSBLFJQEF-RKJRWTFHSA-M 0.000 description 1
- 235000010378 sodium ascorbate Nutrition 0.000 description 1
- 239000004317 sodium nitrate Substances 0.000 description 1
- 235000010344 sodium nitrate Nutrition 0.000 description 1
- 239000000126 substance Substances 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/30—Public key, i.e. encryption algorithm being computationally infeasible to invert or user's encryption keys not requiring secrecy
- H04L9/3066—Public key, i.e. encryption algorithm being computationally infeasible to invert or user's encryption keys not requiring secrecy involving algebraic varieties, e.g. elliptic or hyper-elliptic curves
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/60—Methods or arrangements for performing computations using a digital non-denominational number representation, i.e. number representation without radix; Computing devices using combinations of denominational and non-denominational quantity representations, e.g. using difunction pulse trains, STEELE computers, phase computers
- G06F7/72—Methods or arrangements for performing computations using a digital non-denominational number representation, i.e. number representation without radix; Computing devices using combinations of denominational and non-denominational quantity representations, e.g. using difunction pulse trains, STEELE computers, phase computers using residue arithmetic
- G06F7/724—Finite field arithmetic
- G06F7/725—Finite field arithmetic over elliptic curves
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/002—Countermeasures against attacks on cryptographic mechanisms
- H04L9/003—Countermeasures against attacks on cryptographic mechanisms for power analysis, e.g. differential power analysis [DPA] or simple power analysis [SPA]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2207/00—Indexing scheme relating to methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F2207/72—Indexing scheme relating to groups G06F7/72 - G06F7/729
- G06F2207/7219—Countermeasures against side channel or fault attacks
- G06F2207/7223—Randomisation as countermeasure against side channel attacks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2207/00—Indexing scheme relating to methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F2207/72—Indexing scheme relating to groups G06F7/72 - G06F7/729
- G06F2207/7219—Countermeasures against side channel or fault attacks
- G06F2207/7223—Randomisation as countermeasure against side channel attacks
- G06F2207/7233—Masking, e.g. (A**e)+r mod n
- G06F2207/7242—Exponent masking, i.e. key masking, e.g. A**(e+r) mod n; (k+r).P
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L2209/00—Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
- H04L2209/12—Details relating to cryptographic hardware or logic circuitry
- H04L2209/122—Hardware reduction or efficient architectures
Description
本発明は楕円曲線暗号に関する。
近年、情報セキュリティ技術の重要性がますます高まってきている。また、情報セキュリティの基盤技術の1つとして、公開鍵暗号(public-key cryptography)が盛んに研究されている。
公開鍵暗号にはいくつか種類があり、指数剰余演算を利用するRivest, Shamir, Adleman(RSA)アルゴリズムや、楕円曲線上の点のスカラ倍算を利用する楕円曲線暗号(Elliptical Curve Cryptography;ECC)などが知られている。
公開鍵暗号の利用においては、セキュリティの維持のために、個人鍵(private key)を秘密に保つことが重要である。ところが、近年では個人鍵を解読する(break)ための、いくつかの攻撃手法が知られている。よって、公開鍵暗号を用いた処理を行う機器が耐タンパ性である(tamper-proof)ためには、少なくとも既知の攻撃手法に対する対策が当該機器において実装されている必要がある。
例えば、サイドチャネル攻撃の1種として、電力解析(Power Analysis;PA)攻撃と呼ばれる攻撃手法が知られている。また、PAには、単純電力解析(Simple Power Analysis;SPA)と電力差分解析(Differential Power Analysis;DPA)の2種類がある。
よって、公開鍵暗号を用いた処理を行う機器には、SPA攻撃に対する安全性とDPA攻撃に対する安全性が求められる。例えば、SPA攻撃への対策の1つには「ウィンドウ法」と呼ばれる手法があり、DPA攻撃への対策の1つにはデータをランダム化する手法がある。さらに、効率的な耐タンパ性の指数剰余演算および点のスカラ倍算を実現する暗号装置や、指数剰余演算を実行する暗号化方法において、PA攻撃を用いた個人鍵の推定を困難にし、高い耐タンパ性をもつ暗号プロセッサも提案されている。
楕円曲線上の点のスカラ倍算を行う装置において、SPA攻撃への対策として、ウィンドウサイズがkビットのウィンドウ法(あるいはその変種)が採用される場合、メモリには、kビットの各インデックスに対応して楕円曲線上の点を示すデータが格納される。したがって、メモリ使用量はウィンドウサイズkの指数オーダであり、ウィンドウサイズkが大きいほど、メモリ使用量も多い。
他方で、近年では、サーバ・コンピュータやパーソナル・コンピュータなどの汎用的なコンピュータだけではなく、例えば組み込み機器などの他の様々な装置においても、暗号技術の利用が広まりつつある。スカラ倍算を行う装置には、装置の種類によらず、SPA攻撃とDPA攻撃の双方に対する対策を実装することが求められる。
ところが、ある種の装置のメモリ容量は、汎用的なコンピュータのメモリ容量と比べるとかなり少ない。そして、メモリ容量の少ない装置においては、なるべく少ないメモリ使用量で処理を実行することが好ましい。
そこで本発明は、メモリ使用量を少なく抑えつつ、SPA攻撃とDPA攻撃の双方に対する安全性を保って、スカラ倍算を行う暗号処理装置を提供することを目的とする。
一態様による暗号処理装置は、個人鍵格納部と乱数生成部と処理部を備える。
前記個人鍵格納部は、楕円曲線暗号における個人鍵dを格納する。前記乱数生成部は、符号つきまたは符号なしのbビットの乱数値sを生成する。
前記個人鍵格納部は、楕円曲線暗号における個人鍵dを格納する。前記乱数生成部は、符号つきまたは符号なしのbビットの乱数値sを生成する。
ウィンドウ値w[i]を用いたウィンドウ演算は、SPA攻撃に対して安全なスカラ倍算を実現する。また、乱数値s[i]の導入により、DPA攻撃に対する安全性も実現される。
そして、処理部が、各乱数値s[i]を、一律に乱数値sに定めるのではなく、上記制約条件下で適宜+sまたは−sに定めることで、ウィンドウ値w[i]の絶対値の範囲の縮小が実現される。したがって、上記暗号処理装置によれば、ウィンドウ演算用に各インデックスに対応して楕円曲線上の点を示すデータを格納するためのメモリの量は、2kのオーダよりも少なくて済む。
よって、上記暗号処理装置は、少ないメモリ使用量で、SPA攻撃とDPA攻撃の双方に対する安全性を保ってスカラ倍算を行うことを可能にする。
以下、実施形態について、図面を参照しながら詳細に説明する。説明の順序は以下のとおりである。
後述の第1〜第3実施形態の暗号処理装置は、楕円曲線上の点に対するスカラ倍算を行うためのデータ(具体的には、後述のウィンドウ列w[i]と乱数列s[i]と補正値c)を生成し、生成したデータを用いてスカラ倍算を行う装置である。そこで、第1〜第3実施形態についての理解を助けるために、まず、楕円曲線上の演算について説明する。また、第1〜第3実施形態についての理解を助けるために、第1〜第4の比較例についても説明する。
後述の第1〜第3実施形態の暗号処理装置は、楕円曲線上の点に対するスカラ倍算を行うためのデータ(具体的には、後述のウィンドウ列w[i]と乱数列s[i]と補正値c)を生成し、生成したデータを用いてスカラ倍算を行う装置である。そこで、第1〜第3実施形態についての理解を助けるために、まず、楕円曲線上の演算について説明する。また、第1〜第3実施形態についての理解を助けるために、第1〜第4の比較例についても説明する。
その後、本願の発明者が比較例についての検討から得た知見と、当該知見に基づいて発明者が開発した第1〜第3実施形態の処理方法の共通点について説明する。また、第1〜第3実施形態に共通の装置構成についても説明する。その後、第1〜第3実施形態について順に説明し、最後に、その他の実施形態などを説明する。
さて、楕円曲線上の演算について説明する。ECCで使われる楕円曲線のうちで主なものは、素体GF(p)上で定義される式(1.1)の楕円曲線と、2の拡大体GF(2n)上で定義される式(1.2)の楕円曲線である(なお、GFはGalois fieldの略であり、pは素数である)。
y2=x3+αx+β(mod p), ただしα, β, x, y∈GF(p) (1.1)
y2+xy=x3+αx2+β (mod F(x))
ただし、α, β, x, y∈GF(2n)かつF(x)はGF(2n)の既約多項式 (1.2)
y2=x3+αx+β(mod p), ただしα, β, x, y∈GF(p) (1.1)
y2+xy=x3+αx2+β (mod F(x))
ただし、α, β, x, y∈GF(2n)かつF(x)はGF(2n)の既約多項式 (1.2)
式(1.1)で表される楕円曲線上の点Pは、式(1.1)を満たすxとyの組によりP=(x,y)と表される。同様に、式(1.2)で表される楕円曲線上の点Pは、式(1.2)を満たすxとyの組によりP=(x,y)と表される。また、楕円曲線上の特殊な点として無限遠点(point at infinity, or infinite point)が定義される。無限遠点を以下では「O」(大文字のオー)と表記する。
なお、本明細書の以下の議論は、式(1.1)の楕円曲線についても式(1.2)の楕円曲線についても同様に成り立つ。よって、以下では式(1.1)と(1.2)の区別について言及せずに、単に「楕円曲線」、「点P」、「点(x,y)」、「x座標」、「y座標」、「楕円曲線パラメタαおよびβ」などの表記を用いることがある。
楕円曲線上の点同士に対して、ある演算(以下「加算」といい、「+」と表す)を定義すると、楕円曲線上の点の集合は可換群をなすことが知られている。無限遠点Oは零元(すなわち加算における単位元)にあたる。また、楕円曲線上の任意の点P(点Pは無限遠点Oでもよい)に対して式(1.3)が成り立つ。
P+O=O+P=P (1.3)
P+O=O+P=P (1.3)
以下では点Pの逆元を−Pと表記する。点−Pのx座標とy座標は、楕円曲線が定義される体GF(p)またはGF(2n)上の加算または減算により計算することができる。具体的には、点P=(x,y)の逆元である点−Pは、楕円曲線が式(1.1)で定義される場合は式(1.4)により表され、楕円曲線が式(1.2)で定義される場合は式(1.5)により表される。
-P=(x, -y) (1.4)
-P=(x, x+y) (1.5)
-P=(x, -y) (1.4)
-P=(x, x+y) (1.5)
式(1.4)と(1.5)から理解されるように、点Pから点−Pを求めるための計算量(computational complexity)はわずかである。符号つきウィンドウ法や後述の第1〜第3実施形態では、逆元の計算容易性を利用することで、メモリ使用量の削減が図られる。上記のような逆元の計算容易性は、RSA暗号で利用される素体上の除算の計算困難性と対照的である。
なお、ある点P1と点P2に対してP3=P1+P2と表される点P3のx座標とy座標も、点P1とP2のx座標とy座標を用いて、体GF(p)またはGF(2n)上の加減乗除により計算することができる。ここで、P2=P1である場合には、P3=P1+P1を2P1とも表し、点P1から点P3=2P1を求める演算を2倍算(doubling)という。2倍算も、体GF(p)またはGF(2n)上の加減乗除により実現される。
また、減算は、式(1.6)のように逆元の加算として定義される。
P1-P2=P1+(-P2) (1.6)
P1-P2=P1+(-P2) (1.6)
さらに、楕円曲線上の点に対しては、スカラ倍算(scalar multiplication)と呼ばれる演算が定義される。スカラ倍算は、加算、減算、2倍算の組み合わせにより実現される。具体的には、スカラ値dと楕円曲線上の点Pに対して、Q=dPと表現される点Qは、次の式(1.7)のように定義される。
なお、任意の整数d1とd2と、楕円曲線上の任意の点Pに対して、次の式(1.8)と(1.9)が成立する。
d1P+d2P=(d1+d2)P (1.8)
d1(d2P)=d2(d1P)=(d1d2)P (1.9)
d1P+d2P=(d1+d2)P (1.8)
d1(d2P)=d2(d1P)=(d1d2)P (1.9)
ECCにおいては、スカラ値が個人鍵として使われ、秘密にされる。逆に、楕円曲線上の「ベースポイント(base point)」と呼ばれるある点G、楕円曲線のパラメタαおよびβは、公開される情報である。個人鍵dに対して、公開鍵はV=dGを満たす点Vにより与えられる。
たとえ点GとVが攻撃者に知られていても、点GとVから個人鍵dを計算することは、莫大な計算量を必要とするので非常に困難である。この計算困難性は、離散対数問題の計算困難性として知られている。
ところで、ECCは、Diffie-Hellman(DH)アルゴリズムによる鍵共有(key agreement)や、ディジタル署名アルゴリズム(Digital Signature Algorithm;DSA)などに利用可能である。何の目的でECCが利用されるにしろ、ECCを利用した処理はスカラ倍算を含む。DH鍵共有を例に説明すれば次のとおりである。
例えば、第1の装置の個人鍵がdAであり、第2の装置の個人鍵がdBであるとする。すると、第1の装置の公開鍵QAは、ベースポイントGからQA=dAGと計算され、第2の装置の公開鍵QBは、ベースポイントGからQB=dBGと計算される。このように、公開鍵の生成のためにスカラ倍算が行われる。
また、第1の装置は自らの公開鍵QAを第2の装置に送り、第2の装置は自らの公開鍵QBを第1の装置に送る。すると、第1の装置はスカラ倍算によりdAQBを計算し、第2の装置もスカラ倍算によりdBQAを計算する。その結果、式(1.10)に示すように、第1の装置と第2の装置は同じ鍵Kを共有することができる。
K=dAQB=dA(dBG)=dB(dAG)=dBQA (1.10)
ECCが、上記に例示したDH鍵共有以外の目的に利用される場合も、やはりスカラ倍算が行われる。
K=dAQB=dA(dBG)=dB(dAG)=dBQA (1.10)
ECCが、上記に例示したDH鍵共有以外の目的に利用される場合も、やはりスカラ倍算が行われる。
ところで、PA攻撃は、スカラ倍算を実行中の装置の消費電力を測定することで、個人鍵として使われるスカラ値dを解読しようとする、非破壊攻撃の1種である。よって、何の目的でECCが利用されるにしろ、個人鍵dの漏洩防止の対策としては、スカラ倍算を実行中の装置の消費電力波形が個人鍵dの特徴を示さないようにすることが有効である。
もしPA攻撃に対して何の対策もとられないと、スカラ倍算を実行中の装置の消費電力波形の特徴から、個人鍵dが解読されてしまう危険性がある。具体的には、SPA攻撃は、スカラ倍算を効率よく行うための演算手順に注目して、ある1回のスカラ倍算の処理中の消費電力波形から個人鍵dを解読しようとする攻撃手法である。また、DPA攻撃は、複数の異なる点に対するスカラ倍算における電力波形の相違に注目して、個人鍵dを解読しようとする攻撃手法である。
後述の第1〜第3実施形態の暗号処理装置は、SPA攻撃に対してもDPA攻撃に対しても安全であるように、かつ使用メモリ量を抑えるように、設計されている。そこで、第1〜第3実施形態の利点についての理解を助けるため、続いて、いくつかの比較例について説明する。
まず、第1の比較例として、「バイナリ法」について説明する。バイナリ法は、SPA攻撃に対してもDPA攻撃に対しても脆弱である。
例えば個人鍵dが160ビットである場合、dは非常に大きな数(例えば、2160に近い数)である可能性がある。よって、式(1.7)の定義どおりにスカラ倍算を実行することは、非常に多くの回数の点の加算をともなうため、非現実的である。バイナリ法は、スカラ倍算の計算量のオーダを個人鍵dのビット数のオーダに抑えるための手法である。
例えば個人鍵dが160ビットである場合、dは非常に大きな数(例えば、2160に近い数)である可能性がある。よって、式(1.7)の定義どおりにスカラ倍算を実行することは、非常に多くの回数の点の加算をともなうため、非現実的である。バイナリ法は、スカラ倍算の計算量のオーダを個人鍵dのビット数のオーダに抑えるための手法である。
ここで説明の便宜上、個人鍵dのビット長をuとする。また、個人鍵dのiビット目をd[i]と表記する(0≦i≦u−1)。d[0]が最下位ビット(Least Significant Bit;LSB)でありd[u−1]が最上位ビット(Most Significant Bit;MSB)である。すると、式(2.1)より、式(2.2)が得られる。
dA=2u-1d[u-1]A+…+21d[1]A+20d[0]A (2.2)
バイナリ法は式(2.2)を利用した計算手順である。例えば、個人鍵dが(1100101)2の場合について具体的に説明すると、バイナリ法は式(2.3)にしたがってスカラ倍算を実現する手法である。
dA=2(2(2(2(2(2(2O+A)+A)))+A))+A=26A+25A+22A+A (2.3)
dA=2(2(2(2(2(2(2O+A)+A)))+A))+A=26A+25A+22A+A (2.3)
すなわち、スカラ倍算の結果を変数Vで表すことにすると、バイナリ法では式(2.4)のとおり、変数Vがまず無限遠点Oにより初期化される。
V=O (2.4)
V=O (2.4)
その後、MSBからLSBへと順に、「2倍算により2Vを求め、その後、もしd[i]=1ならば点Aの加算を行い、得られた結果を変数Vに代入する」という処理が繰り返される。具体的には、d[6]=1なので、式(2.5)のとおり、6ビット目に対応して2倍算と加算が行われる。
V=2O+A (2.5)
V=2O+A (2.5)
そして、d[5]=1なので、式(2.6)のとおり、5ビット目に対応して2倍算と加算が行われる。
V=2(2O+A)+A (2.6)
V=2(2O+A)+A (2.6)
また、d[4]=0なので、式(2.7)のとおり、4ビット目に関しては2倍算のみが行われ、加算は行われない。
V=2(2(2O+A)+A) (2.7)
V=2(2(2O+A)+A) (2.7)
同様に、d[3]=0なので、式(2.8)のとおり、3ビット目に関しても2倍算のみが行われ、加算は行われない。
V=2(2(2(2O+A)+A)) (2.8)
V=2(2(2(2O+A)+A)) (2.8)
次の2ビット目に関しては、d[2]=1なので、式(2.9)のとおり、2倍算と加算が行われる。
V=2(2(2(2(2O+A)+A)))+A (2.9)
V=2(2(2(2(2O+A)+A)))+A (2.9)
また、次の1ビット目に関しては、d[1]=0なので、式(2.10)のとおり、2倍算のみが行われ、加算は行われない。
V=2(2(2(2(2(2O+A)+A)))+A) (2.10)
V=2(2(2(2(2(2O+A)+A)))+A) (2.10)
そして、最後の0ビット目に関しては、d[0]=1なので、式(2.11)のとおり、2倍算と加算が行われる。
V=2(2(2(2(2(2(2O+A)+A)))+A))+A (2.11)
V=2(2(2(2(2(2(2O+A)+A)))+A))+A (2.11)
以上のようにしてd[i]=1であるiビット目に対応して加算された点Aの係数は、式(2.11)から理解されるように、2iである。よって、上記の式(2.4)〜(2.11)とともに例示した手順により、確かに式(2.3)にしたがって、V=dAが得られる。
上記の例から明らかなとおり、バイナリ法によれば、2倍算の回数は個人鍵dのビット長uに等しく、加算の回数は個人鍵dのハミング重み(Hamming weight)に等しい。よって、バイナリ法によるスカラ倍算の計算量は、2uのオーダではなく、uのオーダに抑えられる。
ところで、もし2倍算のときの消費電力波形と加算のときの消費電力波形が区別可能であるとすると、バイナリ法はSPA攻撃に対して脆弱である。すなわち、バイナリ法の計算手順から、攻撃者は「2倍算の消費電力波形に続いて加算の消費電力波形が現れれば、ビット値d[i]は1である」と解析することができる。同様に、攻撃者は「2倍算の消費電力波形に続いて加算の消費電力波形が現れなければビット値d[i]は0である」と解析することができる。
また、バイナリ法はDPA攻撃に対しても脆弱である。なお、DPA攻撃への安全性に関する説明の理解を助けるために、DPA攻撃の概要を説明すれば次のとおりである。
すなわち、DPA攻撃を行う攻撃者は、楕円曲線上のL個(L≧2)の既知の点A1,A2,…,ALに対してそれぞれ個人鍵dによるスカラ倍算が行われるときの消費電力波形を観察することにより、個人鍵dを解読する。以下では、点Ajに対応して観察された消費電力をPowj(t)と表記し、DPA攻撃による個人鍵dの解読について説明する。なお、tは時刻情報を示す。
すなわち、DPA攻撃を行う攻撃者は、楕円曲線上のL個(L≧2)の既知の点A1,A2,…,ALに対してそれぞれ個人鍵dによるスカラ倍算が行われるときの消費電力波形を観察することにより、個人鍵dを解読する。以下では、点Ajに対応して観察された消費電力をPowj(t)と表記し、DPA攻撃による個人鍵dの解読について説明する。なお、tは時刻情報を示す。
説明の便宜上、1ビット以上の長さのビット列同士の連結(concatenation)を“||”という記号で表すことにする。すると、個人鍵dは式(3.1)のように表される。
d=d[u-1]||d[u-2]||…||d[1]||d[0] (3.1)
式(2.3)〜(2.11)に例示したバイナリ法は、まず式(2.5)によりd[6]Aを計算して変数Vに代入し、以下順次ビット数を増やしながら変数Vの値を更新していく方法である。すなわち、式(2.6)により(d[6]||d[5])Aが計算され、式(2.7)により(d[6]||d[5]||d[4])Aが計算され、式(2.8)により(d[6]||d[5]||d[4]||d[3])Aが計算される。そして、式(2.9)により(d[6]||d[5]||d[4]||d[3]||d[2])Aが計算され、式(2.10)により(d[6]||d[5]||d[4]||d[3]||d[2]||d[1])Aが計算される。最後に、式(20)によりdAが得られる。
d=d[u-1]||d[u-2]||…||d[1]||d[0] (3.1)
式(2.3)〜(2.11)に例示したバイナリ法は、まず式(2.5)によりd[6]Aを計算して変数Vに代入し、以下順次ビット数を増やしながら変数Vの値を更新していく方法である。すなわち、式(2.6)により(d[6]||d[5])Aが計算され、式(2.7)により(d[6]||d[5]||d[4])Aが計算され、式(2.8)により(d[6]||d[5]||d[4]||d[3])Aが計算される。そして、式(2.9)により(d[6]||d[5]||d[4]||d[3]||d[2])Aが計算され、式(2.10)により(d[6]||d[5]||d[4]||d[3]||d[2]||d[1])Aが計算される。最後に、式(20)によりdAが得られる。
一般に、ハードウェアは、ロードまたはストアされるデータ値のハミング重みに応じた電力を消費する。そこで、攻撃者は、MSB(すなわち(u−1)ビット目)からLSB(すなわち0ビット目)まで順に、次の処理を行うことでビット値d[i]を解読する。
攻撃者は、ビット値d[i]を予想する。そして、攻撃者は、既に解読した上位のビット値d[u−1],…,d[i+1]と、予想したビット値d[i]を用いて、1≦j≦Lなる各jについて、式(3.2)で表される点Bjを計算する。
Bj=(d[u-1]||…||d[i])Aj (3.2)
Bj=(d[u-1]||…||d[i])Aj (3.2)
さらに、攻撃者は、消費電力Powj(t)を、点Bjを表すデータ内の特定位置のビット値に応じて、2つの集合S0とS1のいずれかに分類する。以下、上記特定位置のビット値が0の集合をS0とし、上記特定位置のビット値が1の集合をS1とする。攻撃者は、集合S1に属する消費電力Powj(t)の平均から、集合S0に属する消費電力Powj(t)の平均を引いた差分波形Diff(t)を求める。
もし、差分波形Diff(t)にスパイクが出現していれば、攻撃者は、予想したビット値d[i]が正しいと判定する。逆に、差分波形Diff(t)が平坦であれば、攻撃者は、予測したd[i]の値が誤りだったと判定する。その結果、攻撃者は、ビット値d[i]を解読することができる。
このように、「MSBから順に、ビット数を増やしながら、(d[u−1]||…||d[i])Aの計算を行う」というバイナリ法の特徴を利用して、DPA攻撃では、攻撃者がMSBから順にビット値d[i]を解読してゆく。
以上のようにバイナリ法はSPA攻撃にもDPA攻撃にも脆弱である。それに対し、次に第2の比較例として挙げる「ウィンドウ法」は、SPA攻撃に対して安全である。
バイナリ法では、式(2.4)〜(2.11)に例示したように、個人鍵dの1ビットごとに、ビット値に応じて「2倍算と加算」または「2倍算」という処理が行われる。それに対して、ウィンドウ法では、個人鍵dのkビットごとに、ビット値によらず常に「k回の2倍算と1回の加算」という処理が行われる。よって、たとえ2倍算の消費電力波形と加算の消費電力波形が異なっていたとしても、ウィンドウ法によるスカラ倍算はSPA攻撃に対して安全である。
バイナリ法では、式(2.4)〜(2.11)に例示したように、個人鍵dの1ビットごとに、ビット値に応じて「2倍算と加算」または「2倍算」という処理が行われる。それに対して、ウィンドウ法では、個人鍵dのkビットごとに、ビット値によらず常に「k回の2倍算と1回の加算」という処理が行われる。よって、たとえ2倍算の消費電力波形と加算の消費電力波形が異なっていたとしても、ウィンドウ法によるスカラ倍算はSPA攻撃に対して安全である。
以下では説明の簡単化のため、個人鍵dのビット数uがウィンドウサイズkで割り切れるものとする。すなわち、m=u/kとすると、mは整数である。また、0≦i≦(m−1)なる各iについて、i番目のウィンドウ値w[i]は式(4.1)のように定義される。
w[i]=d[ik+k-1]||…||d[ik] (4.1)
w[i]=d[ik+k-1]||…||d[ik] (4.1)
なお、i番目のウィンドウ値を表す“w[i]”という表記法における“[i]”の意味は、個人鍵dのiビット目を表す“d[i]”という表記法における“[i]”の意味とは異なる。しかし、“[i]”の意味は文脈から明らかなので、以下では適宜“w[i]”のような表記法を用いる。
例えば、ウィンドウサイズkが3ビットであり、個人鍵dが(011111101)2である場合、ウィンドウ値は次の式(4.2)〜(4.4)のとおりである。以下では、w[m−1],…,w[1],w[0]のようなウィンドウ値の系列を「ウィンドウ列」(window sequence)ともいう。
w[2]=(011)2=3 (4.2)
w[1]=(111)2=7 (4.3)
w[0]=(101)2=5 (4.4)
w[2]=(011)2=3 (4.2)
w[1]=(111)2=7 (4.3)
w[0]=(101)2=5 (4.4)
また、ウィンドウ法では、スカラ倍算の対象として与えられる点Aの座標を用いて、0≦h≦2k−1なる各hに対して、予め、スカラ倍点(scalar multiple)hAが計算される。そして、計算されたスカラ倍点hAは、インデックスhと対応づけられてメモリに格納される。
以下では、インデックスhに対応づけられたスカラ倍点hAをtab[h]と表記し、tab[h](=hA)を「テーブルデータ」ともいう。より詳しくは、テーブルデータtab[h]は、スカラ倍点hAのx座標とy座標の組により表される。
ウィンドウ法では、点dAの計算は、式(4.5)のようにテーブルデータを用いて行われる。
dA=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.5)
dA=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.5)
より具体的には、スカラ値dと点Aのスカラ倍算の結果を変数Vで表すことにすると、ウィンドウ法では、式(4.6)のとおり、変数Vがまず無限遠点Oにより初期化される。
V=O (4.6)
V=O (4.6)
その後、i=m−1からi=0へと順に、「2倍算をk回(すなわち3回)行い、tab[w[i]]を加算し、得られた結果を変数Vに代入する」という処理が行われる。すなわち、まずウィンドウ値w[2]に対応して式(4.7)のとおり3回の2倍算と1回の加算が行われる。
V=23(O)+tab[(011)2] (4.7)
V=23(O)+tab[(011)2] (4.7)
次に、ウィンドウ値w[1]に対応して式(4.8)のとおり3回の2倍算と1回の加算が行われる。
V=23(23(O)+tab[(011)2])+tab[(111)2] (4.8)
V=23(23(O)+tab[(011)2])+tab[(111)2] (4.8)
そして、最後にウィンドウ値w[0]に対応して式(4.9)のとおり3回の2倍算と1回の加算が行われる。
V=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.9)
V=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.9)
以上のように、ウィンドウ法によれば、個人鍵dに含まれるビット値の値によらず、同じ種類の処理が行われる。よって、ウィンドウ法はSPA攻撃に対して安全である。
続いて、第3の比較例として、SPA攻撃に対してのみならずDPA攻撃に対しても安全となるようにウィンドウ法を改良した「ランダム化ウィンドウ法」について説明する。ランダム化ウィンドウ法では、bビットの乱数値sによってテーブルデータがランダム化される。ランダム化により、データの内容と消費電力の相関関係が隠される。すなわち、ランダム化により、攻撃者によるビット値の予測の正誤に応じて差分波形Diff(t)が変化することはなくなる。したがって、ランダム化により、DPA攻撃に対する安全性が実現される。
なお、乱数値sのビット数bは、例えば30以下が好ましい。また、mを整数とし、個人鍵dのビット数をuとすると、式(5.1)が成り立つものとする。
u=b+km (5.1)
u=b+km (5.1)
例えば、個人鍵dが378=(101111010)2であるとすると、u=9である。また、ウィンドウサイズkが2であり、bが3であり、乱数値sが3=(011)2であるとする。この場合、式(5.1)よりm=3である。ランダム化ウィンドウ法では、0≦i≦(m−1)なる各iについてkビットのウィンドウ値w[i]が計算され、さらに、式(5.2)が成立するようにbビットの補正値cが計算される。
式(5.4)の左辺は、個人鍵dと乱数値sから計算される値を示す。そして、式(5.4)の右辺は、式(5.4)の左辺により計算される値を最上位ビットからkビットずつ区切ることでウィンドウ列が得られることと、式(5.4)の左辺により計算される値の最下位のbビットが補正値cとなることを示す。
例えば、上記のとおりd=378=(101111010)2であり、乱数値sが3=(011)2である場合、式(5.4)の左辺を計算すると、式(5.5)のとおりである。
378-(20×3+22×3+24×3)=378-(3+12+48)=315=(100111011)2 (5.5)
378-(20×3+22×3+24×3)=378-(3+12+48)=315=(100111011)2 (5.5)
よって、式(5.5)により得られた値(100111011)2を2ビットずつ区切ることでウィンドウ列w[2]、w[1]、w[0]が得られる。また、この値(100111011)2の最下位のb(=3)ビットから補正値cが得られる。具体的には、式(5.6)〜(5.9)のとおりである。
w[2]=(10)2=2 (5.6)
w[1]=(01)2=1 (5.7)
w[0]=(11)2=3 (5.8)
c=(011)2=3 (5.9)
w[2]=(10)2=2 (5.6)
w[1]=(01)2=1 (5.7)
w[0]=(11)2=3 (5.8)
c=(011)2=3 (5.9)
ランダム化ウィンドウ法では、以上のようにしてウィンドウ値w[i](0≦i≦m−1)と補正値cが計算される。また、ランダム化ウィンドウ法ではさらに、スカラ倍算の対象である点Aの座標を用いて、0≦h≦2k−1なる各hに対して、予め、インデックスhと対応づけて式(5.10)のテーブルデータが計算され、メモリに格納される。
tab[h]=(2bh+s)A (5.10)
tab[h]=(2bh+s)A (5.10)
例えば、上記のとおりb=3でありs=(011)2=3である場合、メモリにはテーブルデータとして次の式(5.11)〜(5.14)のデータが格納される。
tab[(00)2]=tab[0]=(23×0+3)A=3A (5.11)
tab[(01)2]=tab[1]=(23×1+3)A=11A (5.12)
tab[(10)2]=tab[2]=(23×2+3)A=19A (5.13)
tab[(11)2]=tab[3]=(23×3+3)A=27A (5.14)
tab[(00)2]=tab[0]=(23×0+3)A=3A (5.11)
tab[(01)2]=tab[1]=(23×1+3)A=11A (5.12)
tab[(10)2]=tab[2]=(23×2+3)A=19A (5.13)
tab[(11)2]=tab[3]=(23×3+3)A=27A (5.14)
そして、点dAの計算は、式(5.15)にしたがって行われる。
dA=22(22(22(O)+tab[w[2]])+tab[w[1]])+tab[w[0]]+cA
=4(4(4(O)+19A)+11A)+27A+3A
=4(4(O+19A)+11A)+27A+3A
=4(4(19A)+11A)+27A+3A
=4(76A+11A)+27A+3A
=4(87A)+27A+3A
=348A+27A+3A
=378A (5.15)
dA=22(22(22(O)+tab[w[2]])+tab[w[1]])+tab[w[0]]+cA
=4(4(4(O)+19A)+11A)+27A+3A
=4(4(O+19A)+11A)+27A+3A
=4(4(19A)+11A)+27A+3A
=4(76A+11A)+27A+3A
=4(87A)+27A+3A
=348A+27A+3A
=378A (5.15)
式(5.2)が満たされるように、式(5.5)により式(5.9)の補正値cが算出されているので、式(5.15)の計算により確かにdA(すなわちこの例では378A)が得られる。
また、式(5.15)は、個人鍵dのビット値によらず、「2倍算をk回(上記の例ではk=2)行い、加算を1回行う」という処理がm回(上記の例ではm=3)繰り返され、補正値cを用いた1回のスカラ倍算と点cAの加算が行われることを示す。よって、ランダム化ウィンドウ法は、ウィンドウ法と同様にSPA攻撃に対して安全である。また、テーブルデータが乱数値sによってランダム化されているので、ランダム化ウィンドウ法は、DPA攻撃に対しても安全である。
ところで、ウィンドウ法でもランダム化ウィンドウ法でも、ウィンドウサイズkに応じて、2k個のエントリがテーブル内に作成される。他方で、組み込み機器など、ある種の装置では、メモリ容量が少ないため、各種の処理を行うためのメモリ使用量を少なくすることが望ましい。
組み込み機器の1つの例はスマートカードである。また、組み込み機器の他の例は、プリンタなどの電子機器により認証される部品である。例えば、偽造品排除のために、二次電池あるいはプリンタカートリッジなどのアクセサリ部品に、「認証チップ」と呼ばれるLarge Scale Integration(LSI)が組み込まれていてもよい。プリンタによるプリンタカートリッジの認証は、例えば、正規品以外のプリンタカートリッジでの印刷を不能にするために行われてもよい。もちろん、組み込み機器にはその他の様々な種類がある。
例えば、スマートカードや認証機能つきプリンタカートリッジなどの装置では特に、メモリ搭載量が少ない。よって、スカラ倍算に関しても、メモリ使用量を抑えた処理アルゴリズムが好ましい。
そこで、第4の比較例として、「符号つき(signed)ウィンドウ法」について次に説明する。符号つきウィンドウ法は、ウィンドウ法と同様にSPA攻撃に対して安全であり、かつウィンドウ法よりもメモリ使用量が少ない方法である。
具体的には、ウィンドウサイズをkとすると、ウィンドウ法ではテーブルデータのエントリ数が2k個であるのに対し、符号つきウィンドウ法ではテーブルデータのエントリ数が2k−1+1個である。よって、符号つきウィンドウ法のメモリ使用量は、ウィンドウ法のメモリ使用量の約半分である。同様に、符号つきウィンドウ法のメモリ使用量は、ランダム化ウィンドウ法のメモリ使用量の約半分である。
符号つきウィンドウ法は、「楕円曲線上の点Pから逆元である点−Pを求める計算の処理負荷は、比較的軽い(つまり逆元の計算コストが低い)」ということに注目した方法である(式(1.4)および(1.5)、ならびにその説明を参照)。符号つきウィンドウ法におけるテーブルデータのインデックスhは、具体的には0≦h≦2k−1である。
例えば、ウィンドウサイズkが3であるとする。すると、符号つきウィンドウ法で使われるインデックスは0、1、2、3、4の5つである。そして、これらの5つのインデックスに対応する対応するテーブルデータは、0A、1A、2A、3A、4Aである。符号つきウィンドウ法では、次の式(6.1)〜(6.3)の関係を利用することにより、3つのインデックス5、6、7に対応するテーブルデータ5A、6A、7Aが省略される。
5A=2kA-3A=8A-3A (6.1)
6A=2kA-2A=8A-2A (6.2)
7A=2kA-1A=8A-1A (6.3)
5A=2kA-3A=8A-3A (6.1)
6A=2kA-2A=8A-2A (6.2)
7A=2kA-1A=8A-1A (6.3)
例えば、ウィンドウサイズkが3ビットであり、個人鍵dが241=(011110001)2であるとする。符号つきウィンドウ法では、まず、ウィンドウ法と同様にして仮のウィンドウ値が求められる。すなわち、仮のウィンドウ値は次の式(6.4)〜(6.6)のとおりである。なお、特に混乱のおそれはないので、以下では、仮のウィンドウ値と確定した実際のウィンドウ値をともにw[i]と表記する。
w[2]=(011)2=3 (6.4)
w[1]=(110)2=6 (6.5)
w[0]=(001)2=1 (6.6)
w[2]=(011)2=3 (6.4)
w[1]=(110)2=6 (6.5)
w[0]=(001)2=1 (6.6)
そして、仮のウィンドウ値は最下位(すなわちw[0])から順にスキャンされ、次のようにして各ウィンドウ値が確定される。すなわち、もしw[i]≧2k−1+1であれば、仮のウィンドウ値w[i]から2kを引いた値(すなわちw[i]−2k)がウィンドウ値w[i]として設定される。また、i番目の仮のウィンドウ値w[i]から2kの減算が行われた場合は、減算の影響をキャンセルするため、1つ上位の仮のウィンドウ値w[i+1]には、1が足される。
なお、以下では上記の2kの減算を「ウィンドウ補正」といい、上記の1の加算を「キャリー(carry)補正」という。また、上記のw[i]≧2k−1+1という条件の代わりに、w[i]≧2k−1という条件を用いてもよいが、以下では説明の便宜上、w[i]≧2k−1+1という条件が用いられるものとする。
式(6.4)〜(6.6)の仮のウィンドウ値から、実際のウィンドウ値は、次のようにして求められる。
すなわち、式(6.6)よりw[0]<2k−1+1が成立する。よって、0番目(つまり最下位)のウィンドウ値w[0]は仮のウィンドウ値と同じく1である。
すなわち、式(6.6)よりw[0]<2k−1+1が成立する。よって、0番目(つまり最下位)のウィンドウ値w[0]は仮のウィンドウ値と同じく1である。
また、式(6.5)よりw[1]≧2k−1+1が成立する。よって、1番目のウィンドウ値は、仮のウィンドウ値6から8(=2k)を引くことで得られ、w[1]=−2と確定する。よって、キャリー補正により、式(6.4)の仮のウィンドウ値w[2]には1が足され、w[2]=4となる。
そして、このキャリー補正された仮のウィンドウ値w[2]=4は、w[2]<2k−1+1を満たす。よって、2番目(つまり最上位)のウィンドウ値はw[2]=4と確定する。
以上のようにして確定したウィンドウ値w[0]〜w[2]を用いて、符号つきウィンドウ法では式(6.7)により点dAが計算される。
dA=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]] (6.7)
dA=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]] (6.7)
より具体的には、スカラ倍算の結果を変数Vで表すことにすると、式(6.8)のとおり、変数Vがまず無限遠点Oにより初期化される。
V=O (6.8)
V=O (6.8)
その後、i=m−1からi=0へと順に、「2倍算をk回行い、ウィンドウ値w[i]が0以上ならtab[w[i]]を加算し、ウィンドウ値w[i]が負ならtab[−w[i]]を減算し、得られた結果を変数Vに代入する」という処理が行われる。なお、mは、個人鍵dのビット長uをウィンドウサイズkで割った値であり、本例ではm=3である。
式(6.8)の初期化に続いて、i=m−1に対応する処理が行われる。すなわち、ウィンドウ値w[2](=4)に対応して、式(6.9)のとおり3回の2倍算と1回の加算が行われる。
V=23(O)+tab[w[2]] (6.9)
V=23(O)+tab[w[2]] (6.9)
次に、ウィンドウ値w[1](=−2)に対応して、式(6.10)のとおり3回の2倍算と1回の減算が行われる。
V=23(23(O)+tab[w[2]])-tab[-w[1]] (6.10)
V=23(23(O)+tab[w[2]])-tab[-w[1]] (6.10)
そして、最後にウィンドウ値w[0](=1)に対応して、式(6.11)のとおり3回の2倍算と1回の減算が行われる。
V=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]] (6.11)
V=23(23(23(O)+tab[w[2]])-tab[-w[1]])+tab[w[0]] (6.11)
式(6.11)の右辺を展開すると、下記の式(6.12)のとおりである。また、上記のとおり本例において個人鍵dは241である。よって、以上説明した符号つきウィンドウ法により点dAが正しく計算されることが理解されるであろう。
V=23(23(23(O)+tab[4])-tab[2])+tab[1]
=23(23(4A)-2A)+1A
=8(32A-2A)+1A
=241A (6.12)
V=23(23(23(O)+tab[4])-tab[2])+tab[1]
=23(23(4A)-2A)+1A
=8(32A-2A)+1A
=241A (6.12)
なお、符号つきウィンドウ法は、ウィンドウ法と同様の理由から、SPA攻撃に対しては安全であるが、DPA攻撃に対しては脆弱である。
さて、以上のとおり第1〜第4の比較例について説明したが、SPA攻撃とDPA攻撃の双方に対して安全なランダム化ウィンドウ法はメモリ消費量が比較的多く、メモリ消費量の少ない符号つきウィンドウ法はDPA攻撃に対しては脆弱である。すなわち、上記の4つの比較例の中には、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴を持つ手法は存在しない。
他方、サイドチャネル攻撃の1種であるPA攻撃は、組み込み機器に対しても行われる危険性が十分にあり、また、組み込み機器の中には、何らかの理由からメモリ容量が限られたものがある。よって、例えば組み込み機器のようにメモリ容量の小さな装置におけるスカラ倍算の処理は、SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ないことが好ましい。
しかしながら、本願発明者が研究したところ、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴は、単純素朴にランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせることでは得られないことが判明した。むしろ、発明者は「ランダム化ウィンドウ法と符号つきウィンドウ法は、単純素朴に組み合わせることは不可能である」という知見を得た。この知見をもう少し詳しく述べると、次のとおりである。
乱数の使用は、符号つきウィンドウ法の単純な適用を阻害する。そのため、SPA攻撃への対策としてランダム化ウィンドウ法が採用されると、符号つきウィンドウ法の単純な適用によるメモリ使用量の削減は不可能となる。つまり、「符号つきウィンドウ法とランダム化ウィンドウ法の単純素朴な組み合わせによって、少ないメモリ使用量で、SPA攻撃とDPA攻撃の双方に対する安全性を確保しよう」という試みは、うまくいかない。
上記知見は、後述の第1〜第3実施形態について理解するうえで有益なので、以下、上記知見について詳しく説明する。
図1は、ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせる試みについて例示する図である。以下に説明するとおり、図1に例示する試みは失敗に終わる。
図1は、ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせる試みについて例示する図である。以下に説明するとおり、図1に例示する試みは失敗に終わる。
図1の例における個人鍵dは、式(7.1)に示す23ビットの値である。
d=(01001010110100011011011)2 (7.1)
また、図1の例における乱数値sは、式(7.2)に示す8ビットの値である。
s=(10001101)2 (7.2)
d=(01001010110100011011011)2 (7.1)
また、図1の例における乱数値sは、式(7.2)に示す8ビットの値である。
s=(10001101)2 (7.2)
したがって、図1の例ではu=23でありb=8である。また、ウィンドウサイズkが3であるとする。よって、式(5.1)の整数m(すなわちウィンドウ列に含まれるウィンドウ値の数)は、式(7.3)より5である。
m=(u-b)/k=(23-8)/3=5 (7.3)
m=(u-b)/k=(23-8)/3=5 (7.3)
上記のとおりランダム化ウィンドウ法では、式(5.2)が満たされるように、式(5.4)にしたがってウィンドウ値w[i](0≦i≦m−1)と補正値cが決定される。そこで、図1の例でも、式(5.4)にしたがってランダム化ウィンドウ法と同様に、仮にウィンドウ値w[i]と補正値cが計算されると仮定する。すると、式(5.4)の左辺の計算結果は式(7.4)のとおりであるから、図1および式(7.5)〜(7.10)に示したように仮のウィンドウ値w[i]と補正値cが得られる。
d-(20s+23s+26s+29s+212s)=(00110110101011010100110)2 (7.4)
w[4]=(001)2=1 (7.5)
w[3]=(101)2=5 (7.6)
w[2]=(101)2=5 (7.7)
w[1]=(010)2=2 (7.8)
w[0]=(110)2=6 (7.9)
c=(10100110)2 (7.10)
d-(20s+23s+26s+29s+212s)=(00110110101011010100110)2 (7.4)
w[4]=(001)2=1 (7.5)
w[3]=(101)2=5 (7.6)
w[2]=(101)2=5 (7.7)
w[1]=(010)2=2 (7.8)
w[0]=(110)2=6 (7.9)
c=(10100110)2 (7.10)
続いて、上記の式(7.5)〜(7.9)のように得られた各ウィンドウ値w[i]に対して、符号つきウィンドウ法と同様にして、ウィンドウ補正とキャリー補正が行われると仮定する。図1の例ではウィンドウサイズkが3なので、w[i]≧5(=2k−1+1)のときにウィンドウ補正により仮のウィンドウ値w[i]から8(=2k)が引かれ、ウィンドウ値w[i+1]に対してキャリー補正が行われる。
すなわち、最下位のウィンドウ値w[0]がw[0]≧2k−1+1の場合、ウィンドウ補正によりウィンドウ値w[0]からは2kが引かれ、1つ上位のウィンドウ値w[1]に対してキャリー補正が行われる。最下位以外のウィンドウ値w[i](1≦i≦m−1)に関しては、仮のウィンドウ値w[i]とキャリー補正値の合計が2k−1+1以上の場合に、ウィンドウ補正が行われ、1つ上位のウィンドウ値w[i+1]に対してキャリー補正が行われる。
具体的には、図1に示すように、まず最下位の仮のウィンドウ値w[0]=6(≧5)に対してウィンドウ補正が行われ、ウィンドウ値w[0]は式(7.11)のように確定する。
w[0]=6-8=-2 (7.11)
w[0]=6-8=-2 (7.11)
そして、次のウィンドウ値w[1]に対してキャリー補正により1が足され、ウィンドウ値w[1]は式(7.12)のように確定する。なお、3<5なのでウィンドウ値w[1]に対するウィンドウ補正は行われない。
w[1]=2+1=3 (7.12)
w[1]=2+1=3 (7.12)
続いて、次のウィンドウ値w[2]=5(≧5)に対してウィンドウ補正が行われ、ウィンドウ値w[2]は式(7.13)のように確定する。
w[2]=5-8=-3 (7.13)
w[2]=5-8=-3 (7.13)
そして、さらに次のウィンドウ値w[3]に対して、キャリー補正により1が足される。キャリー補正されたウィンドウ値w[3]は、5以上であるから、ウィンドウ補正の対象となる。したがって、ウィンドウ値w[3]は式(7.14)のように確定する。
w[3]=5+1-8=-2 (7.14)
w[3]=5+1-8=-2 (7.14)
そして、次の(すなわち最上位の)ウィンドウ値w[4]に対してはキャリー補正により1が足される。なお、キャリー補正されたウィンドウ値w[4]は5未満なので、ウィンドウ補正の対象ではなく、結局、ウィンドウ値w[4]は式(7.15)のように確定する。
w[4]=1+1=2 (7.15)
w[4]=1+1=2 (7.15)
図1には、以上のようにして確定した式(7.11)〜(7.15)のウィンドウ値w[0]〜w[4]と、式(7.10)の補正値cが示されている。以上のようにして得られたウィンドウ値w[i]の絶対値は、上記の例からも分かるとおり、2k−1以下である。
しかしながら、第4の比較例として挙げた符号つきウィンドウ法とは異なり、ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせようとした図1の例では、たとえすべてのウィンドウ値の絶対値が2k−1以下でも、テーブルデータの削減ができない。すなわち、「ランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせることで、耐タンパ性とメモリ使用量の抑制を両立させよう」という試みは失敗する。その理由について、図2を参照しながら以下に説明する。
図2は、図1の試みが失敗する理由を説明する図である。図2は、図1と同様に、ウィンドウサイズkが3であり乱数値sのビット長bが8の場合の例を示す。図2において、テーブル101は符号つきウィンドウ法に対応し、テーブル102は図1の試みに対応する。
符号つきウィンドウ法によれば、2k−1+1以上のウィンドウ値からは、ウィンドウ補正により2kが引かれる。例えば、k=3の場合、5以上のウィンドウ値からは8が引かれる。
よって、必要に応じてキャリー補正されたウィンドウ値が5ならば、ウィンドウ補正されたウィンドウ値は−3となる。そして、式(1.4)と(1.5)に示したように、楕円曲線上のある点からその逆元の点を得るための計算量は少ないので、スカラ倍点−3Aは、スカラ倍点3Aから少ない計算量で容易に求められる。
よって、符号つきウィンドウ法によれば、テーブル101は、5というインデックスに対応づけてスカラ倍点5Aのテーブルデータを保持する必要もないし、5というインデックスに対応づけてスカラ倍点−3Aのテーブルデータを保持する必要もない。すなわち、符号つきウィンドウ法では、図2のテーブル101のように、テーブル101においてインデックスが5のエントリは省略可能であり、インデックスが3のエントリがその代わりに使われる。
同様に、符号つきウィンドウ法によれば、テーブル101に示すようにインデックスが6と7のエントリも省略可能であり、インデックスが2と1のエントリがその代わりに使われる。その結果、符号つきウィンドウ法によれば、テーブル101は、2k個のエントリを保持する必要がない。すなわち、テーブル101は、インデックスが2k−1以下のエントリさえ保持すればよい。よって、符号つきウィンドウ法ではウィンドウ法(あるいはランダム化ウィンドウ法)と比べてメモリ使用量が少ない。
それに対して、図1の試みに対応するテーブル102では、インデックスが2k−1+1以上のエントリも省略不可能であり、ウィンドウ法(あるいはランダム化ウィンドウ法)と比較してメモリ使用量を少なくすることは不可能である。その理由は次のとおりである。
テーブル102において、インデックスが1のエントリのテーブルデータtab[1]は、(1×28+s)Aである。よって、テーブルデータtab[1]の減算は、点(−1×28−s)Aの加算を意味する。同様に、テーブル102におけるテーブルデータtab[2]の減算は、点(−2×28−s)Aの加算を意味し、テーブル102におけるテーブルデータtab[3]の減算は、点(−3×28−s)Aの加算を意味する。
それに対して、図1の試みでは、ウィンドウ補正やキャリー補正により初期ウィンドウ値が補正されることはあるが、乱数値sは一定である。そのため、例えば、必要に応じてキャリー補正が行われた後のウィンドウ値が5の場合、ウィンドウ値は−3に補正されるが、こうして−3に補正されたウィンドウ値に対応するのは点(−3×28+s)Aの加算である。
そして、点(−3×28+s)Aは、インデックスが3のエントリのテーブルデータが表す点の逆元(−3×28−s)Aではない。つまり、式(−3×28+s)Aと(−3×28−s)Aでは、乱数値sの符号が異なる。
よって、点(−3×28+s)Aは、インデックスが3のエントリのテーブルデータからわずかな計算量で計算される点ではない。よって、テーブル102は、ウィンドウ補正された−3というウィンドウ値に対応するテーブルデータとして、スカラ倍算点(−3×28+s)Aを保持する必要がある。すなわち、インデックス5に対応するエントリをテーブル102から省略することはできない。
同様に、点(−2×28+s)Aは、インデックスが2のエントリのテーブルデータtab[2]=(2×28+s)Aからわずかな計算量で計算可能な点(−2×28−s)Aとは異なる。したがって、インデックス6に対応するエントリをテーブル102から省略することはできない。
また、点(−1×28+s)Aは、インデックスが1のエントリのテーブルデータtab[1]=(1×28+s)Aからわずかな計算量で計算可能な点(−1×28−s)Aとは異なる。したがって、インデックス7に対応するエントリをテーブル102から省略することもできない。
以上のとおり、結局、テーブル102のエントリ数を削減することはできない。したがって、耐タンパ性とメモリ使用量の抑制を両立させようとする図1の試みは失敗する。換言すれば、ランダム化ウィンドウ法における乱数の使用は、符号つきウィンドウ法の単純な適用を阻害する要素であるから、ランダム化ウィンドウ法と符号つきウィンドウ法を単純に組み合わせようという図1の試みは失敗するのである。
なお、図2を参照して以上説明した事柄をより一般的に述べれば下記のとおりである。
図1の試みでは、ランダム化ウィンドウ法と同様に、式(5.2)を満たすように式(5.4)により初期ウィンドウ値と補正値が求められる。また、上記のとおり式(5.2)は式(5.3)のように書き換えられる。そして、式(5.3)の括弧の中は式(7.16)のように書き換えられる。式(7.16)の右辺は、インデックスhに対応するエントリのテーブルデータtab[h]が(2bh+s)Aであることに対応している。
2ki+bw[i]+2kis=2ki(2bw[i]+s) (7.16)
図1の試みでは、ランダム化ウィンドウ法と同様に、式(5.2)を満たすように式(5.4)により初期ウィンドウ値と補正値が求められる。また、上記のとおり式(5.2)は式(5.3)のように書き換えられる。そして、式(5.3)の括弧の中は式(7.16)のように書き換えられる。式(7.16)の右辺は、インデックスhに対応するエントリのテーブルデータtab[h]が(2bh+s)Aであることに対応している。
2ki+bw[i]+2kis=2ki(2bw[i]+s) (7.16)
また、あるウィンドウ値w[i]がウィンドウ補正の対象となり、ウィンドウ値w[i+1]に対してキャリー補正が行われる場合に注目して、省略記号を用いて式(5.3)を書き換えると、式(7.17)が得られる。
d=c+…+2ki+bw[i]+2kis+2k(i+1)+bw[i+1]+2k(i+1)s+… (7.17)
d=c+…+2ki+bw[i]+2kis+2k(i+1)+bw[i+1]+2k(i+1)s+… (7.17)
ここで、互いに打ち消しあう−2k(i+1)+bという項と+2k(i+1)+bという項を式(7.17)の右辺に付け加えると、式(7.18)が得られる。
d=c+…+2ki+bw[i]-2k(i+1)+b+2kis
+2k(i+1)+bw[i+1]+2k(i+1)+b+2k(i+1)s+… (7.18)
そして、式(7.18)を変形すると、式(7.19)が得られる。
d=c+…+2ki((w[i]-2k)2b+s)+2k(i+1)((w[i+1]+1)2b+s)+… (7.19)
d=c+…+2ki+bw[i]-2k(i+1)+b+2kis
+2k(i+1)+bw[i+1]+2k(i+1)+b+2k(i+1)s+… (7.18)
そして、式(7.18)を変形すると、式(7.19)が得られる。
d=c+…+2ki((w[i]-2k)2b+s)+2k(i+1)((w[i+1]+1)2b+s)+… (7.19)
式(7.19)において、(w[i]−2k)はウィンドウ補正後のウィンドウ値を表し、(w[i+1]+1)はキャリー補正された1つ上位のウィンドウ値を表す。また、式(7.19)における((w[i]−2k)2b+s)は、「図1の試みでは、ウィンドウ補正後のウィンドウ値をインデックスhとするテーブルデータとして、(2b(h−2k)+s)が必要である」ということを示す。
このように、式(7.19)における乱数値sの符号は、式(7.16)における乱数値sの符号と変わらない。よって、たとえ図1の試みのようにウィンドウ補正とキャリー補正が行われるとしても、乱数値sによりテーブルデータがランダム化される限り、テーブルデータは省略することができない。
つまり、h≧2k−1+1なるインデックスhに対応する点(2b(h−2k)+s)Aは、テーブルデータtab[−(h−2k)]=(−2b(h−2k)+s)Aの逆元ではない。よって、たとえウィンドウ補正とキャリー補正が行われるとしても、h≧2k−1+1なるインデックスhに対応するテーブルデータtab[h]=(2b(h−2k)+s)Aは、テーブルから省略することができない。
図2のテーブル102の例は、k=3の場合について、たとえウィンドウ補正とキャリー補正が行われるとしても、h=5に対応するテーブルデータtab[5]がテーブルデータtab[3]の逆元ではないので省略不能であることを示している。同様に、図2のテーブル102の例は、テーブルデータtab[6]がテーブルデータtab[2]の逆元ではないので省略不能であることを示している。また、図2のテーブル102の例は、テーブルデータtab[7]がテーブルデータtab[1]の逆元ではないので省略不能であることも示している。
以上説明したように、単純素朴にランダム化ウィンドウ法と符号つきウィンドウ法を組み合わせようとする試みは失敗する。そこで、第1〜第3実施形態では、SPA攻撃とDPA攻撃の双方に対する安全性と、メモリ使用量の抑制とを両立させるために、図1の試みとは別のアプローチが取られる。
以下に、SPA攻撃とDPA攻撃の双方に対する安全性とメモリ使用量の抑制とを両立するために第1〜第3実施形態で取られるアプローチの概要を、図3〜5を参照しながら説明する。
図3は、第1〜第3実施形態に共通するアプローチを説明する図である。図3のテーブル103は、ウィンドウサイズkが3であり乱数値sのビット長bが8の場合の例である。DPA攻撃に対する安全性を確保するため、テーブル103が保持するテーブルデータは、乱数値sによってランダム化される。
また、図1の試みが失敗する理由は、ウィンドウ補正の結果によらず常に一定の乱数値sを用いることにあった。この理由を考慮して、図3のアプローチでは、ウィンドウ値に応じて乱数値sの符号を反転する。すなわち、図3のアプローチでは、ウィンドウ補正の結果としてウィンドウ値が負になった場合には、乱数値sの符号も合わせて反転する。
例えば、k=3の場合、必要に応じてキャリー補正されたウィンドウ値は、5(=2k−1+1)以上のときにウィンドウ補正の対象となり、8(=2k)が減算される。ウィンドウ補正されたウィンドウ値は、結果として負になる。テーブル103に示されるように、図3のアプローチでは、こうして負に補正されたウィンドウ値には、元の乱数値sではなく、−sが対応づけられる。
例えば、必要に応じてキャリー補正されたウィンドウ値が5のとき、ウィンドウ補正されたウィンドウ値は−3(=5−8)であり、負である。よって、−3に補正されたウィンドウ値に、+sではなく−sによりランダム化された点(−3×28−s)Aを対応づけることにより、インデックスが5のエントリを省略することが可能となる。なぜなら、点(−3×28−s)Aは点(3×28+s)Aの逆元であり、インデックスが3のエントリのテーブルデータから少ない計算量で計算可能だからである。
同様に、必要に応じてキャリー補正されたウィンドウ値が6のとき、ウィンドウ補正されたウィンドウ値は−2(=6−8)であり、負である。よって、−2に補正されたウィンドウ値に点(−2×28−s)Aを対応づけることにより、インデックスが6のエントリを省略することが可能となる。なぜなら、点(−2×28−s)Aは点(2×28+s)Aの逆元であり、インデックスが2のエントリのテーブルデータから少ない計算量で計算可能だからである。
同様に、必要に応じてキャリー補正されたウィンドウ値が7のとき、ウィンドウ補正されたウィンドウ値は−1(=7−8)であり、負である。よって、−1に補正されたウィンドウ値に点(−1×28−s)Aを対応づけることにより、インデックスが7のエントリを省略することが可能となる。なぜなら、点(−1×28−s)Aは点(1×28+s)Aの逆元であり、インデックスが1のエントリのテーブルデータから少ない計算量で計算可能だからである。
このように、ウィンドウ補正の対象とならない0以上2k−1以下のウィンドウ値には、乱数値sが対応づけられるが、ウィンドウ補正の対象となって負に補正されたウィンドウ値には、符号を反転させた乱数値−sが対応づけられる。そこで、以下では、あるウィンドウ値w[i]に対応する乱数値をs[i]と表記する。乱数値s[i]は、iの値に応じて、+sまたは−sのいずれかの値をとる。
以上のように、ウィンドウ値w[i]に対応する乱数値s[i]を、ウィンドウ値w[i]に応じてs[i]=+sまたはs[i]=−sと設定することで、DPA攻撃に対する安全性を確保するためのランダム化と、メモリ使用量の抑制が両立可能となる。もちろん、SPA攻撃に対する安全性は、ウィンドウの使用により確保される。よって、ある点Aと個人鍵dに対してスカラ倍点dAを求めるのに、図3のテーブル103のようなテーブルデータを生成し、生成したテーブルデータに基づいた演算を行う暗号処理装置は、様々な分野に好適である。
なお、以下では表記の簡略化のため、あるiに対応するウィンドウ値を「ウィンドウ値w[i]」と表現することもあるし、ウィンドウ列(すなわちウィンドウ値の系列w[m−1],…,w[1],w[0])全体を「ウィンドウ列w[i]」と表現することもある。同様に、乱数値の系列s[m−1],…,s[1],s[0]を「乱数列」ともいい、あるiに対応する乱数値を「乱数値s[i]」と表現することもあるし、乱数列全体を「乱数列s[i]」と表現することもある。
図4は、以上説明した第1〜第3実施形態でのアプローチを別の観点から図示したものである。すなわち、u(=b+km)ビットの個人鍵dとウィンドウ列w[i]と乱数列s[i]と補正値cの間には式(8.1)が成立する。
そして、0≦i≦m−1なる各iについて、式(8.1)が成立するという制約条件のもとで、ウィンドウ値w[i]に応じて乱数値s[i]が+sまたは−sに設定される。すなわち、必要に応じてキャリー補正とウィンドウ補正が行われたウィンドウ値w[i]が0以上ならば、乱数値s[i]は+sに設定されるのが適切である。また、必要に応じてキャリー補正とウィンドウ補正が行われたウィンドウ値w[i]が負ならば、乱数値s[i]は−sに設定されるのが適切である。
以上のように、式(8.1)が成立するという制約条件のもとで、ウィンドウ値w[i]に応じて乱数値s[i]が+sまたは−sに設定されると、図3のテーブル103のように、ランダム化され、かつエントリ数の少ないテーブルを用いた演算が可能となる。すなわち、PA攻撃に対する安全性とメモリ使用量の抑制がともに実現される。
ところが、実際に式(8.1)が成立するという制約条件のもとでウィンドウ値w[i]に応じて乱数値s[i]を+sまたは−sと設定しようとすると、循環参照の取り扱いに関する困難が生じる。もちろん、第1〜第3実施形態の暗号処理装置は、その困難を克服するように設計されている。そこで、続いて、第1〜第3実施形態についての理解の助けとするために、上記困難について説明する。
図3と図4を参照して説明したとおり、各乱数値s[i]は、対応するウィンドウ値w[i]に応じて決まる。換言すれば、乱数列s[i]の値は、ウィンドウ列w[i]の値に依存して決まる。他方で、図5を参照して以下に説明するとおり、ウィンドウ列w[i]の値は、乱数列s[i]の値に依存して決まる。よって、ウィンドウ列w[i]と乱数列s[i]は互いに循環参照している。そのため、ウィンドウ列w[i]と乱数列s[i]の値を決定する自明な方法はない。
図5は、ウィンドウ列w[i]の値が乱数列s[i]の値に依存して決まることを説明する図である。図5においても、ウィンドウサイズはkであり、乱数値sのビット長はbであり、mは正整数であり、個人鍵dのビット長はu=b+mkである。よって、各ウィンドウ値w[i]と各乱数値s[i]は符号つきkビット値であり、補正値cは符号つきbビット値である。
なお、本明細書において、Nが正整数のとき、「符号つきNビット値」とは、Nビットで表される0以上(2N−1)以下の整数と、正または負の符号との組み合わせによって表される値のことである。よって、符号つきNビット値は、−(2N−1)以上(2N−1)以下である。
符号つきNビット値は、符号を示す1ビットと上記Nビットをあわせた(N+1)ビットにより表すこともできるが、(N+1)ビットの2の補数表現とは異なる。例えば、−5の2の補数表現は“1011”である。他方、5=(101)2なので、−5を符号つき3ビット値として表すと、−(101)2である。
また、符号つきNビット値の最上位または最下位の一部のビットのみを取り出す場合、取り出されたビット値の符号は、元の符号つきNビット値の符号と同じである。例えば、符号つき4ビット値−(1011)2の最上位2ビットを取り出すと、−(10)2=−2が得られ、符号つき4ビット値−(1011)2の最下位2ビットを取り出すと、−(11)2=−3が得られる。
なお、以下の説明では、符号つきNビット値についても、ビット列のiビット目を表す記号“[i]”と連結を表す記号“||”を用いる。符号つきNビット値に関してこれらの記号が用いられる場合、正負の符号も継承される。例えば、a=−(1011)2のとき、(a[3]||a[2])=−(10)2=−2であり、(a[1]||a[0])=−(11)2=−3である。
式(8.2)の左辺は、各乱数値s[i]をikビット左シフトした値2iks[i]の合計値を個人鍵dから減算した結果を表す。また、式(8.2)の右辺は、左辺が示す減算結果の上位mkビットをkビットずつ区切ることでウィンドウ列w[i]が得られることと、左辺が示す減算結果の下位bビットが補正値cとなることを示す。
式(8.1)は式(5.2)および(5.3)と類似しており、式(8.2)は、式(5.3)から得られた式(5.4)と類似している。そして、第3の比較例では、式(5.5)の具体例に示したように、式(5.4)の左辺の値を計算することでウィンドウ列と補正値が一意に得られる。よって、式(8.2)は、一見すると、第3の比較例と同様にして、左辺の値を計算することでウィンドウ列と補正値を一意に導出するための式であるかのように見えるかもしれない。
しかしながら、式(5.4)と式(8.2)には大きな違いがある。すなわち、式(5.4)では、ウィンドウの位置を示す変数iによらず一定の乱数値sが使われるのに対して、式(8.2)では、変数iによって乱数値s[i]が異なり、乱数値s[i]は+sまたは−sである。
そのため、残念ながら式(8.2)から一意にウィンドウ列と補正値を決定することはできない。つまり、各乱数値s[i]が2つの値をとりうるので、式(8.2)の左辺で個人鍵dから減じる値(すなわち各乱数値s[i]をikビット左シフトした値2iks[i]の合計値)には、2m通りのパターンがある。よって、式(8.2)の左辺で個人鍵dから減じる値が2m通りのパターンのいずれであるのかが決定されないと、式(8.2)の右辺からウィンドウ列w[i]と補正値cの値を確定することはできない。
例えば、個人鍵dのビット長uが160であり、乱数値のビット長bが10であり、ウィンドウサイズkが3であるとすると、式(8.3)よりm=50である。
m=(u-b)/k=(160-10)/3=50 (8.3)
この場合、式(8.2)の左辺で個人鍵dから減じる値は、250通りの厖大なパターンのうちの1つである。つまり、この場合、乱数列s[i]は、潜在的に可能な250通りのパターンのいずれか1つである。
m=(u-b)/k=(160-10)/3=50 (8.3)
この場合、式(8.2)の左辺で個人鍵dから減じる値は、250通りの厖大なパターンのうちの1つである。つまり、この場合、乱数列s[i]は、潜在的に可能な250通りのパターンのいずれか1つである。
したがって、式(8.2)によってウィンドウ列w[i]と補正値cを計算しようとすると、乱数列s[i]として潜在的に可能な250通りのパターンのうちの1つを選択しない限り、ウィンドウ列w[i]と補正値cは得られない。すなわち、ウィンドウ列w[i]の値は乱数列s[i]の値に依存する。
他方、図3と図4を参照して説明したとおり、乱数列s[i]の値はウィンドウ列w[i]の値に依存する。したがって、ウィンドウ列w[i]と乱数列s[i]は互いに循環参照している。
以上のような循環参照が存在すると、ウィンドウ列w[i]の値と乱数列s[i]の値と補正値cを一意に決定する自明な方法は存在しない。このことは、循環参照の存在しない第3の比較例においては式(5.4)に示すごとくウィンドウ列w[i]の値を一意に決定する自明な方法があることと対照的である。第1〜第3実施形態では、循環参照に起因する困難を克服するため、後述の方法にしたがって、ウィンドウ列w[i]の値と乱数列s[i]の値と補正値cが決定される。
以上説明したとおり、第1〜第3実施形態の暗号処理装置は、図3に示したアプローチにしたがいつつ、循環参照に起因する困難を克服してウィンドウ列w[i]の値と乱数列s[i]の値と補正値cを決定するという点が共通する。さらに、第1〜第3実施形態の暗号処理装置は、他のいくつかの点でも共通する。そこで、以下では第1〜第3実施形態の暗号処理装置の共通点について図6〜10を参照して説明し、その後、個々の実施形態について詳細に説明する。
さて、図6は、第1〜第3実施形態の暗号処理装置の第1のハードウェア構成例を示す図である。
図6の暗号処理装置200は、Central Processing Unit(CPU)201、Read Only Memory(ROM)202、Random Access Memory(RAM)203、通信回路204、および通信インタフェイス(I/F)205を有する。通信回路204は、通信I/F205を介して他の装置との間で通信を行う。
図6の暗号処理装置200は、Central Processing Unit(CPU)201、Read Only Memory(ROM)202、Random Access Memory(RAM)203、通信回路204、および通信インタフェイス(I/F)205を有する。通信回路204は、通信I/F205を介して他の装置との間で通信を行う。
そして、CPU201、ROM202、RAM203、および通信回路204は、バス206により互いに接続されている。また、暗号処理装置200は、電源端子207とグランド端子208を有し、暗号処理装置200内の各部へは、不図示の配線と電源端子207を介して電源電圧が供給される。暗号処理装置200内の各部は、不図示の配線を介してグランド端子208とも接続されている。
CPU201は、ROM202に予め記憶されたプログラムをRAM203にロードし、RAM203をワーキングエリアとして用いながらプログラムを実行することで、各種の処理を行う。例えば、CPU201は、図9の処理を行う。なお、後述するように、図9の処理は、図10の処理を含み、図11、19または24の処理も含む。
なお、ROM202の代わりにフラッシュメモリなどの他の種類の不揮発性記憶装置が使われてもよい。フラッシュメモリなどの書き換え可能な記憶装置がROM202の代わりに使われる場合は、プログラムは、通信I/F205を介して暗号処理装置200にダウンロードされ、暗号処理装置200にインストールされてもよい。
また、暗号処理装置200は、通信I/F205を介して他の装置と通信することができる。例えば、暗号処理装置200は、暗号処理装置200自身の公開鍵などの情報を、通信I/F205を介して他の装置に送信してもよいし、他の装置の公開鍵などの情報を、通信I/F205を介して受信してもよい。
通信I/F205の種類は、暗号処理装置200の種類に応じた任意の種類でよい。例えば、暗号処理装置200は、スマートカードでもよいし、プリンタカートリッジなどのアクセサリ部品に組み込まれるLSIチップでもよいし、家電製品に組みこまれるLSIチップでもよい。例えば、暗号処理装置200が接触式スマートカードの場合は、通信I/F205は通信用端子を含んでもよいし、暗号処理装置200が非接触式スマートカードの場合は、通信I/F205はアンテナを含んでもよい。
通信回路204は、通信I/F205の種類と通信プロトコルに応じて、適宜の処理を行う。例えば、通信回路204は、ディジタル・アナログ変換、アナログ・ディジタル変換、変調、復調、符号化、復号などの処理を行ってもよい。
なお、PA攻撃を行う攻撃者は、通信I/F205を介して楕円曲線上の点のデータを暗号処理装置200に入力し、入力された点に関して暗号処理装置200が処理を行っているときの消費電力を測定することで、暗号処理装置200の個人鍵を推測する。例えば、攻撃者は、電源端子207に抵抗器を接続することで、消費電力の測定を行う。
図7は、第1〜第3実施形態の暗号処理装置の第2のハードウェア構成例を示す図である。図7の暗号処理装置210は、CPU201とROM202の代わりにECCハードウェア回路211を有する。
また、暗号処理装置210は、図6の暗号処理装置200と同様のRAM203と通信回路204と通信I/F205を有する。そして、暗号処理装置210において、ECCハードウェア回路211とRAM203と通信回路204は互いにバス206で接続されている。また、暗号処理装置210にも図6の暗号処理装置200と同様の電源端子207とグランド端子208がある。
暗号処理装置210においては、ROM202からプログラムを読み出して実行するCPU201の代わりに、ECCハードウェア回路211が図9の処理を行う。ECCハードウェア回路211は、例えば、Application Specific Integrated Circuit(ASIC)でもよいし、ECCハードウェア回路211の少なくとも一部がField Programmable Gate Array(FPGA)により実現されていてもよい。また、ECCハードウェア回路211も、不図示の配線により電源端子207およびグランド端子208と接続されている。
なお、実施形態によっては、暗号処理装置が、汎用プロセッサとしての図6のCPU201と、CPU201が実行するプログラムを格納する図6のROM202と、コプロセッサとしての図7のECCハードウェア回路211を有していてもよい。そして、図9の処理の一部をCPU201が行い、残りの一部をECCハードウェア回路211が行ってもよい。その場合も、暗号処理装置は、図6および図7と同様に、RAM203と通信回路204と通信I/F205を有する。
図8は、第1〜第3実施形態の暗号処理装置の機能構成を説明する図である。図8に示す暗号処理装置300は、図6または図7に例示したハードウェアにより実現されてもよい。
暗号処理装置300は処理部301を有し、処理部301は判断部302と決定部303を含む。暗号処理装置300はさらに、個人鍵格納部304、乱数生成部305、取得部306、スカラ倍算部307、スカラ倍点情報格納部308、ウィンドウ演算部309、補正部310および結果処理部311を有する。
処理部301は、uビットの個人鍵dとbビットの乱数値sから、ウィンドウ列w[i]と乱数列s[i]と補正値cを得るための処理を行う。
処理部301内の判断部302は、各乱数値s[i]を+sと−sのいずれに設定するのが良いかを判断する。判断部302の判断基準は、実施形態に応じて異なるので、詳しくは後述する。
処理部301内の判断部302は、各乱数値s[i]を+sと−sのいずれに設定するのが良いかを判断する。判断部302の判断基準は、実施形態に応じて異なるので、詳しくは後述する。
また、処理部301内の決定部303は、判断部302の決定にしたがって、乱数値s[i]とウィンドウ値w[i]と補正値cを決定する。そして、決定部303は、決定した乱数値s[i]とウィンドウ値w[i]に応じた値(具体的には後述の補正済み差分値diff)を、次の乱数値s[i−1]についての判断のために判断部302にフィードバックする。また、決定部303は、決定したウィンドウ列w[i]と乱数列s[i]をウィンドウ演算部309に出力し、決定した補正値cを補正部310に出力する。
また、詳しくは後述するが、第1〜第3実施形態では、処理部301が個人鍵dに対する前処理を図9のステップS102で行い、補正部310が図9のステップS109〜S111の後処理を行う。そこで、処理部301は、個人鍵dのLSBであるd[0]を、後処理のために補正部310に出力する。
なお、判断部302と決定部303を含む処理部301は、図6のCPU201によって実現されてもよいし、図7のECCハードウェア回路211によって実現されてもよいし、CPU201とECCハードウェア回路211の組み合わせにより実現されてもよい。また、処理部301がCPU201により実現される場合、判断部302を実現するためのプログラムモジュールと決定部303を実現するためのプログラムモジュールは、別個のプログラムモジュールでもよいし、あるいは1つに統合されていてもよい。
また、個人鍵格納部304は、個人鍵dを格納しており、例えばROM202により実現される。処理部301はこの個人鍵格納部304から個人鍵dを読み出す。なお、個人鍵dは符号なしの(unsigned)正の値である。
乱数生成部305は、bビットの乱数値sを生成し、乱数値sを処理部301に出力する。説明の簡単化のため、以下の第1〜第2実施形態の説明では、乱数値sが0以上と仮定し、第3実施形態の説明では乱数値sが正であると仮定するが、乱数値sが負の場合の変形例についても、後述する。乱数生成部305は、CPU201またはECCハードウェア回路211により実現される。
取得部306は、スカラ倍算の対象である楕円曲線上の点Aのxy座標を取得し、取得した点Aのxy座標をスカラ倍算部307と補正部310に出力する。なお、取得部306は、暗号処理装置300の不図示の記憶部から点Aのxy座標を読み出すことにより点Aのxy座標を取得してもよいし、外部装置と通信して外部装置から点Aのxy座標を受信することで点Aのxy座標を取得してもよい。
例えば、点Aは、暗号処理装置300自身が予め決定したベースポイントでもよい。この場合、取得部306は、ベースポイントのxy座標を記憶するための暗号処理装置300内の不図示の記憶部を参照することで、点Aのxy座標を取得する。
ベースポイントのxy座標を記憶する記憶部は、例えばROM202により実現されてもよい。そして、取得部306は、ROM202からデータを読み出すCPU201またはECCハードウェア回路211により実現されてもよい。
あるいは、点Aは、暗号処理装置300以外の装置から暗号処理装置300に与えられる点でもよい。例えば、点Aは、外部装置の公開鍵でもよい。外部装置の公開鍵は、例えば、DH鍵共有のために外部装置から暗号処理装置300へと通知されることもあるし、DSAによる認証のために外部装置から暗号処理装置300へと通知されることもある。
点Aが暗号処理装置300以外の装置から暗号処理装置300に与えられる点である場合、取得部306は、具体的には、通信I/F205と通信回路204により実現される。すなわち、取得部306は、外部装置から点Aのxy座標を受信することで、点Aのxy座標を取得する。
また、スカラ倍算部307は、実施形態に応じて適宜に決められた範囲内の各インデックスhに対して、点(2bh+s)Aのxy座標を計算する。点(2bh+s)Aは、点Aのスカラ倍点なので、以下では点(2bh+s)Aを表す情報(すなわち点(2bh+s)Aのxy座標)を「スカラ倍点情報」ともいう。スカラ倍算部307は、インデックスとスカラ倍点情報をスカラ倍点情報格納部308に出力する。スカラ倍算部307は、CPU201により実現されてもよいし、ECCハードウェア回路211により実現されてもよいし、両者の組み合わせにより実現されてもよい。
また、スカラ倍点情報格納部308は、スカラ倍算部307が生成したスカラ倍点情報をインデックスと対応づけて格納する。スカラ倍点情報格納部308は、RAM203により実現される。
なお、第1〜3実施形態のスカラ倍点情報格納部308は、スカラ倍点情報とインデックスをテーブル形式のデータとして格納するので、以下ではインデックスhに対応づけられたスカラ倍点情報を、「テーブルデータ」ともいい、tab[h]とも表記する。また、テーブルデータtab[h]は乱数値sによりランダム化されているので、以下ではテーブルデータtab[h]を「ランダム化テーブルデータ」ともいう。
もちろん、スカラ倍点情報のデータ形式は実施形態に応じて任意であり、テーブル形式以外のデータ形式も利用可能である。例えば、スカラ倍点情報格納部308は、単に、ベースアドレスとインデックスhから一意に決定されるメモリアドレスに点(2bh+s)Aのxy座標を記憶するだけでもよい。つまり、スカラ倍点情報格納部308は、点(2bh+s)Aのxy座標をインデックスhと対応づけて記憶してさえいればよく、インデックスh自体を明示的に記憶していなくてもよい。
また、ウィンドウ演算部309は、処理部301により得られたウィンドウ列w[i]と乱数列s[i]を用いて、スカラ倍点情報格納部308に格納されたスカラ倍点情報tab[h]を参照しながら、ウィンドウを利用した演算を行う。そして、ウィンドウ演算部309は、演算結果を補正部310に出力する。ウィンドウ演算部309は、CPU201により実現されてもよいし、ECCハードウェア回路211により実現されてもよいし、両者の組み合わせにより実現されてもよい。
具体的には、ウィンドウ演算部309は、処理部301により得られたウィンドウ値w[i]またはその符号を反転させた値−w[i]を、インデックスhとして用いて、スカラ倍点情報格納部308を参照する。そして、ウィンドウ演算部309は、インデックスhに対応するスカラ倍点情報tab[h]をスカラ倍点情報格納部308から読み出し、読み出したスカラ倍点情報tab[h]を用いた演算を実行する。ウィンドウ演算部309の詳しい動作は図10とともに後述する。
補正部310は、決定部303から入力される補正値cと取得部306から入力される点Aのxy座標から、点cAを計算する。そして、補正部310は、ウィンドウ演算部309からの入力である楕円曲線上の点に点cAを加算し、処理部301から通知された個人鍵dのLSBであるd[0]の値を参照して後処理を行うことで、ウィンドウ演算部309の演算結果を補正する。結果として得られる点Vは、V=dAなる点である。補正部310は、点Vのxy座標を結果処理部311に出力する。
補正部310は、CPU201により実現されてもよいし、ECCハードウェア回路211により実現されてもよいし、両者の組み合わせにより実現されてもよい。また、詳しくは図9のステップS107とともに後述するが、補正部310は、ローカルなテーブルデータを持つので、補正部310を実現するにはRAM203も用いられる。
結果処理部311は、点Vのxy座標を用いて適宜の処理を行う。例えば、結果処理部311は、点Vを他の装置に送信してもよいし、DSAによる認証のための処理を行ってもよいし、DH鍵共有のための処理を行ってもよい。結果処理部311は、CPU201により実現されてもよいし、ECCハードウェア回路211により実現されてもよいし、両者の組み合わせにより実現されてもよい。また、処理の内容によっては、結果処理部311を実現するために、さらに、通信回路204と通信I/F205などが利用されてもよい。
例えば、暗号処理装置300が、ホスト(例えばプリンタなど)により認証されるアクセサリ部品(例えばプリンタカートリッジなど)に含まれる場合、結果処理部311は、ホストと通信するための通信回路204と通信I/F205を含む。
続いて、図9と10を参照して、第1〜第3実施形態の暗号処理装置300が共通して行う処理について説明する。
図9は、第1〜第3実施形態の暗号処理装置300が、個人鍵dと点Aからスカラ倍点V=dAを求める処理のフローチャートである。なお、前述のとおり、暗号処理装置300がスカラ倍点V=dAを求める目的は任意であり、換言すれば、結果処理部311がスカラ倍点Vをどのように利用するかということは任意である。
図9は、第1〜第3実施形態の暗号処理装置300が、個人鍵dと点Aからスカラ倍点V=dAを求める処理のフローチャートである。なお、前述のとおり、暗号処理装置300がスカラ倍点V=dAを求める目的は任意であり、換言すれば、結果処理部311がスカラ倍点Vをどのように利用するかということは任意である。
ステップS101で処理部301は、個人鍵格納部304から個人鍵dを読み出す。なお、個人鍵dのビット長uと乱数値sのビット長bとウィンドウサイズkの関係は、正整数mを用いて、式(8.4)のように表される。
u=b+km (8.4)
u=b+km (8.4)
したがって、個人鍵dは式(8.5)のとおりである。
d=d[u-1]||d[u-2]||…||d[1]||d[0]
=d[b+km-1]||d[b+km-2]||…||d[1]||d[0] (8.5)
d=d[u-1]||d[u-2]||…||d[1]||d[0]
=d[b+km-1]||d[b+km-2]||…||d[1]||d[0] (8.5)
次のステップS102で処理部301は前処理を行う。ステップS102における前処理は、後述のステップS109〜S111における後処理と対になっている。
具体的には、処理部301は、式(8.6)のように、MSBが0になるように個人鍵dを1ビット右シフトした値eを求める。式(8.6)を別の形式で表せば式(8.7)のとおりである。以下では式(8.6)と(8.7)により表される値eを、説明の便宜上「ダミー鍵」という。
e=0||d[u-1]||d[u-2]||…||d[1]
=0||d[b+km-1]||d[b+km-2]||…||d[1] (8.6)
e=0||d[u-1]||d[u-2]||…||d[1]
=0||d[b+km-1]||d[b+km-2]||…||d[1] (8.6)
なお、詳しくは後述するが、第1〜第3実施形態では、キャリー補正が行われる。最上位のウィンドウ値w[m−1]に対応して生じるキャリー補正値を適切に処理するためのテクニックはいくつかあり、ステップS102の前処理とステップS109〜S111の後処理の組み合わせは、それらのテクニックのうちの一つである。他のテクニックについては後述する。
式(8.6)の定義より、ダミー鍵eは個人鍵dと同じくuビットの長さであり、ダミー鍵eのMSBであるe[u−1]は必ず0である。MSBが0であるという性質が、後述のステップS106の処理の単純化に資するので、第1〜第3実施形態ではステップS102の前処理が行われる。
なお、処理部301は、ステップS102においてさらに、個人鍵dのLSBであるd[0]を補正部310に出力する。
次のステップS103では、乱数生成部305が乱数値sを生成し、生成した乱数値sを処理部301とスカラ倍算部307に出力する。そして、処理部301が、乱数値sを用いて、ダミー鍵eからウィンドウ列w[i]と乱数列s[i]と補正値cを生成する。ステップS103の詳細は、実施形態に応じて異なり、具体的には図11、19、24とともに後述する。
第1〜第3実施形態のいずれにおいても、処理部301はステップS103で、ウィンドウ列w[i]と乱数列s[i]と補正値cを、乱数値s[i]を+sまたは−sに決定しながら、式(8.8)が成立するという制約条件下で定める。
なお、式(8.8)は、式(8.1)と似ているが式(8.1)そのものとは異なる。式(8.8)は、ステップS102での前処理とステップS109〜S111の後処理の内容を反映している。
ここで、式(8.6)の定義より式(8.10)が成立する。また、式(8.8)は、式(8.10)に式(8.9)を代入して得られる。したがって、「式(8.8)と(8.10)が成立する」という制約条件は、「式(8.9)が成立する」という制約条件と同値である。
d=2e+d[0] (8.10)
d=2e+d[0] (8.10)
そして、処理部301(より詳しくは決定部303)は、決定したウィンドウ列w[i]と乱数列s[i]をウィンドウ演算部309に出力し、決定した補正値cを補正部310に出力する。
すると、次のステップS104で取得部306は、点Aのxy座標を取得し、スカラ倍算部307と補正部310に点Aのxy座標を出力する。
そして、次のステップS105でスカラ倍算部307は、実施形態に応じて適宜決められた所定範囲内の各インデックスhについて、乱数値sに応じたスカラ倍点情報(具体的には、ランダム化テーブルデータtab[h]=(2bh+s)A)を生成する。なお、乱数値sは、上記のとおり、ステップS103で乱数生成部305により生成されたときに、乱数生成部305からスカラ倍算部307にも出力されている。
そして、次のステップS105でスカラ倍算部307は、実施形態に応じて適宜決められた所定範囲内の各インデックスhについて、乱数値sに応じたスカラ倍点情報(具体的には、ランダム化テーブルデータtab[h]=(2bh+s)A)を生成する。なお、乱数値sは、上記のとおり、ステップS103で乱数生成部305により生成されたときに、乱数生成部305からスカラ倍算部307にも出力されている。
また、上記所定範囲とは、具体的には、第1実施形態では−2≦h≦2k−1+1であり、第2実施形態では−1≦h≦2k−1+1であり、第3実施形態では−1≦h≦2k−1である。
さらに、ステップS105でスカラ倍算部307は、インデックスhと対応づけてランダム化テーブルデータtab[h]をスカラ倍点情報格納部308に出力する。すると、スカラ倍点情報格納部308は、インデックスhと対応づけてランダム化テーブルデータtab[h]を格納する。
そして、次のステップS106でウィンドウ演算部309は、ウィンドウ列[i]と乱数列s[i]とランダム化テーブルデータtab[h]を用いて、図10に示す演算を実行し、計算結果を変数Vに格納する。以下、特に混乱のおそれはないので、変数Vが表す点を、点Vという。ウィンドウ演算部309は、図10の演算の終了後、変数Vの内容(すなわち点Vのxy座標)を補正部310に通知する。
また、次のステップS107では、補正部310が、補正値cと点Aのxy座標から、点cAのxy座標を計算する。ステップS107における計算は、第2比較例として説明した単純なウィンドウ法または第4比較例として説明した符号つきウィンドウ法によって行われる。
ステップS107におけるウィンドウサイズをqとすると、補正部310は、具体的には、2q個のエントリを有するローカルなテーブルを作成し、作成したテーブルのデータを使って、ウィンドウ法によって点cAのxy座標を計算する。あるいは、補正部310は、2q−1+1個のエントリを有するローカルなテーブルを作成し、作成したテーブルのデータを使って、符号つきウィンドウ法によって点cAのxy座標を計算する。ウィンドウサイズqは、式(8.4)に“k”として示したウィンドウサイズと同じでもよいし、ウィンドウサイズkと異なっていてもよい。
なお、ステップS107で単純なウィンドウ法または符号つきウィンドウ法が利用される理由は次のとおりである。
たとえ暗号処理装置300が同じ個人鍵dを用いて何度も図9の処理を行うとしても、補正値cは、図9の処理が実行されるたびに、乱数値sに応じてランダムに変化する。よって、点cAの計算は、DPA攻撃に対して安全である。また、上述のとおり、ウィンドウ法と符号つきウィンドウ法はSPA攻撃に対して安全である。よって、補正部310はウィンドウ法または符号つきウィンドウ法によって点cAを計算することで、SPA攻撃とDPA攻撃の双方に対する安全性を確保することができる。
たとえ暗号処理装置300が同じ個人鍵dを用いて何度も図9の処理を行うとしても、補正値cは、図9の処理が実行されるたびに、乱数値sに応じてランダムに変化する。よって、点cAの計算は、DPA攻撃に対して安全である。また、上述のとおり、ウィンドウ法と符号つきウィンドウ法はSPA攻撃に対して安全である。よって、補正部310はウィンドウ法または符号つきウィンドウ法によって点cAを計算することで、SPA攻撃とDPA攻撃の双方に対する安全性を確保することができる。
以上のようにして点cAを計算すると、補正部310は、次のステップS108において、ウィンドウ演算部309から通知された点Vに点cAを加算し、加算の結果を変数Vに格納する。ステップS103で得られたウィンドウ列w[i]と乱数列s[i]と補正値cは式(8.9)を満たすので、ステップS108の処理の結果として得られる点Vは、点eAである。
続くステップS109〜S111は、ステップS102の前処理に対応する後処理である。具体的には、ステップS109で補正部310は、点Vに対して2倍算を行い、結果として得られた点2Vを新たに変数Vに格納する。
そして、次のステップS110で補正部310は、処理部301から通知されたビット値d[0]が1であるか否かを判断する。もし、d[0]=1であれば、処理はステップS111に移行する。逆に、d[0]=0であれば、処理はステップS112に移行する。
ステップS111で補正部310は、点Vに点Aを加算し、加算の結果を変数Vに格納する。
なお、ステップS109〜S111の後処理の意味を補足すると、次のとおりである。式(8.10)より式(8.11)が成り立つ。
dA=(2e+d[0])A=2(eA)+d[0]A (8.11)
なお、ステップS109〜S111の後処理の意味を補足すると、次のとおりである。式(8.10)より式(8.11)が成り立つ。
dA=(2e+d[0])A=2(eA)+d[0]A (8.11)
そして、上記のとおりステップS108が終了した時点での点Vは、V=eAである。よって、ステップS109の2倍算の結果として得られる点Vは、V=2(eA)である。
また、式(1.7)のスカラ倍算の定義より、d[0]=0のとき、点d[0]Aは無限遠点Oであり、式(1.3)に示すように無限遠点Oは零元である。よって、d[0]=0のときは、式(8.11)より、ステップS109で得られた点V=2(eA)がすなわち点dAである。そのため、上記のステップS110でd[0]=0と判断された場合、ステップS111の加算は不要であるから処理はステップS110からステップS112へと進む。
他方、d[0]=1のとき、点d[0]Aとは点A自身である。よって、d[0]=1のときは、式(8.11)より、ステップS109で得られた点V=2(eA)に点Aを加算した点が、点dAである。そのため、上記のステップS110でd[0]=1と判断された場合、ステップS111で点Aの加算が行われ、その後、処理がステップS112へ進む。
最後に、ステップS112で補正部310は、点Vのxy座標を結果処理部311に出力する。こうして出力される点Vは、V=dAなる点である。
以上で図9の処理は終了するが、図9のステップの実行順序は実施形態に応じて、適宜変更されてもよい。例えば、ステップS104での点Aの取得は、ステップS105の前でありさえすれば、いつでもよい。また、ステップS106とS107の実行順序は逆でもよいし、ステップS106とS107が並行して実行されてもよい。
また、前述のとおりステップS103の処理は乱数値sの生成を含むが、乱数値sが生成されてスカラ倍算部307に出力された後では、ステップS103の残りの部分とステップS105が並行して実行されてもよい。さらに、もし、乱数値sの生成後、ステップS105が完了した後もまだステップS103の処理が続く場合には、ステップS103と並行してステップS106が実行されてもよい。例えば、ウィンドウ演算部309がステップS106でウィンドウ値w[i]と乱数値s[i]を用いて処理を行うのと並行して、処理部301がステップS103でウィンドウ値w[i−M]と乱数値s[i−M]を求めてもよい(ただしM≧2である)。
さて、図10は、第1〜第3実施形態の暗号処理装置が、決定したウィンドウ列w[i]および乱数列s[i]、ならびに生成したスカラ倍点情報を利用して行う演算のフローチャートである。すなわち、図10は、図9のステップS106の処理のフローチャートである。なお、具体的なデータが図10の処理によってどのように処理されるのかについては、図13、21、26とともに後述する。
さて、ステップS201でウィンドウ演算部309は、変数Vを無限遠点Oに初期化する。
そして、次のステップS202でウィンドウ演算部309は、ループ変数iを(m−1)に初期化する。すなわち、ウィンドウ演算部309は、最上位のウィンドウ値w[m−1]に注目する。
そして、次のステップS202でウィンドウ演算部309は、ループ変数iを(m−1)に初期化する。すなわち、ウィンドウ演算部309は、最上位のウィンドウ値w[m−1]に注目する。
続いて、ステップS203でウィンドウ演算部309は、2倍算の回数を数えるためのループ変数jを1に初期化する。
そして、次のステップS204でウィンドウ演算部309は、変数Vの示す点Vに対して2倍算を行い、2倍算の結果を変数Vに格納する。
そして、次のステップS204でウィンドウ演算部309は、変数Vの示す点Vに対して2倍算を行い、2倍算の結果を変数Vに格納する。
次のステップS205でウィンドウ演算部309は、変数jの値がウィンドウサイズkと等しいか否かを判断する。そして、j≠kの場合(すなわちj<kの場合)、処理はステップS206に移行し、j=kの場合、処理はステップS207に移行する。
ステップS206でウィンドウ演算部309は、変数jの値を1だけインクリメントする。そして、処理はステップS204に戻る。以上のステップS203〜S206の処理は、2倍算をk回連続して行う処理である。
また、ステップS207でウィンドウ演算部309は、乱数値s[i]が乱数値sと等しいか否かを判断する。なお、図9のステップS103に関して説明したように、各乱数値s[i]は+sまたは−sであるから、ステップS207の判断は、換言すれば、「s[i]=+sかそれともs[i]=−sか」という判断である。
乱数値sが0以上に限定されている実施形態では、ウィンドウ演算部309は、乱数値s[i]の符号を参照して「符号が正を示していればs[i]=+sであり、符号が負を示していればs[i]=−sである」と判断してもよい。また、負の乱数値sを利用する実施形態でも、ウィンドウ演算部309は、乱数値sの符号と乱数値s[i]の符号を比較するだけで、乱数値s[i]が乱数値sと等しいか否かを判断することができる。
そして、s[i]=+sの場合、処理はステップS208に移行し、s[i]=−sの場合、処理はステップS209に移行する。
ステップS208でウィンドウ演算部309は、ウィンドウ値w[i]をインデックスとして用いてスカラ倍点情報格納部308を参照し、ウィンドウ値w[i]に対応するテーブルデータtab[w[i]]を得る。そして、ウィンドウ演算部309は、点Vにテーブルデータtab[w[i]]が表す点を加算し、加算結果を新たな点Vとして記憶する。
ステップS208でウィンドウ演算部309は、ウィンドウ値w[i]をインデックスとして用いてスカラ倍点情報格納部308を参照し、ウィンドウ値w[i]に対応するテーブルデータtab[w[i]]を得る。そして、ウィンドウ演算部309は、点Vにテーブルデータtab[w[i]]が表す点を加算し、加算結果を新たな点Vとして記憶する。
すなわち、ステップS208でウィンドウ演算部309は、式(8.12)の演算を行う。そして、処理はステップS210へ移行する。
V=V+tab[w[i]] (8.12)
V=V+tab[w[i]] (8.12)
また、ステップS209でウィンドウ演算部309はウィンドウ値w[i]の符号を反転させた値−w[i]をインデックスとして用いてスカラ倍点情報格納部308を参照し、テーブルデータtab[−w[i]]を得る。そして、ウィンドウ演算部309は、テーブルデータtab[−w[i]]が表す点を点Vから減算し、減算結果を新たな点Vとして記憶する。換言すれば、ウィンドウ演算部309は、テーブルデータtab[−w[i]]が表す点の逆元を計算し、計算した逆元を点Vに加算し、加算結果を新たな点Vとして記憶する。
すなわち、ステップS209でウィンドウ演算部309は、式(8.13)の演算を行う。そして、処理はステップS210へ移行する。
V=V-tab[-w[i]] (8.13)
ステップS210でウィンドウ演算部309は、ループ変数iの値を1だけデクリメントする。そして、処理はステップS211に移行する。
V=V-tab[-w[i]] (8.13)
ステップS210でウィンドウ演算部309は、ループ変数iの値を1だけデクリメントする。そして、処理はステップS211に移行する。
ステップS211でウィンドウ演算部309は、ループ変数iの値が0以上であるか否かを判断する。そして、i≧0の場合、まだ最下位のウィンドウ値w[i]と乱数値s[i]の組まで注目し終わっていないので、処理はステップS203に戻る。他方、i<0の場合(つまりi=−1の場合)、既にすべてのウィンドウ値w[i]と乱数値s[i]の組に注目し終わっているので、処理はステップS212に移行する。
ステップS212でウィンドウ演算部309は、点Vを返り値として補正部310に出力する。そして、図10の処理は終了する。
続いて、第1実施形態について説明する。第1実施形態に関しては、まず、図9のステップS103に相当する図11の処理を説明する。続いて、個人鍵dと乱数値sの数値例を含む図12A〜13を参照して、図9〜11の処理の具体例を説明する。図11の各ステップの意味などについては、図14〜16を参照して後述する。
続いて、第1実施形態について説明する。第1実施形態に関しては、まず、図9のステップS103に相当する図11の処理を説明する。続いて、個人鍵dと乱数値sの数値例を含む図12A〜13を参照して、図9〜11の処理の具体例を説明する。図11の各ステップの意味などについては、図14〜16を参照して後述する。
図11は、第1実施形態において暗号処理装置300がウィンドウ列w[i]と乱数列s[i]と補正値cを決定する処理のフローチャートである。すなわち、図11は、第1実施形態における、図9のステップS103のフローチャートである。
ステップS301で判断部302は、式(9.1)に示すように、符号つき(k+b)ビット値dHを初期化する。すなわち、判断部302は、処理部301が得たダミー鍵eの先頭の(k+b)ビットを、符号つき(k+b)ビット値dHとして設定する。
dH=e[b+km-1]||…||e[k(m-1)] (9.1)
dH=e[b+km-1]||…||e[k(m-1)] (9.1)
次のステップS302で乱数生成部305は、bビットの乱数値sを生成し、乱数値sを処理部301とスカラ倍算部307に出力する。なお、説明の簡単化のため、第1実施形態では0≦sとする。乱数値sが負の場合については、第1実施形態の変形例として後述する。よって、ステップS302で生成される乱数値sは式(9.2)を満たす。
0≦s≦2b-1 (9.2)
0≦s≦2b-1 (9.2)
次のステップS303で処理部301は、ループ変数iを(m−1)に初期化する。そして、処理はステップS304に移行する。
ステップS304で処理部301内の判断部302は、判断基準値(dH−s)の値を計算し、計算した値が下記の範囲R1〜R4のいずれに含まれるかを判断し、判断結果を決定部303に通知する。
・範囲R1:−2k+b−1以下
・範囲R2:(−2k+b−1+1)以上−1以下
・範囲R3:0以上(2k+b−1−1)以下
・範囲R4:2k+b−1以上
ステップS304で処理部301内の判断部302は、判断基準値(dH−s)の値を計算し、計算した値が下記の範囲R1〜R4のいずれに含まれるかを判断し、判断結果を決定部303に通知する。
・範囲R1:−2k+b−1以下
・範囲R2:(−2k+b−1+1)以上−1以下
・範囲R3:0以上(2k+b−1−1)以下
・範囲R4:2k+b−1以上
そして、判断基準値(dH−s)が範囲R1に含まれるとき、処理はステップS305に移行し、判断基準値(dH−s)が範囲R2に含まれるとき、処理はステップS308に移行する。また、判断基準値(dH−s)が範囲R3に含まれるとき、処理はステップS310に移行し、判断基準値(dH−s)が範囲R4に含まれるとき、処理はステップS312に移行する。ステップS304における判断の意味については、図15〜16とともに後述する。
ここで、範囲R1とR2の境界値−2k+b−1を範囲R1とR2のいずれに含めるか、範囲R2とR3の境界値0を範囲R2とR3のいずれに含めるか、範囲R3とR4の境界値2k+b−1を範囲R3とR4のいずれに含めるかは、実施形態に応じて任意である。しかし、好ましい定義は、上記のとおりである。なぜなら、上記のように範囲R1〜R4を定義することで、以下のような処理の簡略化が可能となり、処理が簡略化される分、判断部302がステップS304を実行するのにかかる時間が短縮化されるという効果が得られるからである。
すなわち、ステップS304の処理の簡略化のため、判断部302は、判断基準値(dH−s)の符号と(k+b−1)番目のビット(すなわちMSB)の値をチェックすることで、判断基準値(dH−s)がどの範囲に含まれるかを判断してもよい。
具体的には、判断基準値(dH−s)は、符号が負でMSBの値が1ならば、範囲R1に含まれる。また、判断基準値(dH−s)は、符号が負でMSBの値が0ならば、範囲R2に含まれる。そして、判断基準値(dH−s)は、符号が正でMSBの値が0ならば、範囲R3に含まれる。また、判断基準値(dH−s)は、符号が正でMSBの値が1ならば、範囲R4に含まれる。
なお、第1実施形態では、個人鍵dではなくダミー鍵eに対して図11の処理が行われる。そして、ダミー鍵eは、符号なしの正の値である個人鍵dから式(8.6)のようにして得られた値なので、0≦e[b+km-1]||…||e[k(m-1)]=0||…||e[k(m-1)]≦2k+b−1−1である。よって、判断基準値(dH−s)の定義から、i=m−1の場合、判断基準値(dH−s)は、範囲R2またはR3に含まれる。よって、後述のステップS307またはS314におけるキャリー補正は、i=m−1の場合には生じない。
第1実施形態は、以上のようにi=m−1の場合のキャリー補正が生じないように保証することで、図9のステップS106に相当する図10の処理を簡略化するように設計されている。すなわち、i=m−1の場合のキャリー補正が生じないと保証されていると、図10のステップS201の初期化が、変数Vを無限遠点Oに設定するという単純な処理で済む。
換言すれば、第1実施形態では、ダミー鍵eを使うことで、最上位のウィンドウ値w[m−1]に対応するキャリー補正値が0になることが保証される。そして、その保証のもとでは、最上位のキャリー補正値に関する処理として妥当なのは、「何もしない」ということである。こうして、第1実施形態では、ダミー鍵eの導入にともなう図9のステップS102の前処理とステップS109〜S111の後処理により、キャリー補正値の適切な取り扱いが実現される。
さて、ステップS305で決定部303は、乱数値s[i]を+sと決定する。また、次のステップS306で決定部303は、ウィンドウ補正値t[i]を+2k+bと決定する。
そして、続くステップS307で決定部303は、ウィンドウ補正値t[i]=2k+bの影響を相殺するために、1つ上位のウィンドウ値w[i+1]に対するキャリー補正を行う。すなわち、決定部303は、ウィンドウ値w[i+1]を1だけデクリメントする。
以上のステップS305〜S307の実行順序は任意に入れ換えられてもよく、ステップS305〜S307は並列に実行されてもよい。ステップS305〜S307の実行後、処理はステップS315に移行する。
また、ステップS308で決定部303は、乱数値s[i]を−sと決定する。次のステップS309で決定部303は、ウィンドウ補正値t[i]を0と決定する。
なお、ステップS308とS309の実行順序は入れ換えられてもよく、ステップS308とS309は並列に実行されてもよい。ステップS308とS309の実行後、処理はステップS315に移行する。
なお、ステップS308とS309の実行順序は入れ換えられてもよく、ステップS308とS309は並列に実行されてもよい。ステップS308とS309の実行後、処理はステップS315に移行する。
また、ステップS310で決定部303は、乱数値s[i]を+sと決定する。次のステップS311で決定部303は、ウィンドウ補正値t[i]を0と決定する。
なお、ステップS310とS311の実行順序は入れ換えられてもよく、ステップS310とS311は並列に実行されてもよい。ステップS310とS311の実行後、処理はステップS315に移行する。
なお、ステップS310とS311の実行順序は入れ換えられてもよく、ステップS310とS311は並列に実行されてもよい。ステップS310とS311の実行後、処理はステップS315に移行する。
また、ステップS312で決定部303は、乱数値s[i]を−sと決定する。次のステップS313で決定部303は、ウィンドウ補正値t[i]を−2k+bと決定する。
そして、続くステップS314で決定部303は、ウィンドウ補正値t[i]=−2k+bの影響を相殺するために、1つ上位のウィンドウ値w[i+1]に対するキャリー補正を行う。すなわち、決定部303は、ウィンドウ値w[i+1]を1だけインクリメントする。
そして、続くステップS314で決定部303は、ウィンドウ補正値t[i]=−2k+bの影響を相殺するために、1つ上位のウィンドウ値w[i+1]に対するキャリー補正を行う。すなわち、決定部303は、ウィンドウ値w[i+1]を1だけインクリメントする。
以上のステップS312〜S314の実行順序は任意に入れ換えられてもよく、ステップS312〜S314は並列に実行されてもよい。ステップS312〜S314の実行後、処理はステップS315に移行する。
そして、ステップS315では、決定部303が、式(9.3)に示す符号つき(k+b)ビット値である補正済み差分値diffを計算する。また、決定部303は、補正済み差分値diffを判断部302にフィードバックする。
diff=dH-s[i]+t[i] (9.3)
diff=dH-s[i]+t[i] (9.3)
続くステップS316で決定部303は、補正済み差分値diffの上位kビットをウィンドウ値w[i]として設定する。すなわち、ウィンドウ値w[i]は式(9.4)のとおりである。なお、符号つきNビット値の定義より、ウィンドウ値w[i]の符号は、補正済み差分値diffの符号に等しい。
w[i]=diff[k+b-1]||…||diff[b] (9.4)
w[i]=diff[k+b-1]||…||diff[b] (9.4)
その後、ステップS317で処理部301は、ループ変数iの値が0か否かを判断する。ループ変数iの値が0でない場合(すなわちi>0の場合)、処理はステップS318に移行する。他方、ループ変数iの値が0の場合、処理はステップS319に移行する。
ステップS318で判断部302は、補正済み差分値diffの下位bビットを取り出し、取り出した符号つきbビット値の2k倍にダミー鍵eの(ki−1)ビット目からk(i−1)ビット目までのkビットを足した値を計算する。そして、判断部302は、計算した値を新たに符号つき(k+b)ビット値dHとして記憶する。すなわち、判断部302は、次の判断に備えて、式(9.5)にしたがって符号つき(k+b)ビット値dHを更新する。
dH=(diff[b-1]||…||diff[0])2k+(e[ki-1]||…||e[k(i-1)]) (9.5)
dH=(diff[b-1]||…||diff[0])2k+(e[ki-1]||…||e[k(i-1)]) (9.5)
また、ステップS319で判断部302は、補正済み差分値diffの下位bビットを新たに符号つき(k+b)ビット値dHとして記憶する。すなわち、判断部302は、式(9.6)にしたがって符号つき(k+b)ビット値dHを更新する。
dH=diff[b-1]||…||diff[0] (9.6)
dH=diff[b-1]||…||diff[0] (9.6)
ステップS318またはステップS319での符号つき(k+b)ビット値dHの更新後、処理はステップS320に移行する。そして、ステップS320で処理部301は、ループ変数iを1だけデクリメントする。
また、次のステップS321で処理部301は、ループ変数iが0以上か否かを判断する。そして、i≧0の場合、処理はステップS304に戻り、i<0の場合、処理はステップS322に移行する。
ステップS322で判断部302は、式(9.6)により得た符号つき(k+b)ビット値dHを決定部303に通知する。すると、決定部303は、式(9.7)に示すように、符号つき(k+b)ビット値dHを補正値cとして決定する。
c=dH (9.7)
c=dH (9.7)
そして、次のステップS323で決定部303は、決定したウィンドウ列w[i]と乱数列s[i]をウィンドウ演算部309に出力し、決定した補正値cを補正部310に出力する。以上で図11の処理は終了する。
続いて、具体的な数値を例として図12A〜12Bを参照して、第1実施形態についてさらに詳しく説明する。
図9のステップS102で処理部301が得たダミー鍵eが、式(9.8)に示す15ビットの値であるとする。なお、式(9.8)に対応する個人鍵dの具体例は、図13とともに後述する。
e=(010110010010101)2=11413 (9.8)
図9のステップS102で処理部301が得たダミー鍵eが、式(9.8)に示す15ビットの値であるとする。なお、式(9.8)に対応する個人鍵dの具体例は、図13とともに後述する。
e=(010110010010101)2=11413 (9.8)
続いて、図9のステップS103に相当する図11の処理が開始される。なお、図12A〜12Bの例では、ウィンドウサイズkは3であり、乱数値sのビット長bは6であるとする。したがって、式(9.9)のとおりm=3である。
m=(u-b)/k=(15-6)/3=3 (9.9)
m=(u-b)/k=(15-6)/3=3 (9.9)
図11の処理が開始されると、ステップS301で判断部302は、式(9.10)のように符号つき(k+b)ビット値dHを初期化する。
dH=e[14]||…||e[6]=(010110010)2=178 (9.10)
dH=e[14]||…||e[6]=(010110010)2=178 (9.10)
また、ステップS302で乱数生成部305が、b(=6)ビットの乱数値sとして式(9.11)の値を生成したとする。
s=(001101)2=13 (9.11)
すると、続くステップS303では、処理部301が式(9.9)よりループ変数iを2(=m−1)に初期化する。そして、ステップS304で判断部302は、式(9.10)と(9.11)より、判断基準値(dH−s)を式(9.12)のとおり計算する。
dH-s=178-13=165=(010100101)2=(010 || 100101)2 (9.12)
s=(001101)2=13 (9.11)
すると、続くステップS303では、処理部301が式(9.9)よりループ変数iを2(=m−1)に初期化する。そして、ステップS304で判断部302は、式(9.10)と(9.11)より、判断基準値(dH−s)を式(9.12)のとおり計算する。
dH-s=178-13=165=(010100101)2=(010 || 100101)2 (9.12)
式(9.12)の判断基準値(dH−s)は正である。また、判断基準値(dH−s)のMSBは0である。よって、判断基準値(dH−s)は範囲R3に属する。
よって、決定部303は、ステップS310で乱数値s[2]を式(9.13)のとおり+sに決定し、ステップS311でウィンドウ補正値t[2]を式(9.14)のとおり0に決定する。また、ウィンドウ補正値t[2]が0なので、キャリー補正は行われない。
s[2]=+s=13=(001101)2 (9.13)
t[2]=0=(0000000000)2 (9.14)
s[2]=+s=13=(001101)2 (9.13)
t[2]=0=(0000000000)2 (9.14)
そして、ステップS315で決定部303は、式(9.3)にしたがい、具体的には式(9.15)のようにして、補正済み差分値diffを計算する。
diff=dH-s[2]+t[2]
=178-13+0
=165
=2×26+37
=(010100101)2
=(010 || 100101)2 (9.15)
diff=dH-s[2]+t[2]
=178-13+0
=165
=2×26+37
=(010100101)2
=(010 || 100101)2 (9.15)
さらに、ステップS316で決定部303は、式(9.16)のようにウィンドウ値w[2]を計算する。なお、ここで得られるウィンドウ値w[2]は、まだ確定していない。なぜなら、後にループ変数iが1となった段階で、キャリー補正によってウィンドウ値w[2]がインクリメントまたはデクリメントされる潜在的可能性があるからである。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (9.16)
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (9.16)
また、i=2なので、処理がステップS318に進む。ステップS318で判断部302は、式(9.5)にしたがい、具体的には式(9.17)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=37×23+(010)2
=296+2
=298
=(100101010)2 (9.17)
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=37×23+(010)2
=296+2
=298
=(100101010)2 (9.17)
その後、ステップS320で処理部301がループ変数iをデクリメントするのでi=1となる。そして、i≧0なので処理はステップS321からステップS304に戻る。
ステップS304では、判断部302が、式(9.17)のように更新された符号つき(k+b)ビット値dHを用いて、判断基準値(dH−s)を式(9.18)のとおり計算する。
dH-s=298-13=285=(100 || 011101)2 (9.18)
式(9.18)の判断基準値(dH−s)は、正であり、MSBが1である。よって、判断基準値(dH−s)は範囲R4に属する。
dH-s=298-13=285=(100 || 011101)2 (9.18)
式(9.18)の判断基準値(dH−s)は、正であり、MSBが1である。よって、判断基準値(dH−s)は範囲R4に属する。
よって、決定部303は、ステップS312で乱数値s[1]を式(9.19)のとおり−sに決定し、ステップS313でウィンドウ補正値t[1]を式(9.20)のとおり−2k+bに決定する。
s[1]=-s=-13=-(001101)2 (9.19)
t[1]=-23+6=-512=-(1000000000)2 (9.20)
s[1]=-s=-13=-(001101)2 (9.19)
t[1]=-23+6=-512=-(1000000000)2 (9.20)
そして、ウィンドウ補正値t[1]が非ゼロなので、ステップS314で決定部303はキャリー補正を行う。すなわち、決定部303は、式(9.16)で求めたウィンドウ値w[2]に1を足す。その結果、ウィンドウ値w[2]は式(9.21)の値に確定する。
w[2]=2+1=3 (9.21)
w[2]=2+1=3 (9.21)
さらに、ステップS315で決定部303は、式(9.3)にしたがい、具体的には式(9.22)のようにして、補正済み差分値diffを計算する。
diff=dH-s[1]+t[1]
=298+13-512
=-201
=-3×26-9
=-(011001001)2
=-(011 || 001001)2 (9.22)
diff=dH-s[1]+t[1]
=298+13-512
=-201
=-3×26-9
=-(011001001)2
=-(011 || 001001)2 (9.22)
さらに、ステップS316で決定部303は、式(9.23)のようにウィンドウ値w[1]を計算する。なお、ここで得られるウィンドウ値w[1]は、後にキャリー補正される潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3 (9.23)
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3 (9.23)
また、i=1なので処理がステップS318に進む。そして、ステップS318で判断部302は、式(9.5)にしたがい、具体的には式(9.24)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-9×23+(101)2
=-72+5
=-67
=-(001000011)2 (9.24)
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-9×23+(101)2
=-72+5
=-67
=-(001000011)2 (9.24)
その後、ステップS320で処理部301がループ変数iをデクリメントするのでi=0となる。そして、i≧0なので処理はステップS321からステップS304に戻る。
ステップS304では、判断部302が、式(9.24)のように更新された符号つき(k+b)ビット値dHを用いて、判断基準値(dH−s)を式(9.25)のとおり計算する。
dH-s=-67-13=-80=-(001 || 010000)2 (9.25)
式(9.25)の判断基準値(dH−s)は、負であり、MSBが0である。よって、符号つき(k+b)ビット値dHは範囲R2に属する。
dH-s=-67-13=-80=-(001 || 010000)2 (9.25)
式(9.25)の判断基準値(dH−s)は、負であり、MSBが0である。よって、符号つき(k+b)ビット値dHは範囲R2に属する。
よって、決定部303は、ステップS308で乱数値s[0]を式(9.26)のとおり−sに決定し、ステップS309でウィンドウ補正値t[0]を式(9.27)のとおり0に決定する。
s[0]=-s=-13=-(001101)2 (9.26)
t[0]=0=(0000000000)2 (9.27)
s[0]=-s=-13=-(001101)2 (9.26)
t[0]=0=(0000000000)2 (9.27)
なお、ウィンドウ補正値t[0]が0なので当然キャリー補正も行われない。換言すれば、決定部303は、キャリー補正値を暗黙的に0に設定している。よって、1つ上位のウィンドウ値w[1]は、式(9.23)に示した−3という値に確定する。
さらに、ステップS315で決定部303は、式(9.3)にしたがい、具体的には式(9.28)のようにして、補正済み差分値diffを計算する。
diff=dH-s[0]+t[0]
=-67+13+0
=-54
=-(000 || 110110)2 (9.28)
diff=dH-s[0]+t[0]
=-67+13+0
=-54
=-(000 || 110110)2 (9.28)
さらに、ステップS316で決定部303は、式(9.29)のようにウィンドウ値w[0]を計算する。なお、ウィンドウ値w[0]は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0 (9.29)
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0 (9.29)
また、i=0なので処理がステップS319に進む。そして、ステップS319で判断部302は、式(9.6)にしたがい、具体的には式(9.30)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])=-(110110)2=-54 (9.30)
dH=(diff[5]||…||diff[0])=-(110110)2=-54 (9.30)
その後、ステップS320で処理部301がループ変数iをデクリメントするのでi=−1となる。よって、i<0なので処理はステップS321からステップS322に進む。したがって、ステップS322で決定部303は、式(9.31)のとおり補正値cを得る。
c=dH=-54 (9.31)
c=dH=-54 (9.31)
最後に、ステップS323で決定部303は、式(9.32)に示すウィンドウ列w[i]と、式(9.33)に示す乱数列s[i]をウィンドウ演算部309に出力し、式(9.31)に示す補正値cを補正部310に出力する。式(9.32)は、式(9.21)、(9.23)、(9.29)から明らかであり、式(9.33)は、式(9.13)、(9.19)、(9.26)から明らかである。
w[2]= 3, w[1]= -3, w[0]= 0 (9.32)
s[2]=13, s[1]=-13, s[0]=-13 (9.33)
w[2]= 3, w[1]= -3, w[0]= 0 (9.32)
s[2]=13, s[1]=-13, s[0]=-13 (9.33)
以上のようにして、図9のステップS103に相当する図11の処理が終了すると、図9のステップS104で取得部306が点Aのxy座標を取得する。そして、ステップS105でスカラ倍算部307が、−2≦h≦2k−1+1=5なる範囲の各インデックスhについて、乱数s=13(式(9.11)参照)に応じたスカラ倍点情報として、式(9.34)のランダム化テーブルデータtab[h]を生成する。
tab[h]=(2bh+s)A=(26h+13)A=(64h+13)A (9.34)
tab[h]=(2bh+s)A=(26h+13)A=(64h+13)A (9.34)
そして、スカラ倍点情報格納部308は、生成されたランダム化テーブルデータtab[h]を、インデックスhと対応づけて格納する。
図13は、以上のようにして得られた、ウィンドウ列w[i]と乱数列s[i]と補正値cを示すとともに、スカラ倍点情報格納部308がランダム化テーブルデータtab[h]を保持するテーブル104を示す図である。
図11〜12Bを参照して上記で説明した処理によれば、図13に示すとおり、式(8.9)が成立する。具体的には、図12A〜12Bの例におけるk=3、b=6、m=3、e=11413という値および式(9.31)〜(9.33)に示した値を式(8.9)の各変数に代入すると、下記の式(9.35)が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-54+64×0+1×(-13)+512×(-3)+8×(-13)+4096×3+64×13
=11413 (9.35)
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-54+64×0+1×(-13)+512×(-3)+8×(-13)+4096×3+64×13
=11413 (9.35)
また、式(9.34)に示したように、図13のテーブル104には、−2≦h≦5なる範囲の各インデックスhに対応して、それぞれ、スカラ倍点−115A、−51A、13A、77A、141A、205A、269A、333Aのxy座標が記憶されている。
よって、図9のステップS106に相当する図10の処理と、図9のステップS107〜S111により、式(9.36)のようにスカラ倍点dAのxy座標が計算される。
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A (9.36)
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A (9.36)
すなわち、式(9.36)における無限遠点Oは、図10のステップS201の初期化に対応する。また、式(9.36)における“23”は、図10のステップS203〜S206で行われるk(=3)回の2倍算に対応する。
そして、式(9.33)よりs[2]=+sなので、i=2のときステップS208が実行され、このことが式(9.36)における“+tab[w[2]]”に対応する。同様に、式(9.33)よりs[1]=−sなので、i=1のときステップS209が実行され、このことが式(9.36)における“−tab[−w[1]]”に対応する。そして、式(9.33)よりs[0]=−sなので、i=0のときステップS209が実行され、このことが式(9.36)における“−tab[−w[0]]”に対応する。
そして、式(9.36)における“+cA”は、図9のステップS107〜S108に対応する。そして、式(9.36)の右辺の最初の“2”は、図9のステップS109の2倍算に対応し、式(9.36)の“+d[0]A”は、図9のステップS110〜S111に対応する。
なお、この式(9.36)の右辺において、ステップS109の2倍算の対象を示す部分を変形すると、次の式(9.37)が得られる。式(9.37)も、第1実施形態において式(8.9)が成立することを示している。
23(23(23(O)+tab[3])-tab[3])-tab[0]+cA
=8(8(O+205A)-205A)-13A-54A
=8(1640A-205A)-67A
=8(1435A)-67A
=11413A (9.37)
23(23(23(O)+tab[3])-tab[3])-tab[0]+cA
=8(8(O+205A)-205A)-13A-54A
=8(1640A-205A)-67A
=8(1435A)-67A
=11413A (9.37)
そして、図13に例示するように、式(9.8)のダミー鍵eは、式(9.38)または(9.39)に示す個人鍵dから得られる。図13には、例として、式(9.38)の個人鍵dを示してある。
d=(101100100101010)2=22826 (9.38)
d=(101100100101011)2=22827 (9.39)
d=(101100100101010)2=22826 (9.38)
d=(101100100101011)2=22827 (9.39)
個人鍵dが式(9.38)で示される場合、式(9.38)よりd[0]=0なので、式(9.37)を式(9.36)の右辺に代入すると、式(9.40)が得られる。
2(11413A)+d[0]A=22826A+O=22826A=dA (9.40)
2(11413A)+d[0]A=22826A+O=22826A=dA (9.40)
また、個人鍵dが式(9.39)で示される場合、式(9.39)よりd[0]=1なので、式(9.37)を式(9.36)の右辺に代入すると、式(9.41)が得られる。
2(11413A)+d[0]A=22826A+A=22827A=dA (9.41)
2(11413A)+d[0]A=22826A+A=22827A=dA (9.41)
以上から、第1実施形態によれば、図9〜11に示した処理により、確かに所望の点dAが得られる。
さて、第1実施形態では、図9のステップS105に関して説明したとおり、スカラ倍点情報格納部308に格納されるスカラ倍点情報tab[h]に対応するインデックスhの範囲は、−2≦h≦2k−1+1である。よって、第1実施形態において、スカラ倍点情報格納部308が有するテーブルのエントリ数は、(2k−1+4)個である。
図14は、ウィンドウサイズkが3の場合のテーブルデータのエントリ数に関して、第1実施形態と第3の比較例と第4の比較例を比べる図である。
図14において、テーブル105は、第1実施形態においてスカラ倍点情報格納部308がスカラ倍点情報を記憶するためのテーブルである。k=3なので、テーブル105には、−2≦h≦23−1+1=5なる各インデックスhについて、テーブルデータtab[h]として点(h×2b+s)Aのxy座標が格納されている。つまり、テーブル105のエントリ数は8個である。
図14において、テーブル105は、第1実施形態においてスカラ倍点情報格納部308がスカラ倍点情報を記憶するためのテーブルである。k=3なので、テーブル105には、−2≦h≦23−1+1=5なる各インデックスhについて、テーブルデータtab[h]として点(h×2b+s)Aのxy座標が格納されている。つまり、テーブル105のエントリ数は8個である。
また、テーブル106は、第4の比較例として説明した符号つきウィンドウ法においてウィンドウサイズkが3の場合のテーブルである。テーブル106には、0≦h≦23−1=4なる各インデックスhについて、テーブルデータtab[h]として点hAのxy座標が格納されている。つまり、テーブル106のエントリ数は5個である。
また、テーブル107は、第3の比較例として説明したランダム化ウィンドウ法においてウィンドウサイズkが3の場合のテーブルである。テーブル107には、0≦h≦23−1=7なる各インデックスhについて、テーブルデータtab[h]として点(h×2b+s)Aのxy座標が格納されている。つまり、テーブル107のエントリ数は8個である。
以上のテーブル105〜107を比較すると、符号つきウィンドウ法のテーブル106は、エントリ数がテーブル105より少ない点で有利だが、符号つきウィンドウ法には、DPA攻撃に対して脆弱であるという欠点がある。それに対し、第1実施形態によるテーブル105は、テーブル106と比較すると、h=−2、h=−1、h=2k−1+1という3つのインデックスに対応する3つのエントリが多い。しかし、第1実施形態は、DPA攻撃に対しても安全な方法を提供するという点で、符号つきウィンドウ法よりも優れている。また、エントリ数が2k−1のオーダであるという点では、第1実施形態によるテーブル105は、テーブル106と同じである。
また、ランダム化ウィンドウ法のテーブル107のエントリ数は2kのオーダである。上記のようにk=3の場合にはテーブル106と107のエントリ数は同じだが、k≧4の場合は、オーダの違いの影響で、第1実施形態のテーブルのエントリ数はランダム化ウィンドウ法のテーブルのエントリ数よりも小さい。よって、第1実施形態は、PA攻撃に対する安全性とメモリ使用量の抑制をともに実現するという優れた効果を有する。
ところで、テーブル106と比べてテーブル105で増加している3つのエントリ、すなわち、h=−2、h=−1、h=2k−1+1という3つのインデックスに対応するエントリは、乱数により生じる誤差を吸収する役割を果たす。以下では、なぜスカラ倍点情報のインデックスhの範囲が−2≦h≦2k−1+1であるのかという理由を、図11のステップS304の判断の意味とともに、図15〜16を参照しながら説明する。
上記のとおり、図11のステップS304で決定部303は、判断基準値(dH−s)を計算する。この判断基準値(dH−s)の計算は、意味的には、「乱数値s[i]が+sである」という仮定の下でウィンドウ値w[i]を見積もることに相当する。その理由は次のとおりである。
前処理を考慮して、図4における個人鍵dをダミー鍵eに置き換えたうえで図4を解釈すると、符号つき(k+b)ビット値dHは、図4の(w[i]||s[i])に相当する。よって、ウィンドウ値w[i]は、符号つき(k+b)ビット値dHから乱数値s[i]を引いた値の上位kビットである。したがって、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、符号つき(k+b)ビット値dHから乱数値sを引いた判断基準値(dH−s)の上位kビットである。
そして、第1実施形態では、図3に示すように、処理部301はウィンドウ値w[i]の絶対値を2k−1以下にしようとし、それにより、スカラ倍点情報格納部308のメモリ消費量の抑制が図られる。そこで、第1実施形態の処理部301は、具体的には、「乱数値s[i]が+sである」という仮定の下でウィンドウ値w[i]を見積もり、見積もったウィンドウ値w[i]に応じて、仮定が妥当であるか否かを判断する。そして、処理部301は、判断の結果に応じて、上記仮定を正式に採用して乱数値s[i]を+sに決定するか、または乱数値s[i]を−sと決定する。
以上説明したようなs[i]=+sという仮定の下での見積もりと、見積もりの結果に応じたウィンドウ値w[i]と乱数値s[i]の決定と、スカラ倍点情報のインデックスhの範囲の関係について、続いて、図15〜16を参照して説明する。
図15は、第1実施形態においてスカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。図15は、ウィンドウサイズkが2であり、かつ乱数値sの長さbが3である場合の例である。
図11のステップS304に関して説明した範囲R1〜R4の定義より、符号つき5(=k+b)ビット値である判断基準値(dH−s)は、式(9.42)を満たす場合(より具体的には、式(9.43)を満たす場合)に、範囲R1に属する。
-2k+b+1≦dH-s≦-2k+b-1 (9.42)
-25+1=-(100000)2+1≦dH-s≦-24=-(10000)2 (9.43)
-2k+b+1≦dH-s≦-2k+b-1 (9.42)
-25+1=-(100000)2+1≦dH-s≦-24=-(10000)2 (9.43)
図15には、範囲R1に属する場合の判断基準値(dH−s)を、矩形E101により示してある。なお、矩形E101の左端の白丸は、−32(=−25=−2k+b)が範囲R1に含まれないことを示し、矩形E101の右端の黒丸は、−16(=−24=−2k+b−1)が範囲R1に含まれることを示す。他の矩形の左端と右端の白丸または黒丸も、同様の意味を示す。
また、判断基準値(dH−s)は、式(9.44)を満たす場合(より具体的には、式(9.45)を満たす場合)に、範囲R2に属する。図15には、範囲R2に属する場合の判断基準値(dH−s)を、矩形E102により示してある。
-2k+b-1+1≦dH-s≦-1 (9.44)
-24+1=-(01111)2≦dH-s≦-1=-(00001)2 (9.45)
-2k+b-1+1≦dH-s≦-1 (9.44)
-24+1=-(01111)2≦dH-s≦-1=-(00001)2 (9.45)
また、判断基準値(dH−s)は、式(9.46)を満たす場合(より具体的には、式(9.47)を満たす場合)に、範囲R3に属する。図15には、範囲R3に属する場合の判断基準値(dH−s)を、矩形E103により示してある。
0≦dH-s≦2k+b-1-1 (9.46)
0≦dH-s≦24-1=(01111)2 (9.47)
0≦dH-s≦2k+b-1-1 (9.46)
0≦dH-s≦24-1=(01111)2 (9.47)
また、判断基準値(dH−s)は、式(9.48)を満たす場合(より具体的には、式(9.49)を満たす場合)に、範囲R4に属する。図15には、範囲R4に属する場合の判断基準値(dH−s)を、矩形E104により示してある。
2k+b-1≦dH-s≦2k+b-1 (9.48)
24=(10000)2≦dH-s≦25-1=(11111)2 (9.49)
2k+b-1≦dH-s≦2k+b-1 (9.48)
24=(10000)2≦dH-s≦25-1=(11111)2 (9.49)
続いて、上記の矩形E101〜E104が示す判断基準値(dH−s)の範囲とウィンドウ値w[i]の範囲の関係について、範囲R3、R1、R2、R4の順で、説明していく。
図15の矩形E103に示すように、判断基準値(dH−s)が範囲R3に属する場合、判断基準値(dH−s)の符号は正であり、判断基準値(dH−s)のMSBの値は0である。また、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は判断基準値(dH−s)の上位kビットである。よって、判断基準値(dH−s)が範囲R3に属する場合、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、符号が正であり、絶対値が0以上2k−1未満である。
つまり、判断基準値(dH−s)が範囲R3に属する場合、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、ウィンドウ補正の必要がない。したがって、当然キャリー補正値も0である。そして、このように望ましいウィンドウ値w[i]が得られたのだから、s[i]=+sという仮定は妥当である。そのため、決定部303は、判断基準値(dH−s)が範囲R3に属する場合、図11のステップS310〜S311の処理を行う。
その結果、決定部303がステップS315で計算する補正済み差分値diffの範囲は、図15に矩形E113として示すとおり、矩形E103に対応する範囲R3とまったく同じである。したがって、ステップS316で補正済み差分値diffの上位kビットとして得られるウィンドウ値w[i]は、0以上2k−1−1以下(図15のようにk=2の場合、0以上1以下)である。
また、図15の矩形E101に示すように、判断基準値(dH−s)が範囲R1に属する場合、判断基準値(dH−s)の絶対値は2k+b−1以上である。つまり、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]の絶対値は、2k−1以上である。よって、この場合、スカラ倍点情報格納部308のメモリ使用量を抑えるためには、ウィンドウ補正を行うことが適切である。そして、判断基準値(dH−s)が範囲R1に属する場合、判断基準値(dH−s)の符号は負なので、この場合のウィンドウ補正は、具体的には、正の数を足す補正である。
そして、符号つきkビットのウィンドウ値w[i]に対して2kを足す補正は、図4、12A、12Bから理解されるように、符号つき(k+b)ビット値(w[i]||s[i])に対して2k+bを足す補正と同じことである。よって、判断基準値(dH−s)が範囲R3に属する場合、図11のステップS306に示すように、決定部303はウィンドウ補正値t[i]を2k+bと決定する。なお、この正のウィンドウ補正値t[i]=2k+bは、1つ上位のウィンドウ値w[i+1]への負のキャリー補正値(つまり−1)と相殺する。
そして、判断基準値(dH−s)にウィンドウ補正値t[i]=2k+bを足した値は、式(9.42)より式(9.50)の範囲に含まれる。
-2k+b+1+2k+b=1≦dH-s+t[i]≦-2k+b-1+2k+b=2k+b-1 (9.50)
-2k+b+1+2k+b=1≦dH-s+t[i]≦-2k+b-1+2k+b=2k+b-1 (9.50)
式(9.50)が示す1以上2k+b−1以下という範囲は、図15において矩形E111により示されている。この矩形E111が示す範囲は、両端点を除いて、上述の矩形E113が示す範囲と同じである。つまり、判断基準値(dH−s)が範囲R1に属する場合、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、ウィンドウ補正値t[i]=2k+bによって補正されることで、符号が正であり絶対値が2k−1以下という好ましい値になる。
よって、判断基準値(dH−s)が範囲R1に属する場合、s[i]=+sという仮定は妥当である。よって、決定部303は、図11のステップS305に示すように、正式にs[i]=+sと決定する。また、上記のとおり決定部303は、ステップS306でウィンドウ補正値t[i]を2k+bに決定し、ステップS307では、ウィンドウ補正値t[i]と相殺するキャリー補正値−1を1つ上位のウィンドウ値w[i+1]に足す。
その結果、決定部303がステップS315で計算する補正済み差分値diffの範囲は、図15の矩形E111が示す範囲(すなわち上記式(9.50)の範囲である。よって、ステップS316で補正済み差分値diffの上位kビットとして得られるウィンドウ値w[i]は、0以上2k−1以下(図15のようにk=2の場合、0以上2以下)である。
また、図15の矩形E102に示すように、判断基準値(dH−s)が範囲R2に属する場合、判断基準値(dH−s)の符号は負である。そして、上記のとおり、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、判断基準値(dH−s)の上位kビットであるから、やはり負である。
ここで、第1実施形態で採用される図3のアプローチによれば、処理部301は、ウィンドウ値w[i]と乱数値s[i]の符号を揃えようとする。
つまり、判断基準値(dH−s)が範囲R2に属する場合、判断部302は、「s[i]=+sという仮定は、負のウィンドウ値w[i]と適合しない」と判断する。すなわち、判断部302は、「s[i]=+sという仮定が妥当でなかった」と判断する。そこで、判断基準値(dH−s)が範囲R2に属する場合、決定部303は、図11のステップS308に示すように、乱数値s[i]を−sに決定する。
つまり、判断基準値(dH−s)が範囲R2に属する場合、判断部302は、「s[i]=+sという仮定は、負のウィンドウ値w[i]と適合しない」と判断する。すなわち、判断部302は、「s[i]=+sという仮定が妥当でなかった」と判断する。そこで、判断基準値(dH−s)が範囲R2に属する場合、決定部303は、図11のステップS308に示すように、乱数値s[i]を−sに決定する。
また、s[i]=−sのとき、式(9.51)が成立する。そして、判断基準値(dH−s)が範囲R2に属する場合、式(9.44)と(9.51)から、式(9.52)が得られる。
dH-s[i]=dH+s=(dH-s)+2s (9.51)
-2k+b-1+1+2s≦dH-s[i]≦-1+2s (9.52)
dH-s[i]=dH+s=(dH-s)+2s (9.51)
-2k+b-1+1+2s≦dH-s[i]≦-1+2s (9.52)
図15において、矩形E102を+2s移動させた矩形E112は、式(9.51)の(dH−s[i])の範囲(すなわち式(9.52)が示す範囲)を図示したものである。
ここで、乱数値sは0≦s≦2b−1である。また、ウィンドウサイズkは2以上の任意の整数である。よって、式(9.53)が成立する。
0≦2s≦2b+1-2≦2b+k-1-2 (9.53)
0≦2s≦2b+1-2≦2b+k-1-2 (9.53)
式(9.52)と(9.53)より、乱数値sがいかに大きくても、矩形E112が示す範囲の最大値は2k+b−1に満たない。また、式(9.52)と(9.53)より、乱数値sがいかに小さくても、矩形E112が示す範囲の最小値は−2k+b−1より大きい。したがって、矩形E112が示す範囲に含まれる値のMSBの値は0である。つまり、(dH−s[i])の上位kビットの絶対値は2k−1未満である。
よって、(dH−s[i])の上位kビットが示す値は、ウィンドウ補正をしなくても、絶対値が2k−1未満という、ウィンドウ値w[i]として好適な値である。よって、判断基準値(dH−s)が範囲R2に属する場合、決定部303は図11のステップS309のとおり、ウィンドウ補正値t[i]を0に設定する。
そして、t[i]=0なので、決定部303がステップS315で計算する補正済み差分値diffの範囲は、図15の矩形E112が表す範囲と同じである。
ところで、判断基準値(dH−s)が範囲R2に属する場合、上記のように決定部303はs[i]=−sと決定した。よって、図10のステップS207とS209に示すとおり、ウィンドウ演算部309は、ウィンドウ値w[i]ではなく、ウィンドウ値w[i]の符号を反転させた値−w[i]をインデックスとして用いて、スカラ倍点情報格納部308を参照する。
ところで、判断基準値(dH−s)が範囲R2に属する場合、上記のように決定部303はs[i]=−sと決定した。よって、図10のステップS207とS209に示すとおり、ウィンドウ演算部309は、ウィンドウ値w[i]ではなく、ウィンドウ値w[i]の符号を反転させた値−w[i]をインデックスとして用いて、スカラ倍点情報格納部308を参照する。
つまり、判断基準値(dH−s)が範囲R2に属する場合に決定部303が決定するウィンドウ値w[i]の符号を反転させた値−w[i]に対応するエントリが、スカラ倍点情報格納部308のテーブルには存在しなくてはならない。そして、判断基準値(dH−s)が範囲R2に属する場合のウィンドウ値w[i]は、図15の矩形E112が示す範囲に含まれる値の上位kビットである。よって、矩形E112が示す範囲の符号を反転させた範囲に含まれる値の上位kビットが、テーブルのインデックスとして使われる。
図15では、矩形E112が示す範囲の符号を反転させた範囲を、矩形E122により示している。式(9.52)とt[i]=0より、式(9.54)が得られるので、矩形E122が示す範囲は、式(9.55)のとおりである。
-2k+b-1+1+2s≦dH-s[i]+t[i]=diff≦-1+2s (9.54)
-2s+1≦-diff≦2k+b-1-1-2s (9.55)
-2k+b-1+1+2s≦dH-s[i]+t[i]=diff≦-1+2s (9.54)
-2s+1≦-diff≦2k+b-1-1-2s (9.55)
つまり、式(9.55)と図15の矩形E122が示すように、負数の上位kビットがインデックスとして使われうる。具体的には、−1がインデックスとして使われうる。その理由は次のとおりである。
乱数値sは0≦s≦2b−1なので、−2b+1+2≦−2s≦0である。よって、式(9.55)における(−2s+1)が−2b+1未満になることはないが、(−2s+1)が−2b未満になることはありうる。そして、−2bを符号つき(k+b)ビット値として表現したビット列の上位kビットは、(k−1)ビットの0の後に1というビットが続く、負の符号を持つビット列である。
したがって、矩形E122が示す範囲に含まれる値の上位kビット(すなわちインデックスとして使われる符号つきkビット値)は、乱数値sの値によっては、−1(つまり、符号が負で、(k−1)ビットの0の後に1ビットの1が続くビット列)のこともある。そのため、第1実施形態では、スカラ倍点情報格納部308のテーブルには、−1というインデックスに対応づけられたテーブルデータtab[−1]=(−1×2b+s)Aのエントリが設けられる。
なお、−0は+0と等しいので、ウィンドウ値w[i]が0の場合は、乱数値s[i]が−sであろうと+sであろうと、ウィンドウ演算部309がスカラ倍点情報格納部308を参照するのに用いるインデックスは0である。つまり、−diff<0であっても、−diffの上位kビットがすべて0ならば、インデックスは0である(正確には、キャリー補正の影響がない場合には、補正済み差分値diffの上位kビットがすべて0ならば、補正済み差分値diffの正負によらず、インデックスは0である)。
また、図15の矩形E104に示すように、判断基準値(dH−s)が範囲R4に属する場合、判断基準値(dH−s)は2k+b−1以上である。つまり、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]は、2k−1以上である。
よって、この場合、スカラ倍点情報格納部308のメモリ使用量を抑えるためには、ウィンドウ補正を行うことが適切である。そして、判断基準値(dH−s)が範囲R4に属する場合、判断基準値(dH−s)が正なので、この場合のウィンドウ補正は、具体的には、負の数を足す補正である。
より具体的には、決定部303は、図11のステップS313に示すように、ウィンドウ補正値t[i]を−2k+bと決定する。この負のウィンドウ補正値t[i]=−2k+bは、1つ上位のウィンドウ値w[i+1]への正のキャリー補正値(つまり+1)と相殺する。
そして、判断基準値(dH−s)にウィンドウ補正値t[i]=−2k+bを足した値は、式(9.48)より式(9.56)の範囲に含まれる。
2k+b-1-2k+b=-2k+b-1≦dH-s+t[i]≦2k+b-1-2k+b=-1 (9.56)
2k+b-1-2k+b=-2k+b-1≦dH-s+t[i]≦2k+b-1-2k+b=-1 (9.56)
式(9.56)の範囲に含まれるのは負数のみである。そして、s[i]=+sという仮定の下で見積もられるウィンドウ値w[i]を、絶対値が小さくなるように補正した値は、判断基準値(dH−s)をウィンドウ補正値t[i]で補正した値の上位kビットである。したがって、式(9.56)が成り立つとき、見積もったウィンドウ値w[i]を補正した値も負である。
よって、判断基準値(dH−s)が範囲R2に属する場合と同様に、判断部302は、「s[i]=+sという仮定は、補正されて負となったウィンドウ値w[i]と適合しない」と判断する。すなわち、判断部302は、「s[i]=+sという仮定が妥当でなかった」と判断する。
そこで、判断基準値(dH−s)が範囲R4に属する場合、決定部303は、図11のステップS312に示すように、乱数値s[i]を−sに決定する。
また、s[i]=−sのとき、上述の式(9.51)が成立する。そして、判断基準値(dH−s)が範囲R4に属する場合、式(9.51)と(9.56)から、式(9.57)が得られる。
-2k+b-1+2s≦dH-s[i]+t[i]≦-1+2s (9.57)
また、s[i]=−sのとき、上述の式(9.51)が成立する。そして、判断基準値(dH−s)が範囲R4に属する場合、式(9.51)と(9.56)から、式(9.57)が得られる。
-2k+b-1+2s≦dH-s[i]+t[i]≦-1+2s (9.57)
図15において、矩形E104を(−2k+b+2s)移動させた矩形E114は、式(9.57)の範囲を図示したものである。矩形E114が示す範囲は、左端点以外は矩形E112が示す範囲と同じである。よって、範囲R2に関する上記の議論と同様の議論が成り立つ。
すなわち、図15の矩形E124は、矩形E114が示す範囲の符号を逆転した範囲を示す。そして、矩形E124が示す範囲の上位kビットが、テーブルのインデックスとして使われる。具体的には、インデックスとして使われる符号つきkビット値は、乱数値sの値によっては、−1のこともある。
以上、図15を参照して説明したとおり、第1実施形態によれば、キャリー補正の影響を考慮しなければ、スカラ倍点情報格納部308でインデックスとして使われる値は、−1以上2k−1以下である。したがって、キャリー補正の影響を考慮すれば、スカラ倍点情報格納部308でインデックスとして使われる値は、−2以上(2k−1+1)以下である。そして、図16は、第1実施形態においてスカラ倍点情報格納部308でインデックスとして使われる値についてまとめた図である。なお、図16も、図15と同様に、ウィンドウサイズkが2の場合の例を示す。
図16には、図15と同じく、範囲R1に対応する矩形E111、範囲R2に対応する矩形E112とその符号を反転させた矩形E122、範囲R3に対応する矩形E113、範囲R4に対応する矩形E114とその符号を反転させた矩形E124を示した。図15に関して説明したとおり、スカラ倍点情報格納部308でインデックスとして使われる値は、矩形E111、E122、E113およびE124がそれぞれ示す範囲に含まれる値の上位kビットである。また、図16には、乱数値sの最大値である(2b−1)の大きさを両矢印で示した。図16に示すとおり、ウィンドウ値w[i]における大きさ1が、2bの大きさに相当するので、乱数値sの最大値は、ウィンドウ値w[i]における大きさ1に満たない。
矩形E111に対応するウィンドウ値w[i]は、そのままインデックスとして使われる。矩形E111に対応するウィンドウ値w[i]は、0以上2k−1以下(k=2の場合、0以上2以下)である。
矩形E112に対応するウィンドウ値w[i]は、そのままではインデックスとしては使われず、ウィンドウ値w[i]の符号を反転した値がインデックスとして使われる。すなわち、インデックスとして使われる値は、矩形E122が表す範囲に含まれる値の上位kビットである。
したがって、図15に関して説明したように、矩形E122に対応してインデックスとして使われる値の最小値は−1である。また、矩形E122に対応してインデックスとして使われる値の最大値は、乱数値sに応じて異なるが、(2k−1−1)か(2k−1−2)である。図16には、ウィンドウサイズkが2の場合での具体例として、矩形E122に対応してインデックスとして使われる値が−1以上0以下の例が示されている。
矩形E113に対応するウィンドウ値w[i]は、そのままインデックスとして使われる。矩形E113に対応するウィンドウ値w[i]は、0以上(2k−1−1)以下(k=2の場合、0以上1以下)である。
矩形E114に対応するウィンドウ値w[i]は、そのままではインデックスとしては使われず、ウィンドウ値w[i]の符号を反転した値がインデックスとして使われる。すなわち、インデックスとして使われる値は、矩形E124が表す範囲に含まれる値の上位kビットである。
したがって、図15に関して説明したように、矩形E124に対応してインデックスとして使われる値の最小値は−1である。また、矩形E124に対応してインデックスとして使われる値の最大値は、乱数値sに応じて異なるが、s=0の場合に最も大きく、すなわち2k−1である。図16には、ウィンドウサイズkが2の場合での具体例として、矩形E124に対応してインデックスとして使われる値が−1以上0以下の例が示されている。
以上から、補正済み差分値diffの上位kビットを取り出すことで得られるウィンドウ値w[i](すなわち、まだキャリー補正されていないウィンドウ値w[i])に対応するインデックスの範囲は、図16に示す−1以上2k−1以下の範囲U1のとおりである。より具体的には、k=2の場合、範囲U1は、−1以上2以下の範囲である。
ところが、補正済み差分値diffから得られたウィンドウ値w[i]は、後に+1または−1のキャリー補正値により補正されることがある。よって、実際にスカラ倍点情報格納部308のインデックスとして使われる可能性がある値の範囲は、−2以上(2k−1+1)以下である。
図16には、ウィンドウサイズkが2で乱数値sのビット数bが3の場合のスカラ倍点情報格納部308のテーブルデータを図示してある。すなわち、図16には、−2≦h≦2k−1+1=3なる各インデックスhと、インデックスhに対応する値(h×23+s)Aが示されている。
さて、続いて第2実施形態について説明する。第2実施形態は、スカラ倍点情報格納部308のインデックスとして使われる可能性がある値の範囲を第1実施形態よりも狭めることで、さらにメモリの節約を図る実施形態である。
そこで、第2実施形態に関しては、まず、どのようにしたらインデックスの範囲を狭めることが可能なのかについて、図17〜18を参照して説明する。その後、図19〜22を参照して第2実施形態における暗号処理装置300の動作の詳細を説明する。
図17は、第2実施形態においてスカラ倍点情報格納部308でインデックスとして使われる値についてまとめた図である。図17の形式は第1実施形態に関する図16と同様である。以下、図17と図16を比較しながら説明する。
図16のとおり、第1実施形態においてキャリー補正される前のウィンドウ値w[i]が−1となる可能性がある理由は、判断基準値(dH−s)が範囲R2またはR4に属するとき、矩形E122またはE124が示す範囲の最小値が(−2s+1)だからである。具体的には、乱数値sが(2b−1)のときに、補正済み差分値diffの符号を反転させた−diffの最小値が最も小さくなる(つまり、矩形E122またはE124の左端の位置が最も左になる)。すなわち、乱数値sが(2b−1)のときに、−diffの最小値(−2s+1)が(−2b+1−1)となる。
そして、図16と17に示すように、ウィンドウ値w[i]における大きさ1は、補正済み差分値diffにおける2bの大きさに相当する。そこで、第1実施形態では、−diffの最小値が(−2b+1−1)の場合に対処するため、−1というインデックスに対応するエントリがスカラ倍点情報格納部308に作られる。さらに、キャリー補正が行われる場合に備えて、第1実施形態では、−2というインデックスに対応するエントリも、スカラ倍点情報格納部308に作られる。
つまり、キャリー補正がされる前の段階で、s[i]=−sという乱数値に対応してw[i]=1というウィンドウ値が設定され、さらにキャリー補正値が+1である場合、s[i]=−sという乱数値とw[i]=2というウィンドウ値がペアになる。よって、ウィンドウ演算部309は、−w[i]=−2というインデックスを用いてスカラ倍点情報格納部308を参照し、tab[−2]=(−2×2b+s)Aなる点を得る。第1実施形態では、このような場合に備えて、スカラ倍算部307が、−2なるインデックスに対応するテーブルデータtab[−2]を生成し、スカラ倍点情報格納部308に格納する。
ところで、図17に示すように、ウィンドウ値w[i]における大きさ1が、補正済み差分値diffにおける2bの大きさに相当するので、乱数値sの最大値は、ウィンドウ値w[i]における大きさ1に満たない。つまり、図16の矩形E122とE124は0より左側の部分の大きさが2sだが、この0より左側の部分の大きさをsにすることができれば、1つのエントリ(つまり−2というインデックスに対応するエントリ)の必要性をなくすことができる。
そこで、第2実施形態では、第1実施形態の図16の矩形E111、E112、E113、E114が、それぞれ−sだけずれた図17の矩形E211、E212、E213、E214に置き換えられる。
上記のとおり、乱数値sの最大値は、ウィンドウ値w[i]における大きさ1に満たない。よって、0以上2k−1以下のウィンドウ値w[i]に対応する図16の矩形E111を−sずらした図17の矩形E211に対応するウィンドウ値w[i]の範囲は、s>0ならば0以上(2k−1−1)以下であり、s=0ならば0以上2k−1以下である。なお、−0=+0=0なので、補正済み差分値diffが正でも負でも、その上位kビットがすべて0であれば、キャリー補正前のウィンドウ値w[i]は0である。
そして、図16の矩形E112を−sずらした図17の矩形E212が示す範囲の符号を反転させた範囲は、図17において矩形E222により示される。そして、矩形E222が示す範囲の最小値は(−s+1)である。よって、たとえ乱数値sが最大の(2b−1)であったとしても、矩形E222が示す範囲の最小値の上位kビットはすべて0である。つまり、矩形E222が−1なるインデックスに対応することはない。
また、0以上(2k−1−1)以下のウィンドウ値w[i]に対応する図16の矩形E113を−sずらした図17の矩形E213に対応するウィンドウ値w[i]の範囲は、0以上(2k−1−1)以下である。
そして、図16の矩形E114を−sずらした図17の矩形E214が示す範囲の符号を反転させた範囲は、図17において矩形E224により示される。そして、矩形E224が示す範囲の最小値は(−s+1)である。よって、たとえ乱数値sが最大の(2b−1)であったとしても、矩形E224が示す範囲の最小値の上位kビットはすべて0である。つまり、矩形E224が−1なるインデックスに対応することはない。
以上から、第2実施形態では、補正済み差分値diffの上位kビットを取り出すことで得られるウィンドウ値w[i](すなわち、まだキャリー補正されていないウィンドウ値w[i])に対応するインデックスの範囲は、図17の範囲U2のとおりである。つまり、範囲U2は、0以上2k−1以下であり、k=2の場合、0以上2以下である。
したがって、キャリー補正を考慮すると、第2実施形態で使われるインデックスは−1以上(2k−1+1)以下であり、k=2の場合、−1以上3以下である。図17には、ウィンドウサイズkが2で乱数値sのビット数bが3の場合のスカラ倍点情報格納部308のテーブルデータを図示してある。すなわち、図17には、−1≦h≦2k−1+1=3なる各インデックスhと、インデックスhに対応する値(h×23+s)Aが示されている。
さて、続いて、図17の矩形E211、E212、E213、およびE214に対応して決定部303がウィンドウ値w[i]を決定するためには、具体的には判断部302が何を基準にして判断を行えばよいのかを、図18を参照して説明する。図18は、第2実施形態においてスカラ倍点情報格納部308のインデックスとして使われる値の範囲について模式的に説明する図である。図18の形式は第1実施形態に関する図15と同様である。
結論から述べれば、第2実施形態では、判断部302は符号つき(k+b)ビット値dHそのものを、判断の基準として用いる。そして、符号つき(k+b)ビット値dHの値が範囲R1〜R4のいずれに属するのかに応じて、決定部303は異なる処理を行う。
すなわち、図18の矩形E201は、範囲R1に属する場合の符号つき(k+b)ビット値dHを示す。矩形E201が示す範囲R1は、式(10.1)のとおりであり、図18のようにウィンドウサイズkが2で乱数値sの長さbが3の場合は、具体的には式(10.2)のとおりである。
-2k+b+1≦dH≦-2k+b-1 (10.1)
-25+1=-(11111)2≦dH≦-24=-(10000)2 (10.2)
-2k+b+1≦dH≦-2k+b-1 (10.1)
-25+1=-(11111)2≦dH≦-24=-(10000)2 (10.2)
また、矩形E202は、範囲R2に属する場合の符号つき(k+b)ビット値dHを示す。矩形E202が示す範囲R2は、式(10.3)のとおりであり、図18の例では具体的には式(10.4)のとおりである。
-2k+b-1+1≦dH≦-1 (10.3)
-24+1=-(01111)2≦dH≦-1=-(00001)2 (10.4)
-2k+b-1+1≦dH≦-1 (10.3)
-24+1=-(01111)2≦dH≦-1=-(00001)2 (10.4)
そして、矩形E203は、範囲R3に属する場合の符号つき(k+b)ビット値dHを示す。矩形E203が示す範囲R3は、式(10.5)のとおりであり、図18の例では具体的には式(10.6)のとおりである。
0≦dH≦2k+b-1-1 (10.5)
0≦dH≦24-1=(01111)2 (10.6)
0≦dH≦2k+b-1-1 (10.5)
0≦dH≦24-1=(01111)2 (10.6)
また、矩形E204は、範囲R4に属する場合の符号つき(k+b)ビット値dHを示す。矩形E204が示す範囲R4は、式(10.7)のとおりであり、図18の例では具体的には式(10.8)のとおりである。
2k+b-1≦dH≦2k+b-1 (10.7)
24=(10000)2≦dH≦25-1=(11111)2 (10.8)
2k+b-1≦dH≦2k+b-1 (10.7)
24=(10000)2≦dH≦25-1=(11111)2 (10.8)
続いて、矩形E201〜E204が示す符号つき(k+b)ビット値dHの範囲とウィンドウ値w[i]の範囲の関係について、範囲R3、R1、R2、R4の順で、図15と比較しながら説明していく。
第1実施形態において、決定部303は、判断基準値(dH−s)が範囲R3に属する場合に、乱数値s[i]を+sに決定し、ウィンドウ補正値t[i]を0に決定する。第2実施形態においては、決定部303は、符号つき(k+b)ビット値dHが範囲R3に属する場合に、同様に乱数値s[i]を+sに決定し、ウィンドウ補正値t[i]を0に決定する。
ここで、補正済み差分値diffは、第2実施形態においても第1実施形態の式(9.3)と同様に定義される。よって、符号つき(k+b)ビット値dHが範囲R3に属する場合、式(10.5)、s[i]=+s、およびt[i]=0から、式(10.9)が得られる。
0-s+0≦diff=dH-s[i]+t[i]≦2k+b-1-1-s+0 (10.9)
0-s+0≦diff=dH-s[i]+t[i]≦2k+b-1-1-s+0 (10.9)
そして、式(10.9)が表す補正済み差分値diffの範囲は、図18の矩形E213のとおりである。図18の矩形E213は図17の矩形E213と同じであるから、符号つき(k+b)ビット値dHが範囲R3に属する場合、キャリー補正の影響がなければ、インデックスは図17に示す所望の範囲U2に収まる。
続いて範囲R1について説明する。第1実施形態では、判断基準値(dH−s)が範囲R1に属する場合に、決定部303は、ウィンドウ補正値t[i]を2k+bと決定し、1つ上位のウィンドウ値w[i+1]へのキャリー補正値を−1と決定し、乱数値s[i]を+sに決定する。第2実施形態では、決定部303は、符号つき(k+b)ビット値dHが範囲R1に属する場合に、ウィンドウ補正値t[i]とキャリー補正値と乱数値s[i]を同様に決定する。
すると、符号つき(k+b)ビット値dHが範囲R1に属する場合、式(9.3)の補正済み差分値diffの定義、式(10.1)、s[i]=+s、およびt[i]=2k+bから、式(10.10)が得られる。
-2k+b+1-s+2k+b=-s+1≦diff=dH-s[i]+t[i]≦-2k+b-1-s+2k+b=2k+b-1-s (10.10)
-2k+b+1-s+2k+b=-s+1≦diff=dH-s[i]+t[i]≦-2k+b-1-s+2k+b=2k+b-1-s (10.10)
そして、式(10.10)が表す補正済み差分値diffの範囲は、図18の矩形E211のとおりである。図18の矩形E211は図17の矩形E211と同じであるから、符号つき(k+b)ビット値dHが範囲R1に属する場合も、キャリー補正の影響がなければ、インデックスは図17に示す所望の範囲U2に収まる。
続いて範囲R2について説明する。第1実施形態では、判断基準値(dH−s)が範囲R2に属する場合に、決定部303は、乱数値s[i]を−sに決定し、ウィンドウ補正値t[i]を0に設定する。第2実施形態では、判断基準値(dH−s)が範囲R2に属する場合に、決定部303は、同様に乱数値s[i]を−sに決定し、ウィンドウ補正値t[i]を0に設定する。
すると、符号つき(k+b)ビット値dHが範囲R2に属する場合、式(9.3)の補正済み差分値diffの定義、式(10.3)、s[i]=−s、およびt[i]=0から、式(10.11)が得られる。
-2k+b-1+1+s+0≦diff=dH-s[i]+t[i]≦-1+s+0 (10.11)
-2k+b-1+1+s+0≦diff=dH-s[i]+t[i]≦-1+s+0 (10.11)
そして、式(10.11)が表す補正済み差分値diffの範囲は、図18の矩形212のとおりである。図18の矩形E212は図17の矩形E212と同じである。よって、矩形E212が表す式(10.11)の範囲の符号を反転させた範囲(すなわち矩形E222が表す範囲)は、式(10.12)のとおりである。
-s+1≦-diff≦2k+b-1-1-s (10.12)
-s+1≦-diff≦2k+b-1-1-s (10.12)
よって、符号つき(k+b)ビット値dHが範囲R2に属する場合も、キャリー補正の影響がなければ、インデックスは図17に示す所望の範囲U2に収まる。
続いて範囲R4について説明する。第1実施形態では、判断基準値(dH−s)が範囲R4に属する場合に、決定部303は、ウィンドウ補正値t[i]を−2k+bと決定し、1つ上位のウィンドウ値w[i+1]へのキャリー補正値を+1と決定し、乱数値s[i]を−sと決定する。第2実施形態では、決定部303は、符号つき(k+b)ビット値dHが範囲R4に属する場合に、ウィンドウ補正値t[i]とキャリー補正値と乱数値s[i]を同様に決定する。
すると、符号つき(k+b)ビット値dHが範囲R4に属する場合、式(9.3)の補正済み差分値diffの定義、式(10.7)、s[i]=−s、およびt[i]=−2k+bから、式(10.13)が得られる。
2k+b-1+s-2k+b=-2k+b-1+s≦diff=dH-s[i]+t[i]≦2k+b-1+s-2k+b=s-1 (10.13)
2k+b-1+s-2k+b=-2k+b-1+s≦diff=dH-s[i]+t[i]≦2k+b-1+s-2k+b=s-1 (10.13)
そして、式(10.13)が表す補正済み差分値diffの範囲は、図18の矩形E214のとおりである。図18の矩形E214は図17の矩形E214と同じである。よって、矩形E214が表す式(10.13)の範囲の符号を反転させた範囲(すなわち矩形E224が表す範囲)は、式(10.14)のとおりである。
-s+1≦-diff≦2k+b-1-s (10.14)
-s+1≦-diff≦2k+b-1-s (10.14)
よって、符号つき(k+b)ビット値dHが範囲R4に属する場合も、キャリー補正の影響がなければ、インデックスは図17に示す所望の範囲U2に収まる。
以上図16と17を参照して説明したことをまとめれば、第2実施形態では、判断部302が、符号つき(k+b)ビット値dHから乱数値sを引いた値(dH−s)ではなく、符号つき(k+b)ビット値dHそのものの値を判断基準として用いる。それにより、第2実施形態では、「−sなる乱数値s[i]に対応するウィンドウ値w[i]が、1に設定され、さらにキャリー補正によって2に決定される」という事態が起こらなくなり、スカラ倍点情報格納部308のインデックスとして−2は不要となる。つまり、第2実施形態によれば、判断部302の判断基準を変えるだけで、スカラ倍点情報格納部308のメモリ消費量のさらなる削減が達成される。
以下では、以上説明した第2実施形態について、さらに具体的に説明する。
図19は、第2実施形態において暗号処理装置300がウィンドウ列w[i]と乱数列s[i]と補正値cを決定する処理のフローチャートである。すなわち、図19は、第2実施形態における、図9のステップS103のフローチャートである。
図19は、第2実施形態において暗号処理装置300がウィンドウ列w[i]と乱数列s[i]と補正値cを決定する処理のフローチャートである。すなわち、図19は、第2実施形態における、図9のステップS103のフローチャートである。
図19のステップS401〜S403は、第1実施形態に関する図11のステップS301〜S303と同様であり、ステップS405〜S423は、図11のステップS405〜S423と同様である。よって、これらのステップについては説明を割愛する。
図19において、第1実施形態に関する図11と異なるのは、ステップS404である。ステップS404において判断部302は、符号つき(k+b)ビット値dHが範囲R1〜R4のいずれに含まれるかを判断する。範囲R1〜R4は、第1実施形態と同様に、以下のように定義される。
・範囲R1:−2k+b−1以下
・範囲R2:(−2k+b−1+1)以上−1以下
・範囲R3:0以上(2k+b−1−1)以下
・範囲R4:2k+b−1以上
・範囲R1:−2k+b−1以下
・範囲R2:(−2k+b−1+1)以上−1以下
・範囲R3:0以上(2k+b−1−1)以下
・範囲R4:2k+b−1以上
そして、符号つき(k+b)ビット値dHが範囲R1に含まれるとき、処理はステップS405に移行し、符号つき(k+b)ビット値dHが範囲R2に含まれるとき、処理はステップS408に移行する。また、符号つき(k+b)ビット値dHが範囲R3に含まれるとき、処理はステップS410に移行し、符号つき(k+b)ビット値dHが範囲R4に含まれるとき、処理はステップS412に移行する。
なお、ステップS404の処理の簡略化のため、判断部302は、符号つき(k+b)ビット値dHの符号とMSBの値をチェックすることで、符号つき(k+b)ビット値dHがどの範囲に含まれるかを判断してもよい。
すなわち、符号つき(k+b)ビット値dHは、符号が負でMSBの値が1ならば、範囲R1に含まれる。また、符号つき(k+b)ビット値dHは、符号が負でMSBの値が0ならば、範囲R2に含まれる。そして、符号つき(k+b)ビット値dHは、符号が正でMSBの値が0ならば、範囲R3に含まれる。また、符号つき(k+b)ビット値dHは、符号が正でMSBの値が1ならば、範囲R4に含まれる。
続いて、個人鍵dと乱数値sの数値例を含む図20A〜21を参照して、第2実施形態における図9、10、19の処理の具体例を説明する。
図9のステップS102で処理部301が得たダミー鍵eが、式(10.15)に示す15ビットの値であるとする。なお、式(10.15)に対応する個人鍵dの具体例は、図21とともに後述する。
e=(010101011101100)2=10988 (10.15)
図9のステップS102で処理部301が得たダミー鍵eが、式(10.15)に示す15ビットの値であるとする。なお、式(10.15)に対応する個人鍵dの具体例は、図21とともに後述する。
e=(010101011101100)2=10988 (10.15)
続いて、図9のステップS103に相当する図19の処理が開始される。なお、図20A〜20Bの例では、ウィンドウサイズkは3であり、乱数値sのビット長bは6であるとする。したがって、式(9.9)と同じく、m=3である。
図19の処理が開始されると、ステップS401で判断部302は、式(10.16)のように符号つき(k+b)ビット値dHを初期化する。
dH=e[14]||…||e[6]=(010101011)2=171 (10.16)
dH=e[14]||…||e[6]=(010101011)2=171 (10.16)
また、ステップS402で乱数生成部305が、b(=6)ビットの乱数値sとして式(10.17)の値を生成したとする。
s=(010010)2=18 (10.17)
s=(010010)2=18 (10.17)
すると、続くステップS403では、処理部301がループ変数iを2(=m−1)に初期化する。そして、ステップS404で判断部302は、式(10.16)の符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。式(10.16)より、符号つき(k+b)ビット値dHは、符号が正でMSBの値が0なので、範囲R3に属する。
よって、決定部303は、ステップS410で乱数値s[2]を式(10.18)のとおり+sに決定し、ステップS411でウィンドウ補正値t[2]を式(10.19)のとおり0に決定する。また、ウィンドウ補正値t[2]が0なので、キャリー補正は行われない。
s[2]=+s=18=(010010)2 (10.18)
t[2]=0=(0000000000)2 (10.19)
s[2]=+s=18=(010010)2 (10.18)
t[2]=0=(0000000000)2 (10.19)
そして、ステップS415で決定部303は、式(9.3)にしたがい、具体的には式(10.20)のようにして、補正済み差分値diffを計算する。
diff=dH-s[2]+t[2]
=171-18+0
=153
=2×26+25
=(010011001)2
=(010 || 011001)2 (10.20)
diff=dH-s[2]+t[2]
=171-18+0
=153
=2×26+25
=(010011001)2
=(010 || 011001)2 (10.20)
さらに、ステップS416で決定部303は、式(10.21)のようにウィンドウ値w[2]を計算する。なお、ここで得られるウィンドウ値w[2]は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (10.21)
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (10.21)
また、i=2なので、処理がステップS418に進む。ステップS418で判断部302は、式(9.5)にしたがい、具体的には式(10.22)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=25×23+(101)2
=200+5
=205
=(011001101)2 (10.22)
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=25×23+(101)2
=200+5
=205
=(011001101)2 (10.22)
その後、ステップS420で処理部301がループ変数iをデクリメントするのでi=1となる。そして、i≧0なので処理はステップS421からステップS404に戻る。
ステップS404では、判断部302が、式(10.22)のように更新された符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。符号つき(k+b)ビット値dHは、符号が正でありMSBの値が0なので、範囲R3に属する。
よって、決定部303は、ステップS410で乱数値s[1]を式(10.23)のとおり+sに決定し、ステップS411でウィンドウ補正値t[1]を式(10.24)のとおり0に決定する。また、ウィンドウ補正値t[1]が0なので、ウィンドウ値w[2]へのキャリー補正は行われず、ウィンドウ値w[2]は式(10.21)の値に確定する。
s[1]=+s=18=(010010)2 (10.23)
t[1]=0=(0000000000)2 (10.24)
s[1]=+s=18=(010010)2 (10.23)
t[1]=0=(0000000000)2 (10.24)
そして、ステップS415で決定部303は、式(9.3)にしたがい、具体的には式(10.25)のようにして、補正済み差分値diffを計算する。
diff=dH-s[1]+t[1]
=205-18+0
=187
=2×26+59
=(010111011)2
=(010 || 111011)2 (10.25)
diff=dH-s[1]+t[1]
=205-18+0
=187
=2×26+59
=(010111011)2
=(010 || 111011)2 (10.25)
さらに、ステップS416で決定部303は、式(10.26)のようにウィンドウ値w[1]を計算する。なお、ここで得られるウィンドウ値w[1]は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=(010)2=2 (10.26)
w[1]=diff[8]||diff[7]||diff[6]=(010)2=2 (10.26)
また、i=1なので、処理がステップS418に進む。ステップS418で判断部302は、式(9.5)にしたがい、具体的には式(10.27)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=59×23+(100)2
=472+4
=476
=(111011100)2 (10.27)
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=59×23+(100)2
=472+4
=476
=(111011100)2 (10.27)
その後、ステップS420で処理部301がループ変数iをデクリメントするのでi=0となる。そして、i≧0なので処理はステップS421からステップS404に戻る。
ステップS404では、判断部302が、式(10.27)のように更新された符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。符号つき(k+b)ビット値dHは、符号が正でありMSBの値が1なので、範囲R4に属する。
よって、決定部303は、ステップS412で乱数値s[0]を式(10.28)のとおり−sに決定し、ステップS413でウィンドウ補正値t[0]を式(10.29)のとおり−2k+bに決定する。
s[0]=-s=-18=-(010010)2 (10.28)
t[0]=-2k+b=-29=-(1000000000)2 (10.29)
s[0]=-s=-18=-(010010)2 (10.28)
t[0]=-2k+b=-29=-(1000000000)2 (10.29)
そして、ウィンドウ補正値t[0]が非ゼロなので、ステップS414で決定部303はキャリー補正を行う。すなわち、決定部303は、式(10.26)で求めたウィンドウ値w[1]に1を足す。その結果、ウィンドウ値w[1]は式(10.30)の値に確定する。
w[1]=2+1=3 (10.30)
w[1]=2+1=3 (10.30)
さらに、ステップS415で決定部303は、式(9.3)にしたがい、具体的には式(10.31)のようにして、補正済み差分値diffを計算する。
diff=dH-s[0]+t[0]
=476+18-512
=-18
=-(000010010)2
=-(000 || 010010)2 (10.31)
diff=dH-s[0]+t[0]
=476+18-512
=-18
=-(000010010)2
=-(000 || 010010)2 (10.31)
さらに、ステップS416で決定部303は、式(10.32)のようにウィンドウ値w[0]を計算する。なお、ウィンドウ値w[0]は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0 (10.32)
w[0]=diff[8]||diff[7]||diff[6]=-(000)2=(000)2=0 (10.32)
また、i=0なので処理がステップS419に進む。そして、ステップS419で判断部302は、式(9.6)にしたがい、具体的には式(10.33)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])=-(010010)2=-18 (10.33)
dH=(diff[5]||…||diff[0])=-(010010)2=-18 (10.33)
その後、ステップS420で処理部301がループ変数iをデクリメントするのでi=−1となる。よって、i<0なので処理はステップS421からステップS422に進む。したがって、ステップS422で決定部303は、式(10.34)のとおり補正値cを得る。
c=dH=-18 (10.34)
c=dH=-18 (10.34)
最後に、ステップS423で決定部303は、式(10.35)に示すウィンドウ列w[i]と、式(10.36)に示す乱数列s[i]をウィンドウ演算部309に出力し、式(10.34)に示す補正値cを補正部310に出力する。式(10.35)は、式(10.21)、式(10.30)、式(10.32)から明らかであり、式(10.36)は、式(10.18)、式(10.23)、式(10.28)から明らかである。
w[2]= 2, w[1]= 3, w[0]= 0 (10.35)
s[2]=18, s[1]=18, s[0]=-18 (10.36)
w[2]= 2, w[1]= 3, w[0]= 0 (10.35)
s[2]=18, s[1]=18, s[0]=-18 (10.36)
以上のようにして、図9のステップS103に相当する図11の処理が終了すると、図9のステップS104で取得部306が点Aのxy座標を取得する。そして、ステップS105でスカラ倍算部307が、−1≦h≦2k−1+1=5なる範囲の各インデックスhについて、乱数s=18(式(10.17)参照)に応じたスカラ倍点情報として、式(10.37)のランダム化テーブルデータtab[h]を生成する。
tab[h]=(2bh+s)A=(26h+18)A=(64h+18)A (10.37)
tab[h]=(2bh+s)A=(26h+18)A=(64h+18)A (10.37)
そして、スカラ倍点情報格納部308は、生成されたランダム化テーブルデータtab[h]を、インデックスhと対応づけて格納する。
図21は、以上のようにして得られた、ウィンドウ列w[i]と乱数列s[i]と補正値cを示すとともに、スカラ倍点情報格納部308がランダム化テーブルデータtab[h]を保持するテーブル108を示す図である。
図19〜20Bを参照して上記で説明した処理によれば、図21に示すとおり、式(8.9)が成立する。具体的には、図19〜20Bの例におけるk=3、b=6、m=3、e=10988という値および式(10.34)〜(10.36)に示した値を式(8.9)の各変数に代入すると、下記の式(10.38)が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-18+64×0+1×(-18)+512×3+8×18+4096×2+64×18
=10988 (10.38)
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=-18+64×0+1×(-18)+512×3+8×18+4096×2+64×18
=10988 (10.38)
また、式(10.37)に示したように、図21のテーブル108には、−1≦h≦5なる範囲の各インデックスhに対応して、それぞれ、スカラ倍点−46A、18A、82A、146A、210A、274A、338Aのxy座標が記憶されている。
よって、図9のステップS106に相当する図10の処理と、図9のステップS107〜S111により、最終的には、式(10.39)のようにスカラ倍点dAのxy座標が計算される。なお、この式(10.39)と図9および図10との対応関係は、第1実施形態の式(9.36)に関する説明から明らかなので、説明を省略する。
dA=2(23(23(23(O)+tab[w[2]])+tab[w[1]])-tab[-w[0]]+cA)+d[0]A (10.39)
dA=2(23(23(23(O)+tab[w[2]])+tab[w[1]])-tab[-w[0]]+cA)+d[0]A (10.39)
そして、この式(10.39)の右辺において、ステップS109の2倍算の対象を示す部分を変形すると、次の式(10.40)が得られる。式(10.40)も、第2実施形態において式(8.9)が成立することを示している。
23(23(23(O)+tab[2])+tab[3])-tab[0]+cA
=8(8(O+146A)+210A)-18A-18A
=8(1168A+210A)-36A
=8(1378A)-36A
=10988A (10.40)
23(23(23(O)+tab[2])+tab[3])-tab[0]+cA
=8(8(O+146A)+210A)-18A-18A
=8(1168A+210A)-36A
=8(1378A)-36A
=10988A (10.40)
そして、図21に例示するように、式(10.15)のダミー鍵eは、式(10.41)または(10.42)に示す個人鍵dから得られる。図21には、例として、式(10.42)の個人鍵dを示してある。
d=(101010111011000)2=21976 (10.41)
d=(101010111011001)2=21977 (10.42)
d=(101010111011000)2=21976 (10.41)
d=(101010111011001)2=21977 (10.42)
個人鍵dが式(10.41)で示される場合、式(10.41)よりd[0]=0なので、式(10.40)を式(10.39)の右辺に代入すると、式(10.43)が得られる。
2(10988A)+d[0]A=21976A+O=21976A=dA (10.43)
2(10988A)+d[0]A=21976A+O=21976A=dA (10.43)
また、個人鍵dが式(10.42)で示される場合、式(10.42)よりd[0]=1なので、式(10.40)を式(10.39)の右辺に代入すると、式(10.44)が得られる。
2(10988A)+d[0]A=21976A+A=21977A=dA (10.44)
2(10988A)+d[0]A=21976A+A=21977A=dA (10.44)
以上から、第2実施形態によれば、図9、10、19に示した処理により、確かに所望の点dAが得られる。
さて、第2実施形態では、スカラ倍点情報格納部308に格納されるスカラ倍点情報tab[h]に対応するインデックスhの範囲は、−1≦h≦2k−1+1である。よって、第2実施形態において、スカラ倍点情報格納部308が有するテーブルのエントリ数は、(2k−1+3)個である。
図22は、ウィンドウサイズkが3の場合のテーブルデータのエントリ数に関して、第2実施形態と第3の比較例と第4の比較例を比べる図である。
図22において、テーブル106と107は図14と同じである。つまり、テーブル106は、第4の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル107は第3の比較例として説明したランダム化ウィンドウ法のテーブルである。
図22において、テーブル106と107は図14と同じである。つまり、テーブル106は、第4の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル107は第3の比較例として説明したランダム化ウィンドウ法のテーブルである。
そして、テーブル109が、第2実施形態においてスカラ倍点情報格納部308がスカラ倍点情報を記憶するためのテーブルである。k=3なので、テーブル109には、−1≦h≦23−1+1=5なる各インデックスhについて、テーブルデータtab[h]として点(h×2b+s)Aのxy座標が格納されている。つまり、テーブル109のエントリ数は7個である。
以上のテーブル106、107、109を比較すると、第2実施形態のテーブル109は、PA攻撃に対して安全な方法を提供しつつ、テーブル106と同様にエントリ数が2k−1のオーダに抑えられているという利点を持つ。つまり、第2実施形態のテーブル109は、テーブル106と比べて安全性の点で優位であり、テーブル107と比べてメモリ消費量が少ない点で優位である。
さて、続いて第3実施形態について説明する。第3実施形態は、スカラ倍点情報格納部308のインデックスとして使われる可能性がある値の範囲を第2実施形態よりも狭めることで、さらにメモリの節約を図る実施形態である。
そこで、第3実施形態に関しては、まず、どのようにしたらインデックスの範囲を狭めることが可能なのかについて、図23を参照して説明する。その後、図24〜27を参照して第3実施形態における暗号処理装置300の動作の詳細を説明する。
図23は、第3実施形態によるメモリ使用量の削減について説明する図である。以下、図23を、第2実施形態に関する図17および18と比較しながら説明する。
具体的には第3実施形態では、乱数値sを非ゼロの値に限定することで、インデックスの範囲が狭まり、スカラ倍点情報格納部308のメモリ使用量が減る。乱数値sを非ゼロの値に限定することでメモリ使用量が減る理由は、第2実施形態についてs=0の場合とs>0の場合に分けて検討すると、明らかである。以下、図17、18、23を参照して、その理由について説明する。
具体的には第3実施形態では、乱数値sを非ゼロの値に限定することで、インデックスの範囲が狭まり、スカラ倍点情報格納部308のメモリ使用量が減る。乱数値sを非ゼロの値に限定することでメモリ使用量が減る理由は、第2実施形態についてs=0の場合とs>0の場合に分けて検討すると、明らかである。以下、図17、18、23を参照して、その理由について説明する。
図17と18において、矩形E211が示す範囲は、式(10.10)のとおりであり、矩形E213が示す範囲は、式(10.9)のとおりである。このように、図17と18に示した矩形E211とE213がそれぞれ表す範囲は、境界値が範囲内に含まれるか否かという点以外は同じである。
そこで、図示の便宜上、図23では矩形E211とE213の代わりに、矩形E211が表す範囲と矩形E213が表す範囲の和(union)を示す矩形を用いることにする。矩形E211が表す範囲と矩形E213が表す範囲の和は、式(10.9)と(10.10)より、式(11.1)のとおりである。
-s≦diff≦2k+b-1-s (11.1)
-s≦diff≦2k+b-1-s (11.1)
よって、s=0の場合は、矩形E211が表す範囲と矩形E213が表す範囲の和は、式(11.1)より式(11.2)のとおりであり、式(11.2)の範囲が図23では矩形E231により表されている。
0≦diff≦2k+b-1 (11.2)
0≦diff≦2k+b-1 (11.2)
また、s>0の場合は、矩形E211が表す範囲と矩形E213が表す範囲の和は、式(11.1)より式(11.3)のとおりであり、式(11.3)の範囲が図23では矩形E251により表されている。
-s≦diff≦2k+b-1-s<2k+b-1 (11.3)
-s≦diff≦2k+b-1-s<2k+b-1 (11.3)
また、図17と18において、矩形E212が示す範囲は、式(10.11)のとおりであり、矩形E214が示す範囲は、式(10.13)のとおりである。このように、図17と18に示した矩形E212とE214がそれぞれ表す範囲は、境界値が範囲内に含まれるか否かという点以外は同じである。
そこで、図示の便宜上、図23では矩形E212とE214の代わりに、矩形E212が表す範囲と矩形E214が表す範囲の和を示す矩形を用いることにする。矩形E212が表す範囲と矩形E214が表す範囲の和は、式(10.11)と(10.13)より、式(11.4)のとおりである。
-2k+b-1+s≦diff≦s-1 (11.4)
-2k+b-1+s≦diff≦s-1 (11.4)
よって、s=0の場合は、矩形E212が示す範囲と矩形E214が表す範囲の和は、式(11.4)より式(11.5)のとおりであり、式(11.5)の範囲が図23では矩形E232により表されている。
-2k+b-1≦diff≦-1 (11.5)
-2k+b-1≦diff≦-1 (11.5)
したがって、矩形E232が表す式(11.5)の範囲の符号を反転すると、式(11.6)のとおりである。式(11.6)の範囲は、図23では矩形E242により表されている。
1≦-diff≦2k+b-1 (11.6)
1≦-diff≦2k+b-1 (11.6)
また、s>0の場合は、矩形E212が示す範囲と矩形E214が表す範囲の和は、図23では矩形E252により表されている。そして、矩形E252が表す範囲の符号を反転すると、式(11.7)のとおりである。式(11.7)の範囲は、図23では矩形E262により表されている。
-2b<-s+1≦-diff≦2k+b-1-s<2k+b-1 (11.7)
-2b<-s+1≦-diff≦2k+b-1-s<2k+b-1 (11.7)
したがって、キャリー補正の影響がないと仮定すると、s=0のときのインデックスの範囲U3は、式(11.2)と式(11.6)より、0以上2k+b−1以下の(k+b)ビット値の上位kビットがとりうる範囲である。すなわち、範囲U3は、0以上2k−1以下であり、図23のようにk=2、b=3の場合は、0以上2以下である。
それに対して、キャリー補正の影響がないと仮定した場合におけるs>0のときのインデックスの範囲U4は、式(11.3)と式(11.7)より、−s以上(2k+b−1−s)以下の(k+b)ビット値の上位kビットがとりうる範囲である。そして、0<s<2bであり、−0=+0=0なので、範囲U4は、0以上(2k−1−1)以下であり、図23のようにk=2、b=3の場合は、0以上1以下である。
つまり、乱数値sを非ゼロの値に限定することで、キャリー補正前のウィンドウ値に対応するインデックスの範囲から、2k−1が除外される。したがって、キャリー補正を考慮すると、乱数値sを非ゼロの値に限定することで(2k−1+1)というインデックスの必要性をなくせる。よって、乱数値sを非ゼロの値に限定することで、スカラ倍点情報格納部308のエントリ数が、第2実施形態よりも1つ減る。
例えば、図23のようにk=2、b=3の場合は、s=0ならば、インデックスの範囲は−1から3(=2k−1+1)であり、スカラ倍点情報格納部308のテーブルには5つのインデックスに対応する5つのエントリが含まれる。それに対して、s>0ならば、インデックスの範囲は−1から2(=2k−1)であり、スカラ倍点情報格納部308のテーブルには4つのインデックスに対応する4つのエントリが含まれる。
このように、第3実施形態によれば、乱数生成部305が生成する乱数値sを非ゼロの値に限定するだけで、スカラ倍点情報格納部308のメモリ消費量のさらなる削減が達成される。
以下では、以上説明した第3実施形態について、さらに具体的に説明する。
図24は、第3実施形態において暗号処理装置300がウィンドウ列w[i]と乱数列s[i]と補正値cを決定する処理のフローチャートである。すなわち、図24は、第3実施形態における、図9のステップS103のフローチャートである。
図24は、第3実施形態において暗号処理装置300がウィンドウ列w[i]と乱数列s[i]と補正値cを決定する処理のフローチャートである。すなわち、図24は、第3実施形態における、図9のステップS103のフローチャートである。
図24のステップS501は、第2実施形態に関する図19のステップS401と同様であり、図24のステップS503〜S523は、図19のステップS403〜S423と同様である。よって、これらのステップについては説明を割愛する。
図24において、第2実施形態に関する図19と異なるのは、ステップS502である。ステップS502において乱数生成部305は、bビットで、かつ非ゼロの乱数値sを生成する。なお、説明の簡単化のため、乱数値sは正とする。乱数値sが負の場合については、第3実施形態の変形例として後述する。よって、ステップS502で生成される乱数値sは式(11.8)を満たす。
0<s≦2b-1 (11.8)
0<s≦2b-1 (11.8)
続いて、図25A〜26を参照して、第3実施形態における図9、10、24の処理の具体例を説明する。
図9のステップS102で処理部301が得たダミー鍵eが、式(11.9)に示す15ビットの値であるとする。なお、式(11.9)に対応する個人鍵dの具体例は、図26とともに後述する。
e=(011001000111110)2=12862 (11.9)
e=(011001000111110)2=12862 (11.9)
続いて、図9のステップS103に相当する図24の処理が開始される。なお、図25A〜26の例では、ウィンドウサイズkは3であり、乱数値sのビット長bは6であるとする。したがって、式(9.9)と同じく、m=3である。
図24の処理が開始されると、ステップS501で判断部302は、式(11.10)のように符号つき(k+b)ビット値dHを初期化する。
dH=e[14]||…||e[6]=(011001000)2=200 (11.10)
dH=e[14]||…||e[6]=(011001000)2=200 (11.10)
また、ステップS502で乱数生成部305が、b(=6)ビットの非ゼロの乱数値sとして式(11.11)の値を生成したとする。
s=(100110)2=38 (11.11)
s=(100110)2=38 (11.11)
すると、続くステップS503では、処理部301がループ変数iを2(=m−1)に初期化する。そして、ステップS504で判断部302は、式(11.10)の符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。式(11.10)より、符号つき(k+b)ビット値dHは、符号が正でMSBの値が0なので、範囲R3に属する。
よって、決定部303は、ステップS510で乱数値s[2]を式(11.12)のとおり+sに決定し、ステップS511でウィンドウ補正値t[2]を式(11.13)のとおり0に決定する。また、ウィンドウ補正値t[2]が0なので、キャリー補正は行われない。
s[2]=+s=38=(100110)2 (11.12)
t[2]=0=(0000000000)2 (11.13)
s[2]=+s=38=(100110)2 (11.12)
t[2]=0=(0000000000)2 (11.13)
そして、ステップS515で決定部303は、式(9.3)にしたがい、具体的には式(11.14)のようにして、補正済み差分値diffを計算する。
diff=dH-s[2]+t[2]
=200-38+0
=162
=2×26+34
=(010100010)2
=(010 || 100010)2 (11.14)
diff=dH-s[2]+t[2]
=200-38+0
=162
=2×26+34
=(010100010)2
=(010 || 100010)2 (11.14)
さらに、ステップS516で決定部303は、式(11.15)のようにウィンドウ値w[2]を計算する。なお、ここで得られるウィンドウ値w[2]は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (11.15)
w[2]=diff[8]||diff[7]||diff[6]=(010)2=2 (11.15)
また、i=2なので、処理がステップS518に進む。ステップS518で判断部302は、式(9.5)にしたがい、具体的には式(11.16)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=34×23+(111)2
=272+7
=279
=(100010111)2 (11.16)
dH=(diff[5]||…||diff[0])23+(e[5]||…||e[3])
=34×23+(111)2
=272+7
=279
=(100010111)2 (11.16)
その後、ステップS520で処理部301がループ変数iをデクリメントするのでi=1となる。そして、i≧0なので処理はステップS521からステップS504に戻る。
ステップS504では、判断部302が、式(11.16)のように更新された符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。符号つき(k+b)ビット値dHは、符号が正でありMSBの値が1なので、範囲R4に属する。
よって、決定部303は、ステップS512で乱数値s[1]を式(11.17)のとおり−sに決定し、ステップS513でウィンドウ補正値t[1]を式(11.18)のとおり−2k+bに決定する。
s[1]=-s=-38=-(100110)2 (11.17)
t[1]=-2k+b=-29=-(1000000000)2 (11.18)
s[1]=-s=-38=-(100110)2 (11.17)
t[1]=-2k+b=-29=-(1000000000)2 (11.18)
そして、ウィンドウ補正値t[1]が非ゼロなので、ステップS514で決定部303はキャリー補正を行う。すなわち、決定部303は、式(11.15)で求めたウィンドウ値w[2]に1を足す。その結果、ウィンドウ値w[2]は式(11.19)の値に確定する。
w[2]=2+1=3 (11.19)
w[2]=2+1=3 (11.19)
さらに、ステップS515で決定部303は、式(9.3)にしたがい、具体的には式(11.20)のようにして、補正済み差分値diffを計算する。
diff=dH-s[1]+t[1]
=279+38-512
=-195
=-3×26-3
=-(011000011)2
=-(011 || 000011)2 (11.20)
diff=dH-s[1]+t[1]
=279+38-512
=-195
=-3×26-3
=-(011000011)2
=-(011 || 000011)2 (11.20)
そして、ステップS516で決定部303は、式(11.21)のようにウィンドウ値w[1]を計算する。なお、ここで得られるウィンドウ値w[1]は、後にキャリー補正によってインクリメントまたはデクリメントされる潜在的可能性があるので、まだ確定していない。
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3 (11.21)
w[1]=diff[8]||diff[7]||diff[6]=-(011)2=-3 (11.21)
また、i=1なので、処理がステップS518に進む。ステップS518で判断部302は、式(9.5)にしたがい、具体的には式(11.22)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-3×23+(110)2
=-24+6
=-18
=-(000010010)2 (11.22)
dH=(diff[5]||…||diff[0])23+(e[2]||…||e[0])
=-3×23+(110)2
=-24+6
=-18
=-(000010010)2 (11.22)
その後、ステップS520で処理部301がループ変数iをデクリメントするのでi=0となる。そして、i≧0なので処理はステップS521からステップS504に戻る。
ステップS504では、判断部302が、式(11.22)のように更新された符号つき(k+b)ビット値dHがどの範囲に属するかを判断する。符号つき(k+b)ビット値dHは、符号が負でありMSBの値が0なので、範囲R2に属する。
よって、決定部303は、ステップS508で乱数値s[0]を式(11.23)のとおり−sに決定し、ステップS509でウィンドウ補正値t[0]を式(11.24)のとおり0に決定する。また、ウィンドウ補正値t[0]が0なので、ウィンドウ値w[1]へのキャリー補正は行われず、ウィンドウ値w[1]は式(11.21)の値に確定する。
s[0]=-s=-38=-(100110)2 (11.23)
t[0]=0=(0000000000)2 (11.24)
s[0]=-s=-38=-(100110)2 (11.23)
t[0]=0=(0000000000)2 (11.24)
そして、ステップS515で決定部303は、式(9.3)にしたがい、具体的には式(11.25)のようにして、補正済み差分値diffを計算する。
diff=dH-s[0]+t[0]
=-18+38+0
=20
=(000010100)2
=(000 || 010100)2 (11.25)
diff=dH-s[0]+t[0]
=-18+38+0
=20
=(000010100)2
=(000 || 010100)2 (11.25)
さらに、ステップS516で決定部303は、式(11.26)のようにウィンドウ値w[0]を計算する。なお、ウィンドウ値w[0]は、最下位のウィンドウ値なのでキャリー補正されることはなく、ここで値が確定する。
w[0]=diff[8]||diff[7]||diff[6]=(000)2=0 (11.26)
w[0]=diff[8]||diff[7]||diff[6]=(000)2=0 (11.26)
また、i=0なので処理がステップS519に進む。そして、ステップS519で判断部302は、式(9.6)にしたがい、具体的には式(11.27)のようにして、符号つき(k+b)ビット値dHを更新する。
dH=(diff[5]||…||diff[0])=(010100)2=20 (11.27)
dH=(diff[5]||…||diff[0])=(010100)2=20 (11.27)
その後、ステップS520で処理部301がループ変数iをデクリメントするのでi=−1となる。よって、i<0なので処理はステップS521からステップS522に進む。したがって、ステップS522で決定部303は、式(11.28)のとおり補正値cを得る。
c=dH=20 (11.28)
c=dH=20 (11.28)
最後に、ステップS523で決定部303は、式(11.29)に示すウィンドウ列w[i]と、式(11.30)に示す乱数列s[i]をウィンドウ演算部309に出力し、式(11.28)に示す補正値cを補正部310に出力する。式(11.29)は、式(11.19)、式(11.21)、式(11.26)から明らかであり、式(11.30)は、式(11.12)、式(11.17)、式(11.23)から明らかである。
w[2]= 3, w[1]= -3, w[0]= 0 (11.29)
s[2]=38, s[1]=-38, s[0]=-38 (11.30)
w[2]= 3, w[1]= -3, w[0]= 0 (11.29)
s[2]=38, s[1]=-38, s[0]=-38 (11.30)
以上のようにして、図9のステップS103に相当する図11の処理が終了すると、図9のステップS104で取得部306が点Aのxy座標を取得する。そして、ステップS105でスカラ倍算部307が、−1≦h≦2k−1=4なる範囲の各インデックスhについて、乱数s=38(式(11.11)参照)に応じたスカラ倍点情報として、式(11.31)のランダム化テーブルデータtab[h]を生成する。
tab[h]=(2bh+s)A=(26h+38)A=(64h+38)A (11.31)
tab[h]=(2bh+s)A=(26h+38)A=(64h+38)A (11.31)
そして、スカラ倍点情報格納部308は、生成されたランダム化テーブルデータtab[h]を、インデックスhと対応づけて格納する。
図26は、以上のようにして得られた、ウィンドウ列w[i]と乱数列s[i]と補正値cを示すとともに、スカラ倍点情報格納部308がランダム化テーブルデータtab[h]を保持するテーブル110を示す図である。
図24〜25Bを参照して上記で説明した処理によれば、図26に示すとおり、式(8.9)が成立する。具体的には、図24〜25Bの例におけるk=3、b=6、m=3、e=12862という値および式(11.28)〜(11.30)に示した値を式(8.9)の各変数に代入すると、下記の式(11.32)が得られる。
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=20+64×0+1×(-38)+512×(-3)+8×(-38)+4096×3+64×38
=12862 (11.32)
c+26w[0]+20s[0]+29w[1]+23s[1]+212w[2]+26s[2]
=20+64×0+1×(-38)+512×(-3)+8×(-38)+4096×3+64×38
=12862 (11.32)
また、式(11.31)に示したように、図26のテーブル110には、−1≦h≦4なる範囲の各インデックスhに対応して、それぞれ、スカラ倍点−26A、38A、102A、166A、230A、294Aのxy座標が記憶されている。
よって、図9のステップS106に相当する図10の処理と、図9のステップS107〜S111により、最終的には、式(11.33)のようにスカラ倍点dAのxy座標が計算される。なお、この式(11.33)と図9および図10との対応関係は、第1実施形態の式(9.36)に関する説明から明らかなので、説明を省略する。
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A (11.33)
dA=2(23(23(23(O)+tab[w[2]])-tab[-w[1]])-tab[-w[0]]+cA)+d[0]A (11.33)
なお、この式(11.33)の右辺において、ステップS109の2倍算の対象を示す部分を変形すると、次の式(11.34)が得られる。式(11.34)も、第3実施形態において式(8.9)が成立することを示している。
23(23(23(O)+tab[3])-tab[3])-tab[0]+20A
=8(8(O+230A)-230A)-38A+20A
=8(1840A-230A)-18A
=8(1610A)-18A
=12862A (11.34)
23(23(23(O)+tab[3])-tab[3])-tab[0]+20A
=8(8(O+230A)-230A)-38A+20A
=8(1840A-230A)-18A
=8(1610A)-18A
=12862A (11.34)
そして、図26に例示するように、式(11.9)のダミー鍵eは、式(11.35)または(11.36)に示す個人鍵dから得られる。図21には、例として、式(11.35)の個人鍵dを示してある。
d=(110010001111100)2=25724 (11.35)
d=(110010001111101)2=25725 (11.36)
d=(110010001111100)2=25724 (11.35)
d=(110010001111101)2=25725 (11.36)
個人鍵dが式(11.35)で示される場合、式(11.35)よりd[0]=0なので、式(11.34)を式(11.33)の右辺に代入すると、式(11.37)が得られる。
2(12862A)+d[0]A=25724A+O=25724A=dA (11.37)
2(12862A)+d[0]A=25724A+O=25724A=dA (11.37)
また、個人鍵dが式(11.36)で示される場合、式(11.36)よりd[0]=1なので、式(11.34)を式(11.33)の右辺に代入すると、式(11.38)が得られる。
2(12862A)+d[0]A=25724A+A=25725A=dA (11.38)
2(12862A)+d[0]A=25724A+A=25725A=dA (11.38)
以上から、第3実施形態によれば、図9、10、24に示した処理により、確かに所望の点dAが得られる。
さて、第3実施形態では、スカラ倍点情報格納部308に格納されるスカラ倍点情報tab[h]に対応するインデックスhの範囲は、−1≦h≦2k−1である。よって、第3実施形態においてスカラ倍点情報格納部308が有するテーブルのエントリ数は、(2k−1+2)個である。
図27は、ウィンドウサイズkが3の場合のテーブルデータのエントリ数に関して、第3実施形態と第3の比較例と第4の比較例を比べる図である。
図27において、テーブル106と107は図14と同じである。つまり、テーブル106は、第4の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル107は第3の比較例として説明したランダム化ウィンドウ法のテーブルである。
図27において、テーブル106と107は図14と同じである。つまり、テーブル106は、第4の比較例として説明した符号つきウィンドウ法のテーブルであり、テーブル107は第3の比較例として説明したランダム化ウィンドウ法のテーブルである。
そして、テーブル111が、第3実施形態においてスカラ倍点情報格納部308がスカラ倍点情報を記憶するためのテーブルである。k=3なので、テーブル111には、−1≦h≦23−1=4なる各インデックスhについて、テーブルデータtab[h]として点(h×2b+s)Aのxy座標が格納されている。つまり、テーブル111のエントリ数は6個である。
以上のテーブル106、107、111を比較すると、第3実施形態のテーブル111は、PA攻撃に対して安全な方法を提供しつつ、テーブル106と同様にエントリ数が2k−1のオーダに抑えられているという利点を持つ。つまり、第3実施形態のテーブル111は、テーブル106と比べて安全性の点で優位であり、テーブル107と比べてメモリ消費量が少ない点で優位である。
ところで、本発明は上記の第1〜第3実施形態に限られるものではない。
例えば、個人鍵dの長さu、ウィンドウサイズk、および乱数値sの長さbに関して、上記の説明では便宜上、具体的な数値をいくつか例示した。しかし、u、k、bの具体的な値は実施形態に応じて任意である。また、kやbの具体的な値は、暗号処理装置300を含む暗号通信システムにおけるシステムパラメタとして固定的に予め決められていてもよいし、暗号処理装置300によって決められる可変値であってもよい。
例えば、個人鍵dの長さu、ウィンドウサイズk、および乱数値sの長さbに関して、上記の説明では便宜上、具体的な数値をいくつか例示した。しかし、u、k、bの具体的な値は実施形態に応じて任意である。また、kやbの具体的な値は、暗号処理装置300を含む暗号通信システムにおけるシステムパラメタとして固定的に予め決められていてもよいし、暗号処理装置300によって決められる可変値であってもよい。
また、第1実施形態では、処理部301は、s[i]=+sと仮定してウィンドウ値w[i]を見積もる。しかし、実施形態によっては、処理部301は、s[i]=−sと仮定してウィンドウ値w[i]を見積もってもよい。
また、第1〜第3実施形態では、決定部303がウィンドウ演算部309に乱数列s[i]を出力している。しかし、図10のステップS207に示すように、ウィンドウ演算部309は、「乱数値s[i]が+sなのか、それとも−sなのか」ということさえ認識することさえできればよい。
したがって、実施形態によっては、決定部303は、乱数列s[i]自体をウィンドウ演算部309に出力する代わりに、各iについて「乱数値s[i]が+sなのか、それとも−sなのか」ということを示す情報をウィンドウ演算部309に出力してもよい。例えば、決定部303は、乱数列s[i]の代わりに、各iに対応する1ビットのフラグの列(すなわち合計mビットのフラグ列)を出力してもよい。
また、第1〜第3実施形態では、最上位のキャリー補正値を適切に扱うためのテクニックとして、ダミー鍵eが導入されている。しかし、実施形態に応じて、最上位のキャリー補正値を適切に扱うための別のテクニックが使われてもよい。以下に、2つのテクニックを例示する。
1つ目のテクニックは、ダミー鍵eを使わない方法である。すなわち、この1つ目のテクニックによれば、図9のステップS102が省略され、ステップS103に相当する図11、19、または24の処理では、ダミー鍵eの代わりに個人鍵dそのものが使われる。例えば、図11のステップS301(または、図19のステップS401もしくは図24のステップS501)で判断部302は、式(9.1)の代わりに式(12.1)により、符号つき(k+b)ビット値dHを初期化する。
dH=d[b+km-1]||…||d[k(m-1)] (12.1)
dH=d[b+km-1]||…||d[k(m-1)] (12.1)
また、図11のステップS318(または、図19のステップS418もしくは図24のステップS518)で判断部302は、式(9.5)の代わりに式(12.2)により、符号つき(k+b)ビット値dHを更新する。
dH=(diff[b-1]||…||diff[0])2k+(d[ki-1]||…||d[k(i-1)]) (12.2)
dH=(diff[b-1]||…||diff[0])2k+(d[ki-1]||…||d[k(i-1)]) (12.2)
このようにダミー鍵eが使われない場合、個人鍵dのMSBであるd[u−1]の値が1である可能性がある。よって、たとえi=m−1であっても、図11のステップS304で判断基準値(dH−s)が範囲R4に属すると判断されて、キャリー補正が生じる可能性がある。あるいは、たとえi=m−1であっても、図19のステップS404または図24のステップS504で符号つき(k+b)ビット値dHが範囲R4に属すると判断されて、キャリー補正が生じる可能性がある。
そこで、この1つ目のテクニックでは、i=m−1のときに図11のステップS314(または、図19のステップS414もしくは図24のステップS514)を実行する場合、決定部303は、ウィンドウ値w[m]を1と設定する。つまり、決定部303は、ウィンドウ値w[m]の初期値を0とみなしてキャリー補正を行う。
こうして設定されるウィンドウ値w[m]は、uビットの個人鍵dの範囲を超えた上位の桁に対応する。すなわち、ウィンドウ値w[m]は、説明の便宜上、ここでは“w[m]”という記号を用いて「ウィンドウ値」と呼んでいるが、キャリー補正値を表すだけであり、テーブルデータを引くためのインデックスとしては利用されない。
そして、この1つ目のテクニックでは、図9のステップS106に相当する図10の処理のステップS201の初期化が、点Vを式(12.3)のように設定する処理に置き換えられる。
V=2bw[m]A (12.3)
V=2bw[m]A (12.3)
式(12.3)のように点Vを設定するには、ウィンドウ演算部309は、具体的には次のように動作すればよい。すなわち、ウィンドウ演算部309は、最上位のキャリー補正値を表すウィンドウ値w[m]が0か1かを判断する。そして、ウィンドウ演算部309は、w[m]=0ならば変数Vに無限遠点Oを格納し、w[m]=1ならば変数Vに点Aを格納する。その後、ウィンドウ演算部309は、「点Vに対して2倍算を行い、2倍算の結果を新たに変数Vに格納する」という処理をb回繰り返す。
なお、図10のステップS202以降の処理と、図9のステップS107〜S108には変更はない。また、この1つ目のテクニックではダミー鍵eを使わないので、ダミー鍵eを使うための後処理である図9のステップS109〜S111は省略される。
すると、例えばm=4の場合、ステップS112で補正部310が出力する点は、式(12.4)のとおり、所望の点dAである。なお、式(12.4)における“±tab[±w[i]]”なる記法は、「s[i]=+sならば+tab[w[i]]、s[i]=−sならば−tab[−w[i]]」ということを示すための省略記法である。
dA=2k(2k(2k(2k+b(w[4]A)±tab[±w[3]])±tab[±w[2]])±tab[±w[1]])
±tab[±w[0]]+cA (12.4)
dA=2k(2k(2k(2k+b(w[4]A)±tab[±w[3]])±tab[±w[2]])±tab[±w[1]])
±tab[±w[0]]+cA (12.4)
2つ目のテクニックは、上記の第1〜第3実施形態におけるのとは異なるダミー鍵を使う方法である。説明の便宜上、全ビットの値が0で長さzのビット列を“zero(z)”と表すことにすると、この2つ目のテクニックでは、図9のステップS102で処理部301は、式(8.6)のダミー鍵eの代わりに、式(12.6)のダミー鍵rを求める。以下、混乱を避けるため、「ダミー鍵r」のことを、「ダミー鍵e」とは別の「ゼロ埋めビット列」という名前で呼ぶことにする。
r=zero(z)||d (12.6)
r=zero(z)||d (12.6)
なお、この2つ目のテクニックでは、個人鍵d自体の長さではなく、ゼロ埋めビット列rの長さが記号“u”により表されるものとする。すなわち、個人鍵dの長さは(u−z)である。
そして、ゼロ埋めビット列rの長さuに関して式(8.4)が成立するように、整数m、乱数値sのビット長b、およびウィンドウサイズkの値が定められる。逆の観点から説明すれば、ゼロ埋めビット列rの生成のために個人鍵dに足されるビットの数zは、式(8.4)を満たす正整数mが存在するように、選ばれる。
なお、乱数値sが0以上に限定されている場合は、z=1でもよい。後述の変形例のように負の乱数値sを許す場合は、z>1である。また、例えば個人鍵dのビット長(u−z)と乱数値sのビット長bとウィンドウサイズkが、システムパラメタとして固定的に決められている環境などにおいては、好適な設定の一例は、z=kという設定である。
式(12.6)によれば、ゼロ埋めビット列rのMSBは0と保証される。したがって、図11のステップS304に関して説明したのと同じ理由から、i=m−1のときにキャリー補正が生じないことが保証される。よって、図9のステップS106に対応する図10の処理は、第1〜第3実施形態とまったく同じである。
また、式(12.6)によれば、個人鍵dとゼロ埋めビット列rは、ビット長が異なるだけで、表す数値は等しい。よって、この2つ目のテクニックを用いる場合、dA=rAであるから、図9のステップS109〜S111の後処理は不要であり、省略される。
以上説明した2つ目のテクニックによれば、処理部301は、式(8.1)が成立するという制約条件下で、ウィンドウ列w[i]と乱数列s[i]と補正値cを決定する。
なお、図9〜11、19、24に示した第1〜第3実施形態でのダミー鍵eを用いるテクニックと、上記2つのテクニックの共通点は次のとおりである。すなわち、いずれの場合においても、処理部301は、個人鍵dに基づくビット列Dと乱数値sを用いて、ビット列Dの長さuとウィンドウサイズkとの間にu=mk+bなる関係が成立する正整数mに関して、下記の値を定める。
・0≦i≦(m−1)なる各iに対応する符号つきkビット値のウィンドウ値w[i]
・0≦i≦(m−1)なる各iに対応する符号つきbビット値の乱数値s[i]
・補正値g
なお、図9〜11、19、24に示した第1〜第3実施形態でのダミー鍵eを用いるテクニックと、上記2つのテクニックの共通点は次のとおりである。すなわち、いずれの場合においても、処理部301は、個人鍵dに基づくビット列Dと乱数値sを用いて、ビット列Dの長さuとウィンドウサイズkとの間にu=mk+bなる関係が成立する正整数mに関して、下記の値を定める。
・0≦i≦(m−1)なる各iに対応する符号つきkビット値のウィンドウ値w[i]
・0≦i≦(m−1)なる各iに対応する符号つきbビット値の乱数値s[i]
・補正値g
つまり、第1〜第3実施形態は、式(12.7)におけるビット列Dと補正値gが、具体的には式(12.8)の場合に相当し、より具体的には、式(12.8)において右シフト量fが1の場合に相当する。後述のように乱数生成部305が負の乱数値sを生成する場合は、式(12.8)の右シフト量fは、2以上が適切である。
D=zero(f)||d[u-1]||…||d[f] かつ g=c (12.8)
D=zero(f)||d[u-1]||…||d[f] かつ g=c (12.8)
この式(12.9)の制約条件は、右シフト量fが1の場合の式(8.8)を一般化した制約条件である。また、任意のfに対してダミー鍵eは式(12.10)のとおりである。すなわち、式(12.10)は、右シフト量fが1の場合の式(8.7)を一般化した式である。
また、上記の1つ目のテクニックは、式(12.7)におけるビット列Dと補正値gが具体的には式(12.11)の場合に相当する。
D=d かつ g=2km+bw[m]+c (12.11)
D=d かつ g=2km+bw[m]+c (12.11)
そして、上記の2つ目のテクニックは、式(12.7)におけるビット列Dと補正値gが具体的には式(12.12)の場合に相当する。
D=zero(z)||d かつ g=c (12.12)
D=zero(z)||d かつ g=c (12.12)
ところで、上記の説明では、説明の簡単化のため乱数値sを非負と仮定したが、s≦0であってもよい。以下に、第1〜第3実施形態それぞれに関して、変形例として、s≦0あるいはs<0の場合を説明する。
図28は、0以下の乱数値を生成するように変形された第1実施形態において、スカラ倍点情報格納部308のインデックスとして使われる値の範囲について模式的に説明する図である。
図28において、矩形E301、E302、E303、E304は、それぞれ、第1実施形態に関する図15の矩形E101、E102、E103、E104と同じである。よって、乱数値s[i]が+sであるという仮定が正式に採用される場合(すなわち、判断基準値(dH−s)が範囲R1またはR3に属する場合)の補正済み差分値diffの範囲を示す矩形E311とE313も、図15の矩形E111とE113と同じである。
図15と28で異なるのは、乱数値s[i]が+sであるという仮定が妥当ではないという判断にしたがい、決定部303が乱数値s[i]を−sに決定する場合(すなわち、判断基準値(dH−s)が範囲R2またはR4に属する場合)である。
判断基準値(dH−s)が範囲R2に属する場合、図15の第1実施形態では、式(9.51)に示すように、矩形E102を+2s移動させた矩形E112が、補正済み差分値diffの範囲を示す。図28の変形例においても、矩形E302を+2s移動させた矩形E312が補正済み差分値diffの範囲を示す点は図15と同様である。ただし、図28の変形例では、s≦0であるから、+2sの移動とは、負の方向への移動であり、図15のような正の方向への移動ではない。
よって、矩形E312が表す範囲の符号を反転させた範囲を表す矩形E322の左端は|2s|の位置にあり、矩形E322の右端は(2k+b−1+|2s|)の位置にある。そして、乱数値sによっては、|2s|>2bとなることがあるので、矩形E322が示す範囲の上位kビットは、最大で、(2k−1+1)という値をとる可能性がある。
したがって、キャリー補正の影響を考慮に入れると、スカラ倍点情報格納部308のインデックスとして、(2k−1+2)なる値が使われる可能性がある。つまり、図15の第1実施形態と比べると、図28の変形例では、スカラ倍点情報格納部308において、(2k−1+2)なるインデックスに対応するエントリが増える。
判断基準値(dH−s)が範囲R4に属する場合についても同様の議論が成り立つ。すなわち、判断基準値(dH−s)が範囲R4に属する場合、図28においては、ウィンドウ補正を含めて(−2k+b+2s)だけ矩形E304を移動させた矩形E314が、補正済み差分値diffの範囲を示す。よって、矩形E314が表す範囲の符号を反転させた範囲を表す矩形E324の左端は|2s|の位置にあり、矩形E324の右端は(2k+b−1+|2s|)の位置にある。
したがって、矩形E324が示す範囲の上位kビットは、最大で、(2k−1+1)という値をとる可能性がある。つまり、キャリー補正の影響を考慮に入れると、スカラ倍点情報格納部308のインデックスとして、(2k−1+2)なる値が使われる可能性がある。
しかし、図15の第1実施形態と比べると、図28の変形例で不要となるエントリもある。すなわち、図15の第1実施形態では、矩形E122とE124の左端の位置が−2b以下の値に対応する可能性があるので、スカラ倍点情報格納部308は、キャリー補正の影響を考慮に入れて、−2(=−1−1)なるインデックスに対応するエントリを有する。ところが、図28の変形例では、この−2なるインデックスに対応するエントリは不要である。
なぜなら、図28に示すように、矩形E322とE324が表す範囲は、どちらも正の値のみを含むからである。つまり、図28の変形例では、補正済み差分値diffの符号を反転した−diffの上位kビットが−1になることはない。したがって、スカラ倍点情報格納部308には、−2なるインデックスに対応するエントリは不要である。
よって、乱数生成部305が0以下の乱数値sを生成するように変形された図28の変形例では、使われるインデックスの範囲が第1実施形態とは異なるが、エントリの数は同じである。
つまり、第1実施形態に関する図16と同様の形式で表現した図29にまとめたように、図28の変形例では、−1から(2k−1+2)までの(2k−1+4)個のインデックスが使われる。
図29には、図28の矩形E311、E312、E322、E313、E314、およびE324を示した。また、図28〜29は、ウィンドウサイズkが2であり、乱数値sが符号つき3ビット値である(すなわちb=3である)場合の例である。よって、図29に示すように、図28の変形例では、−1から(2k−1+2)まで(すなわち、−1から4まで)の各インデックスhに対応して、スカラ倍点情報格納部308は、テーブルデータtab[h]=(h×23+s)Aを保持する。
続いて、第2実施形態の変形例について説明する。図30は、0以下の乱数値を生成するように変形された第2実施形態において、スカラ倍点情報格納部のインデックスとして使われる値の範囲について模式的に説明する図である。
図30において、矩形E401、E402、E403、E404は、それぞれ、第2実施形態に関する図18の矩形E201、E202、E203、E204と同じである。
そして、判断基準として使われる符号つき(k+b)ビット値dHが範囲R1に属する場合の補正済み差分値diffの範囲は、図18では、右端が(2k+b−1−s)の位置にある矩形E211により示される。同様に、符号つき(k+b)ビット値dHが範囲R3に属する場合の補正済み差分値diffの範囲は、図18では、右端が(2k+b−1−s)の位置にある矩形E213により示される。
そして、判断基準として使われる符号つき(k+b)ビット値dHが範囲R1に属する場合の補正済み差分値diffの範囲は、図18では、右端が(2k+b−1−s)の位置にある矩形E211により示される。同様に、符号つき(k+b)ビット値dHが範囲R3に属する場合の補正済み差分値diffの範囲は、図18では、右端が(2k+b−1−s)の位置にある矩形E213により示される。
それに対して、図30の変形例では、s≦0なので、符号つき(k+b)ビット値dHが範囲R1に属する場合の補正済み差分値diffの範囲は、右端が(2k+b−1−s)=(2k+b−1+|s|)の位置にある矩形E411により示される。同様に、符号つき(k+b)ビット値dHが範囲R3に属する場合の補正済み差分値diffの範囲は、右端が(2k+b−1+|s|)の位置にある矩形E413により示される。
ただし、乱数値sは符号つきbビット値なので、|s|<2bである。よって、矩形E411または矩形E413が示す範囲の右端に対応する値の上位kビットは、2k−1より大きくはない。つまり、矩形E411と矩形E413の右端が2k+b−1の位置より右にあっても、インデックスの増加にはつながらない。
また、判断基準として使われる符号つき(k+b)ビット値dHが範囲R2に属する場合の補正済み差分値diffの範囲は、図18では、右端がsの位置にある矩形E212により示される。したがって、図18では、インデックスの範囲を示す矩形E222の左端の位置は、−sの位置である。同様に、符号つき(k+b)ビット値dHが範囲R4の補正済み差分値diffの範囲は、図18では、右端がsの位置にある矩形E214により示される。したがって、図18ではインデックスの範囲を示す矩形E224の左端の位置は、−sの位置である。
それに対して、図30の変形例では、s≦0なので、符号つき(k+b)ビット値dHが範囲R2に属する場合の補正済み差分値diffの範囲は、右端がs=−|s|の位置にある矩形E412により示される。したがって、図30では、インデックスの範囲を示す矩形E422の左端の位置は、|s|の位置であり、0よりも右側である。また、矩形E422の右端の位置は、(2k+b−1+|s|)の位置であり、2k+b−1の位置より右である。しかし、|s|<2bなので、矩形E422の右端が2k+b−1の位置より右にあっても、インデックスの増加にはつながらない。
同様のことは符号つき(k+b)ビット値dHが範囲R4に属する場合の補正済み差分値diffの範囲を示す矩形E414と、矩形E414が示す範囲の符号を反転させた範囲を示す矩形E424についても成り立つ。すなわち、インデックスの範囲を示す矩形E424は、右端が2k+b−1の位置より右にあるが、インデックスの増加をもたらすことはない。
以上から、第2実施形態は、たとえ乱数生成部305が0以下の乱数値を生成するように変形されても、スカラ倍点情報格納部308で使われるインデックスの範囲は変わらない。
ただし、乱数値sが非ゼロに限定される第3実施形態は、乱数生成部305が負の乱数値を生成するように変形されると、図31を参照して以下に説明するとおり、インデックスの個数も変わってしまう。
図31は、0以下の乱数値を生成するように変形された第2実施形態と、負の乱数値を生成するように変形された第3実施形態において、インデックスとして使われる値についてまとめた図である。図31は、第3実施形態によるメモリ使用量の削減について説明する図23と同様の形式の図である。すなわち、図31では、乱数値sが負の場合と、乱数値sが0の場合が別々に図示されている。
乱数値sが負の場合に関して、図31には、図30の矩形E411が表す範囲と矩形E413が表す範囲の和を表す矩形E431と、図30の矩形E412が表す範囲と矩形E414が表す範囲の和を表す矩形E432が示されている。また、図31には、矩形E432が表す範囲の符号を反転させた範囲を表す矩形E442も示されている。
図31に示すとおり、s<0のとき、0<|s|なので、矩形E431と矩形E442が表す範囲は正の値のみを含む。また、0<|s|なので、矩形E431と矩形E442の右端は、2k−1なるインデックスに対応する位置よりも右にある。したがって、乱数値sを非ゼロに限定したs<0の場合であっても、キャリー補正の影響がない段階で、2k−1なるインデックスが使われる可能性があり、キャリー補正を考慮に入れると、(2k−1+1)なるインデックスが使われる可能性がある。
また、乱数値sが0の場合に関して、図31には、図30の矩形E411が表す範囲と矩形E413が表す範囲の和を表す矩形E451と、図30の矩形E412が表す範囲と矩形E424が表す範囲の和を表す矩形E452が示されている。また、図31には、矩形E452が表す範囲の符号を反転させた範囲を表す矩形E462も示されている。
図31に示すとおり、s=0の場合は、インデックスの範囲を示す矩形E451と矩形E462は、図23の矩形E231とE242と同じである。よって、第2実施形態と同じく、図30の変形例でs=0の場合、キャリー補正を考慮に入れると、−1から(2k−1+1)までのインデックスが使われる可能性がある。
つまり、第3実施形態には、乱数値sを非ゼロに限定することでメモリ消費量を第2実施形態よりも少なくする効果があるが、乱数生成部305が負の乱数値を生成する変形例では、乱数値sを非ゼロに限定しても、エントリ数は変わらない。逆の観点から説明すれば、単に乱数値sを非ゼロの値に限定するのではなく、第3実施形態のように乱数値sを正の非ゼロの値に限定することで、メモリ消費量の削減効果が生まれる。
以上、いくつかの観点から様々な変形例について説明したが、第1〜第3実施形態および以上の様々な変形例について概括すれば下記のとおりである。
処理部301は、個人鍵格納部304から楕円曲線暗号における個人鍵dを読み出し、処理対象のビット列Dを認識する。処理部301は、個人鍵d自体を処理対象のビット列Dとして認識してもよい。あるいは、処理部301は、MSBの値が0になるように個人鍵dを加工し、加工して得られたビット列を処理対象のビット列Dとして認識してもよい。上記のダミー鍵eとゼロ埋めビット列rは、MSBの値が0になるように処理部301が個人鍵dを加工することで得られるビット列Dの具体例である。
処理部301は、個人鍵格納部304から楕円曲線暗号における個人鍵dを読み出し、処理対象のビット列Dを認識する。処理部301は、個人鍵d自体を処理対象のビット列Dとして認識してもよい。あるいは、処理部301は、MSBの値が0になるように個人鍵dを加工し、加工して得られたビット列を処理対象のビット列Dとして認識してもよい。上記のダミー鍵eとゼロ埋めビット列rは、MSBの値が0になるように処理部301が個人鍵dを加工することで得られるビット列Dの具体例である。
また、乱数生成部305は符号つきまたは符号なしのbビットの乱数値sを生成し、正整数mに関して、ビット列Dの長さuとウィンドウサイズkとの間にu=mk+bなる関係が成立する。処理部301は、正整数mに関して、0≦i≦(m−1)なる各iに対応する符号つきkビット値のウィンドウ値w[i]と0≦i≦(m−1)なる各iに対応する符号つきbビット値の乱数値s[i]と補正値gを定める。具体的には、処理部301は、ビット列Dと乱数値sを用いて、各乱数値s[i]を+sまたは−sに決定しながら、式(12.7)が成立するという制約条件下でこれらの値を定める。
より具体的には、第1実施形態またはその変形例では、処理部301内の判断部302は、以下のいずれかの判定条件が満たされるか否かを判断する。
・乱数値s[i]が+sであるという仮定の下でウィンドウ値w[i]として見積もられる値である第1の値が0以上2k−1未満である、という第1の判定条件
・1つ上位のウィンドウ値w[i+1]へのキャリー補正値と相殺するウィンドウ補正値により第1の値を補正した第2の値が0以上2k−1以下である、という第2の判定条件
なお、上記の第1の値は、i=m−1の場合は、ビット列Dの上位(k+b)ビット(例えば、図11のステップS301で設定される符号つき(k+b)ビット値dHの初期値)から乱数値sを引いた値の上位kビットである。
・乱数値s[i]が+sであるという仮定の下でウィンドウ値w[i]として見積もられる値である第1の値が0以上2k−1未満である、という第1の判定条件
・1つ上位のウィンドウ値w[i+1]へのキャリー補正値と相殺するウィンドウ補正値により第1の値を補正した第2の値が0以上2k−1以下である、という第2の判定条件
なお、上記の第1の値は、i=m−1の場合は、ビット列Dの上位(k+b)ビット(例えば、図11のステップS301で設定される符号つき(k+b)ビット値dHの初期値)から乱数値sを引いた値の上位kビットである。
また、i<m−1の場合は、上記の第1の値は、符号つき(k+b)ビット値から乱数値sを引いた値の、上位kビットである。なお、ここでの符号つき(k+b)ビット値とは、i<j≦m−1なる各jについて決定部303が算出したウィンドウ値w[j]と乱数値s[j]の寄与をビット列Dの上位(k(m−i)+b)ビットから減殺した値である。より正確には、j=i+1なるjに関しては、ビット列Dの上位(k(m−i)+b)ビットから減殺されるウィンドウ値w[j]の寄与は、キャリー補正前のウィンドウ値w[j]の寄与である。また、この符号つき(k+b)ビット値の具体例は、第1実施形態においては、図11のステップS318で更新された符号つき(k+b)ビット値dHである。
上記の第1と第2の判定条件に関する判断の具体的手順は、例えば次のとおりである。すなわち、判断基準値(dH−s)が範囲R3に属するとき、判断部302は、「第1の判定条件が満たされる」と判断してもよい。また、判断基準値(dH−s)が範囲R1に属するとき、判断部302は、「第2の判定条件が満たされる」と判断してもよい。
そして、第1の判定条件が満たされる場合、処理部301内の決定部303は、図11のステップS310、S311、S315、S316に例示したように、乱数値s[i]を+sと決定し、ウィンドウ値w[i]を第1の値に決定する。また、第2の判定条件が満たされる場合、決定部303は、図11のステップS305〜S307、S315、S316に例示したように、乱数値s[i]を+sと決定し、ウィンドウ値w[i]を第2の値に決定する。
逆に、第1の判定条件も第2の判定条件も満たされない場合、決定部303は、乱数値s[i]を−sと決定し、−sと決定した乱数値s[i]に応じてウィンドウ値w[i]を算出する。
その際、決定部303は、第1の値が正であれば、1つ上位のウィンドウ値w[i+1]への正のキャリー補正値と相殺する負の値によるウィンドウ補正を行う。例えば、第1実施形態の例では、判断基準値(dH−s)が範囲R4に属していれば、決定部303は図11のステップS313でウィンドウ補正値t[i]を負の値に設定することで、ウィンドウ補正を行う。
また、乱数値s[i]を−sと決定した場合に、前記第1の値が負であれば、決定部303は、ウィンドウ補正を行わずに、−sに決定した乱数値s[i]に応じてウィンドウ値w[i]を算出する。例えば、第1実施形態の例では、判断基準値(dH−s)が範囲R2に属していれば、決定部303はウィンドウ補正を行わない。
以上は、第1実施形態またはその変形例における処理部301の動作である。第2実施形態、第3実施形態、またはその変形例における処理部301の動作は、概括すれば以下のとおりである。
すなわち、判断部302は、符号つき(k+b)ビット値dHが、0以上2k+b−1−1以下の第1の範囲(つまり範囲R3)または−2k+b−1以下の第2の範囲(つまり範囲R1)に含まれるか否かを判断する。
ここでの符号つき(k+b)ビット値dHは、i=m−1の場合は、ビット列Dの上位(k+b)ビットであり、具体例は、図19のステップS401または図24のステップS501で設定される値である。また、i<m−1の場合は、符号つき(k+b)ビット値dHは、i<j≦m−1なる各jについて算出したウィンドウ値w[j]と乱数値s[j]の寄与をビット列Dの上位(k(m−i)+b)ビットから減殺した値である。具体例は、図19のステップS418または図24のステップS518で設定される値である。なお、より正確には、j=i+1なるjに関しては、ビット列Dの上位(k(m−i)+b)ビットから減殺されるウィンドウ値w[j]の寄与は、キャリー補正前のウィンドウ値w[j]の寄与である。
そして、決定部303は、符号つき(k+b)ビット値dHが第1の範囲に含まれる場合、乱数値s[i]を+sと決定し、ウィンドウ値w[i]を、符号つき(k+b)ビット値dHから乱数値sを減じた値の上位kビットに決定する。この動作の例は、図19のステップS410、S411、S415、S416および図24のステップS510、S511、S515、S516に示したとおりである。
また、符号つき(k+b)ビット値dHが第2の範囲に含まれる場合、決定部303は、乱数値s[i]を+sと決定し、ウィンドウ値w[i]を、符号つき(k+b)ビット値dHから乱数値sを減じて2k+bなるウィンドウ補正値を加えた値の上位kビットに決定する。この動作の例は、図19のステップS405〜S407、S415、S416および図24のステップS505〜S507、S515、S516に示したとおりである。
そして、符号つき(k+b)ビット値dHが第1の範囲にも第2の範囲にも含まれない場合、決定部303は、乱数値s[i]を−sと決定し、−sと決定した乱数値s[i]に応じてウィンドウ値w[i]を算出する。
その際、決定部303は、具体的には、符号つき(k+b)ビット値dHが正であれば、1つ上位のウィンドウ値w[i+1]への正のキャリー補正値と相殺する負のウィンドウ補正値によるウィンドウ補正を行う。この動作の例は、図19のステップS412〜416および図24のステップS512〜S516に示したとおりである。
逆に、乱数値s[i]を−sと決定した場合において、符号つき(k+b)ビット値dHが負であれば、決定部303は、ウィンドウ補正を行わずに、乱数値s[i]に応じてウィンドウ値w[i]を算出する。この動作の例は、図19のステップS408、S409、S415、S416および図24のステップS508、S509、S515、S516に示したとおりである。
また、以上説明したいずれの実施形態においても、スカラ倍算部307が楕円曲線上の点(2bh+s)Aの座標を計算するインデックスhの範囲は、次のとおりである。すなわち、インデックスhは、処理部301が−sと決定する乱数値s[i]に対応するウィンドウ値w[i]の値域の最大値(例えば、第1実施形態では2、第2実施形態と第3実施形態では1)の符号を反転させた負数以上である。かつ、インデックスhは、処理部301が+sと決定する乱数値s[i]に対応するウィンドウ値w[i]の値域の最大値(例えば、第1実施形態と第2実施形態では2k−1+1、第3実施形態では2k−1)以下である。
最後に、以上説明した第1〜第3実施形態およびそれらの変形例、ならびに2つの比較例におけるテーブルデータのエントリ数についてまとめると、図32のとおりである。
すなわち、第1〜第3実施形態は、いずれもPA攻撃に対して安全(つまりSPA攻撃とDPA攻撃の双方に対して安全)である。また、第3の比較例として説明したランダム化ウィンドウ法も、PA攻撃に対して安全である。しかし、第4の比較例として説明した、メモリ節約効果のある符号つきウィンドウ法は、DPA攻撃に対して脆弱である。
すなわち、第1〜第3実施形態は、いずれもPA攻撃に対して安全(つまりSPA攻撃とDPA攻撃の双方に対して安全)である。また、第3の比較例として説明したランダム化ウィンドウ法も、PA攻撃に対して安全である。しかし、第4の比較例として説明した、メモリ節約効果のある符号つきウィンドウ法は、DPA攻撃に対して脆弱である。
そして、第1実施形態では、s≧0の場合のスカラ倍点情報のインデックスの範囲は、−2≦h≦2k−1+1であり、変形例として説明したs≦0の場合のインデックスの範囲は、−1≦h≦2k−1+2である。よって、スカラ倍点情報のエントリ数は、いずれにせよ(2k−1+4)個である。例えば、ウィンドウサイズkが2、3、4の場合それぞれのエントリ数は、6個、8個、12個である。
また、第2実施形態では、s≧0の場合も、変形例として説明したs≦0の場合も、スカラ倍点情報のインデックスの範囲は、−1≦h≦2k−1+1である。よって、スカラ倍点情報のエントリ数は(2k−1+3)個である。例えば、ウィンドウサイズkが2、3、4の場合それぞれのエントリ数は、5個、7個、11個である。
また、乱数値sを非ゼロの値に限定した第3実施形態では、s>0の場合とs<0の場合でスカラ倍点情報のインデックスの範囲が異なり、したがって、エントリ数も異なる。具体的には、s>0の場合、インデックスの範囲は−1≦h≦2k−1であり、エントリ数は(2k−1+2)個である。例えば、ウィンドウサイズkが2、3、4の場合それぞれのエントリ数は、4個、6個、10個である。s<0の場合のインデックスの範囲とエントリ数は、第2実施形態と同じである。
第3の比較例では、テーブルデータのインデックスの範囲は0≦h≦2k−1であり、エントリ数は2k個である。例えば、ウィンドウサイズkが2、3、4の場合それぞれのエントリ数は、4個、8個、16個である。
よって、第1実施形態と第3の比較例を比べると、kが3以上のとき第1実施形態でのエントリ数は第3の比較例でのエントリ数以下であり、特にkが4以上のとき第1実施形態でのエントリ数は第3の比較例でのエントリ数より少ない。
また、第2実施形態と第3の比較例を比べると、kが3以上のとき第2実施形態でのエントリ数は第3の比較例でのエントリ数より少ない。同様のことは、第3実施形態においてs<0の場合にも成り立つ。
さらに、s>0の場合に関して第3実施形態と第3の比較例を比べると、kが2以上のとき第3実施形態でのエントリ数は第3の比較例でのエントリ数以下であり、特にkが3以上のとき第3実施形態でのエントリ数は第3の比較例でのエントリ数より少ない。
すなわち、第1〜第3実施形態でのエントリ数は、2k−1のオーダであるのに対し、第3の比較例でのエントリ数は、2kのオーダである。よって、第1〜第3実施形態でのエントリ数は、ウィンドウサイズkによっては第3の比較例でのエントリ数を超えることもありうるものの、多くの場合は、第3の比較例でのエントリ数より少ない。また、ウィンドウサイズは、k≧3であることが多い。したがって、実用上はほとんどの場合において、第1〜第3実施形態は、メモリ使用量の点で第3の比較例に対する優位性を持つ。
また、第4の比較例では、テーブルデータのインデックスの範囲は0≦h≦2k−1であり、エントリ数は(2k−1+1)個である。例えば、ウィンドウサイズkが2、3、4の場合それぞれのエントリ数は、3個、5個、9個である。このように、ウィンドウサイズkによらず、第4の比較例でのエントリ数は常に第1〜第3実施形態でのエントリ数よりも1〜3個少ないが、第4の比較例にはDPA攻撃に対する脆弱性がある。よって、第1〜第3実施形態は、安全性において第4の比較例に対する優位性を持つ。
以上、図32に示したように、第1〜第3実施形態およびその変形例によれば、SPA攻撃とDPA攻撃の双方に対する安全性と、メモリ使用量の抑制が、ともに実現される。したがって、第1〜第3実施形態およびその変形例の暗号処理装置は、様々な分野に好適であり、特に、スマートカードや組み込み機器などのメモリ容量が少ない装置に好適である。
Claims (9)
- 楕円曲線暗号における個人鍵dを格納する個人鍵格納部と、
符号つきまたは符号なしのbビットの乱数値sを生成する乱数生成部と、
前記個人鍵格納部から前記個人鍵dを読み出し、前記個人鍵d、または最上位ビットの値が0になるように前記個人鍵dを加工して得られるビット列であるビット列Dの長さuとウィンドウサイズkとの間にu=mk+bなる関係が成立する正整数mに関して、0≦i≦(m−1)なる各iに対応する符号つきkビット値のウィンドウ値w[i]と0≦i≦(m−1)なる各iに対応する符号つきbビット値の乱数値s[i]と補正値gを、前記ビット列Dと前記乱数値sとを用いて、各乱数値s[i]を+sまたは−sに決定しながら、
を備えることを特徴とする暗号処理装置。 - 前記乱数値s[i]が+sであるという仮定の下で前記ウィンドウ値w[i]として見積もられる値である第1の値が0以上2k−1未満である、という第1の判定条件、または、前記ウィンドウ値w[i]の1つ上位のウィンドウ値w[i+1]へのキャリー補正値と相殺するウィンドウ補正値により前記第1の値を補正した第2の値が0以上2k−1以下である、という第2の判定条件が満たされるか否かを判断する判断部と、
前記第1の判定条件が満たされる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を前記第1の値に決定し、前記第2の判定条件が満たされる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を前記第2の値に決定し、前記第1の判定条件も前記第2の判定条件も満たされない場合、前記乱数値s[i]を−sと決定し、−sと決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出する決定部
を前記処理部が備えることを特徴とする請求項1に記載の暗号処理装置。 - i=m−1の場合は、前記ビット列Dの上位(k+b)ビットの値であり、i<m−1の場合は、i<j≦m−1なる各jについて算出したウィンドウ値w[j]と乱数値s[j]の寄与を前記ビット列Dの上位(k(m−i)+b)ビットから減殺した値である、符号つき(k+b)ビット値d H が、0以上2 k+b−1 −1以下の第1の範囲または−2 k+b−1 以下の第2の範囲に含まれるか否かを判断する判断部と、
前記符号つき(k+b)ビット値d H が前記第1の範囲に含まれる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を、前記符号つき(k+b)ビット値d H から前記乱数値sを減じた値の上位kビットに決定し、前記符号つき(k+b)ビット値d H が前記第2の範囲に含まれる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を、前記符号つき(k+b)ビット値d H から前記乱数値sを減じて2 k+b なるウィンドウ補正値を加えた値の上位kビットに決定し、前記符号つき(k+b)ビット値d H が前記第1の範囲にも前記第2の範囲にも含まれない場合、前記乱数値s[i]を−sと決定し、−sと決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出する決定部
を前記処理部が備えることを特徴とする請求項1に記載の暗号処理装置。 - 前記乱数生成部は、前記乱数値sとして、非ゼロの正の値のみを生成することを特徴とする請求項3に記載の暗号処理装置。
- 楕円曲線暗号における個人鍵dを読み出し、
前記個人鍵dを処理対象のビット列Dとして認識するか、または、最上位ビットの値が0になるように前記個人鍵dを加工し、加工して得られたビット列を前記ビット列Dとして認識し、
符号つきまたは符号なしのbビットの乱数値sを生成し、
前記ビット列Dの長さuとウィンドウサイズkとの間にu=mk+bなる関係が成立する正整数mに関して、0≦i≦(m−1)なる各iに対応する符号付きkビット値のウィンドウ値w[i]と、0≦i≦(m−1)なる各iに対応する符号付きbビット値の乱数値s[i]と、補正値gを、前記ビット列Dと前記乱数値sとを用いて、各乱数値s[i]を+sまたは−sに決定しながら、
ことを特徴とする暗号処理方法。 - 前記乱数値s[i]が+sであるという仮定の下で前記ウィンドウ値w[i]の値を見積もり、
見積もった値である第1の値が0以上2 k−1 未満である、という第1の判定条件、または、前記ウィンドウ値w[i]の1つ上位のウィンドウ値w[i+1]へのキャリー補正値と相殺するウィンドウ補正値により前記第1の値を補正した第2の値が0以上2 k−1 以下である、という第2の判定条件が満たされるか否かを判断し、
前記第1の判定条件が満たされる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を前記第1の値に決定し、
前記第2の判定条件が満たされる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を前記第2の値に決定し、
前記第1の判定条件も前記第2の判定条件も満たされない場合、前記乱数値s[i]を−sと決定し、−sと決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出する
ことを含むことを特徴とする請求項5に記載の暗号処理方法。 - i=m−1の場合は、前記ビット列Dの上位(k+b)ビットの値であり、i<m−1の場合は、i<j≦m−1なる各jについて算出したウィンドウ値w[j]と乱数値s[j]の寄与を前記ビット列Dの上位(k(m−i)+b)ビットから減殺した値である、符号つき(k+b)ビット値d H を計算し、
前記符号つき(k+b)ビット値d H が0以上2 k+b−1 −1以下の第1の範囲または−2 k+b−1 以下の第2の範囲に含まれるか否かを判断し、
前記符号つき(k+b)ビット値d H が前記第1の範囲に含まれる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を、前記符号つき(k+b)ビット値d H から前記乱数値sを減じた値の上位kビットに決定し、
前記符号つき(k+b)ビット値d H が前記第2の範囲に含まれる場合、前記乱数値s[i]を+sと決定し、前記ウィンドウ値w[i]を、前記符号つき(k+b)ビット値d H から前記乱数値sを減じて2 k+b なるウィンドウ補正値を加えた値の上位kビットに決定し、
前記符号つき(k+b)ビット値d H が前記第1の範囲にも前記第2の範囲にも含まれない場合、前記乱数値s[i]を−sと決定し、−sと決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出する
ことを特徴とする請求項5に記載の暗号処理方法。 - 前記乱数値s[i]を−sと決定した場合、
前記符号つき(k+b)ビット値d H が正であれば、−sに決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出するときに、1つ上位のウィンドウ値w[i+1]への正のキャリー補正値と相殺する負のウィンドウ補正値による補正を行い、
前記符号つき(k+b)ビット値d H が負であれば、前記ウィンドウ補正を行わずに、−sに決定した前記乱数値s[i]に応じて前記ウィンドウ値w[i]を算出する
ことを特徴とする請求項7に記載の暗号処理方法。 - 前記乱数値sは非ゼロの正の値であることを特徴とする請求項7または8に記載の暗号処理方法。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2010/002363 WO2011121661A1 (ja) | 2010-03-31 | 2010-03-31 | 暗号処理装置および暗号処理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2011121661A1 JPWO2011121661A1 (ja) | 2013-07-04 |
JP5327380B2 true JP5327380B2 (ja) | 2013-10-30 |
Family
ID=44711459
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012507907A Expired - Fee Related JP5327380B2 (ja) | 2010-03-31 | 2010-03-31 | 暗号処理装置および暗号処理方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8891759B2 (ja) |
EP (1) | EP2555180A4 (ja) |
JP (1) | JP5327380B2 (ja) |
WO (1) | WO2011121661A1 (ja) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5488718B2 (ja) | 2010-12-27 | 2014-05-14 | 富士通株式会社 | 暗号処理装置、暗号処理方法、およびプログラム |
CN102855422B (zh) * | 2012-08-21 | 2015-03-04 | 飞天诚信科技股份有限公司 | 一种盗版加密锁的识别方法和装置 |
US9619207B1 (en) * | 2014-10-27 | 2017-04-11 | Altera Corporation | Circuitry and methods for implementing Galois-field reduction |
US11626970B2 (en) * | 2014-12-08 | 2023-04-11 | Cryptography Research, Inc. | Multiplicative masking for cryptographic operations |
US9887840B2 (en) | 2015-09-29 | 2018-02-06 | International Business Machines Corporation | Scrambling bit transmissions |
US10341098B2 (en) * | 2017-01-24 | 2019-07-02 | Nxp B.V. | Method of generating cryptographic key pairs |
US10574451B2 (en) * | 2017-10-19 | 2020-02-25 | Bank Of America Corporation | Method and apparatus for perfect forward secrecy using deterministic hierarchy |
US11743241B2 (en) * | 2020-12-30 | 2023-08-29 | International Business Machines Corporation | Secure data movement |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003233307A (ja) * | 2001-12-04 | 2003-08-22 | Fujitsu Ltd | 秘密鍵を用いた耐タンパ暗号処理 |
WO2004055756A1 (ja) * | 2002-12-18 | 2004-07-01 | Fujitsu Limited | 秘密鍵を用いた耐タンパ楕円曲線暗号処理 |
JP2005020735A (ja) * | 2003-06-26 | 2005-01-20 | Sharp Corp | データ処理装置におけるサイドチャネル攻撃防止 |
WO2006118092A1 (ja) * | 2005-04-27 | 2006-11-09 | Matsushita Electric Industrial Co., Ltd. | 情報セキュリティ装置及び楕円曲線演算装置 |
WO2009122461A1 (ja) * | 2008-03-31 | 2009-10-08 | 富士通株式会社 | 電力解析攻撃への対策機能を備えた暗号化方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
FR2809893B1 (fr) * | 2000-06-02 | 2002-11-15 | Gemplus Card Int | Procede de contre-mesure dans un composant electronique mettant en oeuvre un algorithme de cryptographie a cle publique sur courbe elliptique |
US7602907B2 (en) | 2005-07-01 | 2009-10-13 | Microsoft Corporation | Elliptic curve point multiplication |
KR101194837B1 (ko) * | 2005-07-12 | 2012-10-25 | 삼성전자주식회사 | 멱지수를 숨기는 dpa 대책의 고속 계산을 위한 암호화장치 및 방법 |
JP2008252299A (ja) * | 2007-03-29 | 2008-10-16 | Hitachi Ltd | 暗号処理システム及び暗号処理方法 |
US8498411B1 (en) * | 2008-12-12 | 2013-07-30 | Emc Corporation | Using multiples above two with running totals and reference values other than 0 and 2 (window size) in elliptic curve cryptography scalar multiplication acceleration tables |
-
2010
- 2010-03-31 WO PCT/JP2010/002363 patent/WO2011121661A1/ja active Application Filing
- 2010-03-31 JP JP2012507907A patent/JP5327380B2/ja not_active Expired - Fee Related
- 2010-03-31 EP EP10848844.6A patent/EP2555180A4/en not_active Withdrawn
-
2012
- 2012-09-28 US US13/630,889 patent/US8891759B2/en not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2003233307A (ja) * | 2001-12-04 | 2003-08-22 | Fujitsu Ltd | 秘密鍵を用いた耐タンパ暗号処理 |
WO2004055756A1 (ja) * | 2002-12-18 | 2004-07-01 | Fujitsu Limited | 秘密鍵を用いた耐タンパ楕円曲線暗号処理 |
JP2005020735A (ja) * | 2003-06-26 | 2005-01-20 | Sharp Corp | データ処理装置におけるサイドチャネル攻撃防止 |
WO2006118092A1 (ja) * | 2005-04-27 | 2006-11-09 | Matsushita Electric Industrial Co., Ltd. | 情報セキュリティ装置及び楕円曲線演算装置 |
WO2009122461A1 (ja) * | 2008-03-31 | 2009-10-08 | 富士通株式会社 | 電力解析攻撃への対策機能を備えた暗号化方法 |
Non-Patent Citations (2)
Title |
---|
JPN6012054715; Kouichi Itoh, Jun Yajima, Masahiko Takenaka, and Naoya Torii: '"DPA Countermeasures by Improving the Window Method"' LNCS, Cryptographic Hardware and Embedded Systems - CHES 2002 Vol.2523, 200208, p.303-317 * |
JPN6013029579; Fan Zhang et.al.: 'An Efficient Window-Based Countermeasure toPower Analysis of ECC Algorithms' Fifth International Conference on Information Technology: New Generations , 2008, p.120-126, IEEE computer society * |
Also Published As
Publication number | Publication date |
---|---|
US20130039486A1 (en) | 2013-02-14 |
US8891759B2 (en) | 2014-11-18 |
WO2011121661A1 (ja) | 2011-10-06 |
JPWO2011121661A1 (ja) | 2013-07-04 |
EP2555180A4 (en) | 2017-07-05 |
EP2555180A1 (en) | 2013-02-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5327380B2 (ja) | 暗号処理装置および暗号処理方法 | |
JP5488718B2 (ja) | 暗号処理装置、暗号処理方法、およびプログラム | |
US8402287B2 (en) | Protection against side channel attacks | |
CN104937537B (zh) | 包括与标量或求幂的乘法运算的密码学方法 | |
US6986054B2 (en) | Attack-resistant implementation method | |
CN109791517B (zh) | 保护并行乘法运算免受外部监测攻击 | |
JP4668931B2 (ja) | 電力解析攻撃に対する耐タンパ性を持った暗号化処理装置 | |
JP5446678B2 (ja) | 楕円曲線暗号演算装置及び方法 | |
US10374790B2 (en) | Countermeasure method for an electronic component implementing an elliptic curve cryptography algorithm | |
CA2409200C (en) | Cryptographic method and apparatus | |
JP5573964B2 (ja) | 暗号処理装置および方法 | |
JP4378479B2 (ja) | カバート・チャネル攻撃に対して安全な整数除算法 | |
US9722773B2 (en) | Method of determining a representation of a product of a first element and a second element of a finite set, method of evaluating a function applied to an element of a finite set and associated devices | |
US8744072B2 (en) | Exponentiation method resistant against side-channel and safe-error attacks | |
JP4378480B2 (ja) | 隠れたチャネル攻撃に対して安全に整数除算またはモジュラ換算する方法 | |
US10133554B2 (en) | Non-modular multiplier, method for non-modular multiplication and computational device | |
RU2401513C2 (ru) | Способ формирования и проверки подлинности электронной цифровой подписи, заверяющей электронный документ | |
WO2023141934A1 (en) | Efficient masking of secure data in ladder-type cryptographic computations | |
Shah | Some Families of Elliptic Curves | |
CN116127534A (zh) | 标量到陶氏表示法的约简和转换 | |
Gulen et al. | Side-Channel Resistant 2048-Bit RSA Implementation for Wireless Sensor Networks and Internet of Things | |
RU2382505C1 (ru) | Способ формирования и проверки подлинности электронной цифровой подписи, заверяющей электронный документ | |
KR20230061028A (ko) | 부채널 공격을 방지하기 위한 암호문 비교 장치 및 방법 | |
RU2380830C1 (ru) | Способ формирования и проверки подлинности электронной цифровой подписи, заверяющей электронный документ | |
Brumnik et al. | Biometric encryption using co-z divisor addition formulae in weighted representation of jacobean genus 2 hyperelliptic curves over prime fields |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20130625 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20130708 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
LAPS | Cancellation because of no payment of annual fees |