JP5488718B2 - 暗号処理装置、暗号処理方法、およびプログラム - Google Patents

暗号処理装置、暗号処理方法、およびプログラム Download PDF

Info

Publication number
JP5488718B2
JP5488718B2 JP2012550615A JP2012550615A JP5488718B2 JP 5488718 B2 JP5488718 B2 JP 5488718B2 JP 2012550615 A JP2012550615 A JP 2012550615A JP 2012550615 A JP2012550615 A JP 2012550615A JP 5488718 B2 JP5488718 B2 JP 5488718B2
Authority
JP
Japan
Prior art keywords
bit
window
value
random number
variable
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
Application number
JP2012550615A
Other languages
English (en)
Other versions
JPWO2012090288A1 (ja
Inventor
純 矢嶋
孝一 伊藤
正彦 武仲
大 山本
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Application granted granted Critical
Publication of JP5488718B2 publication Critical patent/JP5488718B2/ja
Publication of JPWO2012090288A1 publication Critical patent/JPWO2012090288A1/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/30Public key, i.e. encryption algorithm being computationally infeasible to invert or user's encryption keys not requiring secrecy
    • H04L9/3066Public 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
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/002Countermeasures against attacks on cryptographic mechanisms
    • H04L9/003Countermeasures against attacks on cryptographic mechanisms for power analysis, e.g. differential power analysis [DPA] or simple power analysis [SPA]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/08Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
    • H04L9/0816Key establishment, i.e. cryptographic processes or cryptographic protocols whereby a shared secret becomes available to two or more parties, for subsequent use
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L2209/00Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
    • H04L2209/08Randomization, e.g. dummy operations or using noise

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つには「ウィンドウ法(以下「window法」と称する)」と呼ばれる手法があり、DPA攻撃への対策の1つにはデータをランダム化する手法がある。さらに、効率的な耐タンパ性の指数剰余演算および点のスカラー倍算を実現する暗号装置や、指数剰余演算を実行する暗号化方法において、PA攻撃を用いた個人鍵の推定を困難にし、高い耐タンパ性をもつ暗号プロセッサも提案されている。
特開2000−132096号公報 特開2003−233307号公報 国際公開WO2009/122461号公報
[IEEE P1363] IEEE P1363/D13 (Draft Version 13, November 12, 1999) main document, Standard Specifications for Public Key Cryptography, http://grouper.ieee.org/groups/1363/P1363/draft.html [Kocher99] P.Kocher, J,Jaffe and B.Jun "Differential Power Anaysis", Crypto'99, LNCS 1666, pp.388-397, Springer-Verlag, 1999.
楕円曲線上の点のスカラー倍算を行う装置において、SPA攻撃への対策として、ウィンドウサイズがkビットのwindow法(あるいはその変種)が採用される場合、メモリには、kビットの各インデックスに対応して楕円曲線上の点を示すデータが格納される。したがって、メモリ使用量はウィンドウサイズkの指数オーダであり、ウィンドウサイズkが大きいほど、メモリ使用量も多い。
他方で、近年では、サーバ・コンピュータやパーソナル・コンピュータなどの汎用的なコンピュータだけではなく、例えば組み込み機器などの他の様々な装置においても、暗号技術の利用が広まりつつある。スカラー倍算を行う装置には、装置の種類によらず、SPA攻撃とDPA攻撃の双方に対する対策を実装することが求められる。
ところが、ある種の装置のメモリ容量は、汎用的なコンピュータのメモリ容量と比べるとかなり少ない。そして、メモリ容量の少ない装置においては、なるべく少ないメモリ使用量で処理を実行することが好ましい。
そこで本発明の課題は、メモリ使用量を少なく抑えつつ、SPA攻撃とDPA攻撃の双方に対する安全性を保って、スカラー倍算を行う暗号処理装置、方法、およびプログラムを提供することである。
一態様によれば、bビットの2進数の乱数sを生成する乱数生成部と、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からkビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定部と、 前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数sを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数sを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算部と、前記ウィンドウ値決定部の処理と前記補正値計算部の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる制御部と、前記制御部での動作が終了した後に得られる前記各ウィンドウ列w(i)を格納するウィンドウ値格納部と、 前記制御部での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する補正値格納部と、前記乱数生成部が生成した乱数sを格納する乱数格納部と、前記秘密鍵dと、前記乱数格納部に格納された乱数sと、前記ウィンドウ値格納部に格納された各ウィンドウ列と、前記補正値格納部に格納された補正値d’とを用いて、暗号演算を実行する暗号演算実行部と、を備えることを特徴とする暗号処理装置を提供する。
一態様によれば、window法であることによりSPAに対して安全であり、テーブルデータがランダム化されたことによりDPAに対しても安全であり、テーブルサイズの削減をも実現でき、キャリー制御も単純な暗号演算処理装置を提供できる。
電力解析の概要を説明する図である。 単純電力解析(SPA)と電力差分解析(DPA)の説明図である。 バイナリ法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。 バイナリ法による点のスカラー倍算処理の説明図である。 図3のバイナリ法に対してSPAを用いた場合の電力波形例を示す図である。 DPAにおける差分波形による個人鍵ビットの判定動作の説明図である。 データのランダム化によるDPA対策法の説明図である。 window法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。 window法を用いた点のスカラー倍算処理の説明図である。 window法に対してSPAを用いた場合の電力波形例を示す図である。 一般的なwindow法(第2の比較例)とランダム化window法(第3の比較例)の違いの説明図である。 ランダム化window法を用いた点のスカラー倍算処理のアルゴリズムを示す図である。 一般的なwindow法(第2の比較例)と符号つきwindow法(第4の比較例)の比較説明図である。 ランダム化window法(第3の比較例)と符号つきウィンドウ法(第4の比較例)の組合せができない理由の説明図である。 各種手法の効果の比較を示した図表である。 第1〜第3実施形態の暗号処理装置の第1のハードウェア構成例を示す図である。 第1〜第3実施形態の暗号処理装置の第2のハードウェア構成例を示す図である。 第1〜第3実施形態の暗号処理装置のwindow値決定ユニットの機能構成を説明する図である。 第1〜第3実施形態の暗号処理装置の点のスカラ倍算計算ユニットの機能構成を説明する図である。 第1の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。 第1の実施形態におけるwindow値決定アルゴリズムの動作説明図である。 第1の実施形態における点のスカラ倍算アルゴリズムを示すフローチャートである。 第2の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。 第2の実施形態におけるwindow値決定アルゴリズムの動作説明図である。 第2の実施形態における点のスカラ倍算アルゴリズムを示すフローチャートである。 第3の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。 第3の実施形態におけるwindow値決定アルゴリズムの動作説明図である。 第3の実施形態におけるべき乗剰余演算アルゴリズムを示すフローチャートである。 第1〜第3の実施形態と各種手法の効果の比較を示した図表である。
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。説明の順序は以下のとおりである。
後述の第1〜第3の実施形態の暗号処理装置は、楕円曲線上の点に対するスカラー倍算を行うためのデータ(具体的には、後述のウィンドウ列w[i]と乱数列s[i]と補正値d’)を生成し、生成したデータを用いてスカラー倍算を行う装置である。そこで、第1〜第3の実施形態についての理解を助けるために、まず、楕円曲線上の演算について説明する。また、第1〜第3の実施形態についての理解を助けるために、第1〜第4の比較例についても説明する。
その後、本願の発明者が比較例についての検討から得た知見と、当該知見に基づいて発明者が開発した第1〜第3の実施形態の処理方法の共通点について説明する。また、第1〜第3の実施形態に共通の装置構成についても説明する。その後、第1〜第3の実施形態について順に説明し、最後に、その他の実施形態などを説明する。
<ECCの演算の概略>
さて、楕円曲線上の演算について説明する。ECCで使われる楕円曲線のうちで主なものは、素体GF(p)上で定義される式(1.1)の楕円曲線と、2の拡大体GF(2m)上で定義される式(1.2)の楕円曲線である(なお、GFはGalois fieldの略であり、pは素数である)。
y2=x3+ax+b(mod p) (1.1)
ただし、pは素数
a,bは楕円曲線パラメータ(0≦a,b<p)
a,b,x,y∈GF(p)
y2+xy=x3+ax2+b (mod f(x)) (1.2)
ただし、f(x)はGF(2m)の多項式
a,bは楕円曲線パラメータ(0≦a,b<p)
a,b,x,y∈GF(2m)
上述のように、a,bは、楕円曲線パラメータと呼ばれ、楕円曲線を一意に決定するためのパラメータである。
式(1.1)で表される楕円曲線上の点Aは、式(1.1)を満たすxとyの組によりA=(x,y)と表される。同様に、式(1.2)で表される楕円曲線上の点Aは、式(1.2)を満たすxとyの組によりA=(x,y)と表される。
また、楕円曲線上の特殊な点として無限遠点(point at infinity, or infinite point)とベースポイントが定義される。無限遠点を以下では「O」(大文字のオー)、ベースポイントを以下では「G」と表記する。ベースポイントGは、楕円曲線上の点の一つで、楕円曲線暗号の利用者間で共通して使用され、公開鍵/個人鍵ペア生成をはじめ、楕円曲線暗号を用いた各種機能において使用される。
なお、本明細書の以下の議論は、式(1.1)の楕円曲線についても式(1.2)の楕円曲線についても同様に成り立つ。よって、以下では式(1.1)と(1.2)の区別について言及せずに、単に「楕円曲線」、「点A」、「点(x,y)」、「x座標」、「y座標」、「楕円曲線パラメータaおよびb」などの表記を用いることがある。
楕円曲線上の点同士に対して、ある演算(以下「加算」といい、「+」と表す)を定義すると、楕円曲線上の点の集合は可換群をなすことが知られている。無限遠点Oは零元(すなわち加算における単位元)にあたる。また、楕円曲線上の任意の点A(点Aは無限遠点Oでもよい)に対して式(1.3)が成り立つ。
A+O=O+A=A (1.3)
以下では点Aの逆元を−Aと表記する。点−Aのx座標とy座標は、楕円曲線が定義される体GF(p)またはGF(2m)上の加算または減算により計算することができる。具体的には、点A=(x,y)の逆元である点−Aは、楕円曲線が式(1.1)で定義される場合は式(1.4)により表され、楕円曲線が式(1.2)で定義される場合は式(1.5)により表される。
-A=(x, -y) (1.4)
-A=(x, x+y) (1.5)
式(1.4)と(1.5)から理解されるように、点Aから点−Aを求めるための計算量(computational complexity)はわずかである。符号付window法や後述の第1〜第3の実施形態では、逆元の計算容易性を利用することで、メモリ使用量の削減が図られる。上記のような逆元の計算容易性は、RSA暗号で利用される素体上の除算の計算困難性と対照的である。
なお、ある点Aと点Aに対してA=A+Aと表される点Aのx座標とy座標も、点AとAのx座標とy座標を用いて、体GF(p)またはGF(2m)上の加減乗除により計算することができる。ここで、A=Aである場合には、A=A+Aを2Aとも表し、点Aから点A=2Aを求める演算を2倍算(doubling)という。2倍算も、体GF(p)またはGF(2m)上の加減乗除により実現される。
また、減算は、式(1.6)のように逆元の加算として定義される。
A1-A2=A1+(-A2) (1.6)
さらに、楕円曲線上の点Aに対しては、スカラー値と呼ばれる整数xを用いて、スカラー倍算(scalar multiplication)と呼ばれる演算が定義される。点のスカラー倍算は、楕円曲線上の点A、スカラー値と呼ばれる整数xから、
V=xA (1.7)
を満たす楕円曲線上の点Vを計算する処理である。
ECCでは、xを秘密情報とした処理が行われる。例えばECDH鍵交換の場合、通信相手の公開鍵となる楕円曲線上の点をA、個人鍵をdとすると、
V=dA (1.8)
を満たす楕円曲線上の点Vを計算することで、安全な鍵共有を実現する。個人鍵dの値を知らない第三者は正しい共有鍵の値を算出することができない。
式(1.8)においては、dが個人鍵であり、攻撃者などの不正な第三者に漏洩してはならない値である。すなわち、ECCにおいては、dの値の保護が重要な耐タンパ機能となる。
数学的には、式(1.8)においてd以外の値が既知だとしても、dを計算する計算量が大きすぎるため、現実的な時間内にdを求めることが難しい離散対数問題として知られている。より具体的には、楕円曲線パラメータ(Elliptic Curve Parameter)が160ビット以上の場合、A,Vの値を知っていたとしても、dの値を求めることが困難であることが知られている。
楕円曲線暗号における公開鍵(public key)と個人鍵(private key)として、前述したベースポイントG、個人鍵を表すスカラー値dに対し、公開鍵はV=dGを満たすVにより与えられる。すなわち、公開鍵Vは楕円曲線上の点であり、個人鍵dはスカラー値である。たとえ点GとVが攻撃者に知られていても、点GとVから個人鍵dを計算することは、莫大な計算量を必要とするので非常に困難である。これも、前述した離散対数問題の計算困難性として知られている。
さらに、ECCは、Diffie-Hellman(DH)アルゴリズムによる鍵共有(key agreement)や、ディジタル署名アルゴリズム(Digital Signature Algorithm;DSA)などにも利用可能である。何の目的でECCが利用されるにしろ、ECCを利用した処理はスカラー倍算を含む。DH鍵共有を例に説明すれば次のとおりである。
例えば、第1の装置の個人鍵がdであり、第2の装置の個人鍵がdであるとする。すると、第1の装置の公開鍵Qは、ベースポイントGからQ=dGと計算され、第2の装置の公開鍵Qは、ベースポイントGからQ=dGと計算される。このように、公開鍵の生成のためにスカラー倍算が行われる。
また、第1の装置は自らの公開鍵Qを第2の装置に送り、第2の装置は自らの公開鍵Qを第1の装置に送る。すると、第1の装置はスカラー倍算によりdQを計算し、第2の装置もスカラー倍算によりdQを計算する。その結果、式(1.9)に示すように、第1の装置と第2の装置は同じ鍵Kを共有することができる。
K=dAQB=dA(dBG)=dB(dAG)=dBQA (1.9)
ECCが、上記に例示したDH鍵共有以外の目的に利用される場合も、やはりスカラー倍算が行われる。
<電力解析(PA)について>
このように、数学的に求めることが困難な個人鍵dは、電力解析(Power Analysis;PA)を用いることで容易に解読することができることが知られている。PAの基本メカニズムは、式(1.8)を計算する点のスカラー倍算の処理手順に大きな関連がある。以下では、点のスカラー倍算の演算手順について説明したうえで、スカラー倍算に対するPAを説明する。
PAは、1998年に発見された解析法(非特許文献2)である。図1に示されるように、暗号機能を実行中(以下、暗号処理)のスマートカード等のデバイスの消費電力を測定し、測定されたデータを用いることでデバイスの内部に格納されたユーザの秘密情報を推定、解析する方法である。(図1)
<PAの種類:単純電力解析(SPA)と電力差分解析(DPA)>
PAには、単純電力解析(Simple Power Analysis, SPA)と、電力差分解析(Differential Power Analysis, DPA)の2種類がある(図2)。いずれの攻撃も、暗号デバイスの内部状態を電力波形を用いて観察することで、個人鍵を解読する攻撃である。
SPAは、単一の電力波形を用いた攻撃法である。図2(a)に示されるように、処理内容と暗号鍵の相関関係を利用して、電力波形の形状から、暗号デバイスで実行されている処理内容を直接的に観察することで、個人鍵(暗号鍵、秘密鍵)を解読する。
DPAは、複数の電力波形の差分を用いた攻撃法である。図2(b)に示されるように、処理内容と暗号鍵の相関関係を利用して、複数の電力波形の差分から、暗号デバイス内部で処理されているデータ値を間接的に観察することで、個人鍵(暗号鍵、秘密鍵)を解読する。
以上のように、PA攻撃は、スカラー倍算を実行中の装置の消費電力を測定することで、個人鍵として使われるスカラー値dを解読しようとする、非破壊攻撃の一種である。よって、何の目的でECCが利用されるにしろ、個人鍵dの漏洩防止の対策としては、スカラー倍算を実行中の装置の消費電力波形が個人鍵dの特徴を示さないようにすることが有効である。もしPA攻撃に対して何の対策もとられないと、スカラー倍算を実行中の装置の消費電力波形の特徴から、個人鍵dが解読されてしまう危険性がある。SPAとDPAは異なる種類の攻撃法であるため、PAに対する対策を行うためにはSPAとDPAの両方に対する対策法が必要である。
後述の第1〜第3の実施形態の暗号処理装置は、SPA攻撃に対してもDPA攻撃に対しても安全であるように、かつ使用メモリ量を抑えるように、設計されている。そこで、第1〜第3の実施形態の利点についての理解を助けるため、続いて、いくつかの比較例について説明する。
<バイナリ法(第1の比較例)>
まず、第1の比較例として、「バイナリ法」について説明する。バイナリ法は、SPA攻撃に対してもDPA攻撃に対しても脆弱である。
例えば個人鍵dが160ビットである場合、dは非常に大きな数(例えば、2160に近い数)である可能性がある。よって、式(1.8)の定義どおりにスカラー倍算を実行することは、非常に多くの回数の点の加算をともなうため、非現実的である。バイナリ法は、スカラー倍算の計算量のオーダを個人鍵dのビット数のオーダに抑えるための手法である。
点のスカラー倍算におけるバイナリ法のアルゴリズムを図3に、処理概略を図4に示す。
ここで説明の便宜上、個人鍵dのビット長をuとする。また、個人鍵dのiビット目をd[i]と表記する(0≦i≦u-1)。d[0]が最下位ビット(Least Significant Bit;LSB)でありd[u-1]が最上位ビット(Most Significant Bit;MSB)である。すると、uビットの個人鍵dは、式(2.1)のように表現される。
d=d[u-1]|| … ||d[1]||d[0] (2.1)
ここで、“||”は、1ビット以上の長さのビット列同士の連結(concatenation)を示す。
すると、式(2.1)より、式(2.2)が得られる。
dA=2u-1d[u-1]A+…+21d[1]A+20d[0]A (2.2)
バイナリ法は式(2.2)を利用した計算手順である。式(2.2)において、dのビット値d[i]を上位ビットから下位ビット(すなわちi=u-1から0)の順にスキャンし、dのビット値d[i]に応じて、下記式(2.3)の演算を行う。
d[i] =1の場合:2倍算(v := 2×v)の後に、加算(v:=v+a )を実行。
d[i] =0の場合:2倍算(v := 2×v)のみを実行。
(2.3)
例えば、個人鍵dが(1100101)2の場合について具体的に説明すると、バイナリ法は式(2.4)にしたがってスカラー倍算を実現する手法である。
dA=2(2(2(2(2(2(2O+A)+A)))+A))+A=26A+25A+22A+A (2.4)
すなわち、スカラー倍算の結果を変数Vで表すことにすると、バイナリ法では式(2.5)のとおり、変数Vがまず無限遠点Oにより初期化される(図3の301行)。
V=O (2.5)
その後、MSBからLSBへと順に(図3の302行から305行のループ処理)、式(2.3)が実行される。すなわち、2倍算により2Vを求め(図3の303行)、その後、もしd[i]=1ならば点Aの加算を行い、得られた結果を変数Vに代入する(図3の304行)、という処理が繰り返される。そして、最終的に変数Vに得られた値が出力される(図3の306行)。ここで、図3の303行の「ECDBL(V)」は、変数Vの値に対して2倍算2Vを計算する関数処理を示す。また、図3の304行「ECADD(V,A)」は、変数Vの値に変数Aの値を加算する関数処理を示す。
具体的には、d[6]=1なので、式(2.6)のとおり、6ビット目に対応して2倍算と加算が行われる(図4のD6とA6)。
V=2O+A (2.6)
そして、d[5]=1なので、式(2.7)のとおり、5ビット目に対応して2倍算と加算が行われる(図4のD5とA5)。
V=2(2O+A)+A (2.7)
また、d[4]=0なので、式(2.8)のとおり、4ビット目に関しては2倍算のみが行われ、加算は行われない(図4のD4)。
V=2(2(2O+A)+A) (2.8)
同様に、d[3]=0なので、式(2.9)のとおり、3ビット目に関しても2倍算のみが行われ、加算は行われない(図4のD3)。
V=2(2(2(2O+A)+A)) (2.9)
次の2ビット目に関しては、d[2]=1なので、式(2.10)のとおり、2倍算と加算が行われる(図4のD2とA2)。
V=2(2(2(2(2O+A)+A)))+A (2.10)
また、次の1ビット目に関しては、d[1]=0なので、式(2.11)のとおり、2倍算のみが行われ、加算は行われない(図4のD1)。
V=2(2(2(2(2(2O+A)+A)))+A) (2.11)
そして、最後の0ビット目に関しては、d[0]=1なので、式(2.12)のとおり、2倍算と加算が行われる(図4のD0とA0)。
V=2(2(2(2(2(2(2O+A)+A)))+A))+A (2.12)
以上のようにしてd[i]=1であるiビット目に対応して加算された点Aの係数は、式(2.12)から理解されるように、2である。よって、上記の式(2.5)〜(2.12)とともに例示した手順により、確かに式(2.4)にしたがって、V=dAが得られる。
上記の例から明らかなとおり、バイナリ法によれば、2倍算の回数は個人鍵dのビット長uに等しく、加算の回数は個人鍵dのハミング重み(Hamming weight)に等しい。よって、バイナリ法によるスカラー倍算の計算量は、2のオーダではなく、uのオーダに抑えられる。
ここで、バイナリ法においては、2倍算と加算の演算シーケンスが、そのままdのビット値と連動しており、SPAはこの性質を利用してdを解読する。つまり、図5の電力波形例に示されるように、点の加算と2倍算の処理の違いを、電力波形を用いて区別できるような環境においては、以下のような解読が可能となる。すなわち、2倍算のあとに加算を実行しているならば指数dのビット値は1であると解読できる(図5の501または503)。一方、2倍算のみを実行しているならば指数dのビット値は0であると解読できる(図5の502)。この解読をdの全ビットについて行うことでSPAが成功する。
SPAへの対策法として、dのビット値に関係なく加算と2倍算の演算パターンを一定化する方法が知られており、後に述べるwindow法もこの対策法を実現する手法である。
また、バイナリ法はDPA攻撃に対しても脆弱である。なお、DPA攻撃への安全性に関する説明の理解を助けるために、DPAによる攻撃を行う場合の基本アイデアを説明する。
バイナリ法は、d=d[u-1]|| … ||d[1] ||d[0](式(2.1))に対して、dAを計算するために、
d[u-1]A→(d[u-1]||d[u-2])A→(d[u-1]||d[u-2]||d[u-3])A→...
のように、スカラー値(d)のビットを上位から1つずつ増やしながら、最終的にdAを計算する。
図3に示す変数iに関するループ処理(図3の302から305)を1回実行するごとに、指数が1ビット増えた計算結果が変数Vに格納される。
例えば、d=(1101)2の場合、
(1)2A→(11)2A→(110)2A→(1101)2A
の順に計算を行う。
DPAを行う攻撃者は、「スカラー値のビット値を1つずつ増やしながら計算を行う」というバイナリ法の性質を利用して、dのビットを1ビットずつ予想しながら、その予想が正しいかどうかを電力波形により識別することを繰り返す。一般的な総当り法による攻撃の場合、個人鍵の解読はdに比例した手間が必要であるのに対し、DPAを用いることで、log2dに比例した手間で個人鍵を解読することができる。
例えば、dの最上位ビットが0の場合、0A (mod n)で表されるデータ値が暗号デバイス内部で計算され、内部のメモリにロード/ストアされる。一方、dの最上位ビットが、1の場合、1A (mod n)で表されるデータ値が暗号デバイス内部で計算され、内部のメモリにロード/ストアされる。
暗号デバイスを含めた一般的なハードウェアは、ロード・ストアされるデータ値のハミング重み('1')に比例した電力を消費するという性質が知られており、DPAはこの性質を利用することで、ロード/ストアされたデータ値が1Aもしくは0Aのいずれであるかを判別することができる。この結果、例えばdの最上位ビットが1であることが分かった後に、1つ下位のビット値を解読するためには、同様の手順を用いて、ロード/ストアされたデータ値が(10)2Aもしくは(11)2Aのいずれであるかを判別する。
DPAの具体的な手順は以下の(DPA-1)から(DPA-6)に示される。
(DPA-1) 暗号文VとしてV=Mj(j=1,2,…,L)を入力した消費電力
Powj(t) (j=1,2,…,L)を測定する。
ただし、tは時刻情報である。
(DPA-2) i:=u-1;に初期化する
(DPA-3) 攻撃者は、d[i]のビット値を予想する。
(DPA-4) 攻撃者は、既知のMj,d[u-1]||… ||d[i+1]と、
予想されたd[i]から、
Gj=(d[u-1]||…||d[i+1]||d[i])Mj
の値をj=1,2,..,Lそれぞれについて計算する。
この計算の結果に応じて、以下に示す基準により、
L個の消費電力データPowj(t)を2つのグループに分類する。
グループ1 :Mjに対し、Gjのx座標(またはy座標、のどちらか
に着目)の最下位ビットが1となるPowj(t)の集合
グループ0 :Mjに対し、Gjのx座標(またはy座標、のどちらか
に着目)の最下位ビットが0となるPowj(t)の集合
(DPA-5) 上記でグループ分けした消費電力データに対し、
(グループ1に属するPowj(t)の平均)−(グループ0に属するPowj(t)の平均)
で示される差分波形Diff(t)を作成する。
その結果、図6(a)に示すようなスパイクが差分波形に現れる場合、
予想したd[i]が正しいと判定し、
図6(b)に示すような平坦な波形の場合、
予想したd[i]が誤っていると判定する。
(DPA-6) i:=i-1と計算した結果、i30の場合、まだ解読していないビット
があるため、(DPA-3)に戻る。i<0の場合、全てのdのビット値
が解読できたので終了する。
DPA-5において、d[i]の予想が正しい場合は、Gjで表される常にデータ値のx座標(y座標)の最下位ビットが全て'1'となる消費電力のグループ1から、x座標(y座標)の最下位ビットが全て'0'となる消費電力のグループ0を引いているので、この'0','1'の消費出力差がスパイクとして出現する(図6(a))。d[i]の予想が誤っている場合は、Gjのx座標(y座標)の最下位ビットはグループ0,1ともに'0'と'1'が混在しているため、消費電力の差が発生しないので、平坦な波形となる(図6(b))。
DPA対策法として、図7に示すデータのランダム化と呼ばれる方法が知られている。DPA対策なしの場合、図7(a)に示すような挙動となる。すなわち、計算データ値の系列d[u-1]A→(d[u-1]||d[u-2])A→(d[u-1]||d[u-2]||d[u-3])A→...が個人鍵d[i]の値から一意に決定する。これに対し、図7(b)に示すように、乱数を用いてこの計算データ値をかく乱することで、計算データの系列値がランダム化される。このため、消費電力と個人鍵の相関を隠蔽し、DPAに安全な処理を実現することができる。なお、演算の最後には、ランダム化した分を補正するための正規化の処理が実行され、最終的にスカラー倍算値dAが得られる。後に述べる「ランダム化window法」と呼ばれる方法(第3の比較例)では、window法をベースとすることでSPA対策を実現しつつ、データのランダム化を併用することでDPA対策も同時に実現している。
<window法を用いたべき乗剰余処理によるPA対策法(第2の比較例)>
SPAに対する対策法のひとつとして、window法と呼ばれる方法が知られている。第2の比較例として、window法を用いたECCの点のスカラー倍算アルゴリズムを図8に、window法の概略を図9に示す。バイナリ法が個人鍵dを1ビットずつスキャンするのに対して、window法はkビット単位でまとめてスキャンを行うという違いがある。例えば、d=(101001)2に対して点のスカラー倍算を行う場合、
バイナリ法:1A→(10)2A→(101)2A→(1010)2A→(10100)2A→(101001)2A
3ビットwindow法:(101)2A→(101001)2A
の順にそれぞれ計算を行う。
kビット単位の演算を行うために、window法は、個人鍵dをkビットごとに分割する。これは、図8の806行に示す処理により、分割されたkビット値をw[i]に格納することで行う。
続く807行では、このw[i]を索引値としたテーブルデータtab[w[i]]を用いた加算処理を行う。このテーブルデータはtab[x]と表記され、802行、803行において、tab[x] = xAと表記されるデータをx=0,1,..,2k- 1の2k個についてそれぞれ事前計算することで与えられるデータである。w[i]のように、window法で索引されるテーブルデータを決定する値のことをwindow値と呼び、w[m-1],w[m-2],…,w[0]のようなwindow値の系列をwindow列(window sequence)と呼ぶ。
バイナリ法では、式(2.5)〜(2.12)に例示したように、個人鍵dの1ビットごとに、ビット値に応じて「2倍算と加算」または「2倍算」という処理が行われる。それに対して、window法では、個人鍵dのkビットごとに、ビット値によらず常に「k回の2倍算と1回の加算」という処理が行われる。よって、たとえ2倍算の消費電力波形と加算の消費電力波形が異なっていたとしても、window法によるスカラー倍算はSPA攻撃に対して安全である。
以下では説明の簡単化のため、個人鍵dのビット数uがウィンドウサイズkで割り切れるものとする。すなわち、m=u/kとすると、mは整数である。また、0≦i≦(m-1)なる各iについて、i番目のウィンドウ値w[i]は式(4.1)のように定義される(図8の806行)。
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[2]=(011)2=3 (4.2)
w[1]=(111)2=7 (4.3)
w[0]=(101)2=5 (4.4)
前述したように、window法では、スカラー倍算の対象として与えられる点Aの座標を用いて、0≦x≦2-1なる各xに対して、予め、スカラー倍点(scalar multiple)xAが計算される。そして、計算されたスカラー倍点xAは、インデックスxと対応づけられてメモリに格納される(図8の802行と803行)。このインデックスxに対応づけられたスカラー倍点xAを、前述したようにtab[x]と表記し、tab[x](=xA)を「テーブルデータ」ともいう。より詳しくは、テーブルデータtab[x]は、スカラー倍点xAのx座標とy座標の組により表される。
いま、ウィンドウサイズkが3ビットである場合には、インデックスxは、(000)2,(001)2,(010)2,(011)2,(100)2,(101)2,(110)2,(111)2の8通りの値を取り得る。したがって、テーブルデータも、図9(b)に示されるように、8通りの値となる。なお、tab[(000) 2](図9中ではtab[000]と表記している)については、(000)2A=無限遠点Oとなる(図8の802行)。
インデックスxに対応するテーブルデータtab[x]の実際の計算処理としては、xA=(x-1)A+Aであるから、インデックスx-1に対応するテーブルデータtab[x-1]にAを加算する処理を、x=1から2k-1まで繰り返し実行すればよい。これを計算するのが図8の803行である。なお、「ECADD」の意味は、図3の304行の場合と同じである。ここで、x=0に相当するテーブルデータの初期値は、図8の802行において、tab[0]=tab[(000) 2]=Oとして計算される。
window法では、点dAの計算は、式(4.5)のようにテーブルデータを用いて行われる。
dA=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.5)
より具体的には、スカラー値dと点Aのスカラー倍算の結果を変数Vで表すことにすると、window法では、式(4.6)のとおり、変数Vがまず無限遠点Oにより初期化される(図8の801行)。
V=O (4.6)
その後、前述した802行と803行のテーブルデータの作成処理の後、i=m-1からi=0へと順に、以下のループ処理(図8の804行から808行)が実行される。すなわち、「2倍算をk回(すなわち3回)行い(図8の805行)、tab[w[i]]を加算し(図8の806行と807行)、得られた結果を変数Vに代入する(図8の807行)」という処理が行われる。なお、図8の805行の「ECDBL」の意味は、図3の303行の場合と同じである。
より具体的には、まずウィンドウ値w[2]に対応して式(4.7)のとおり、3回の2倍算と1回の加算が行われる(図9のD2とA2)。
V=23(O)+tab[(011)2] (4.7)
次に、ウィンドウ値w[1]に対応して式(4.8)のとおり、3回の2倍算と1回の加算が行われる(図9のD1とA1)。
V=23(23(O)+tab[(011)2])+tab[(111)2] (4.8)
そして、最後にウィンドウ値w[0]に対応して式(4.9)のとおり、3回の2倍算と1回の加算が行われる(図9のD0とA0)。
V=23(23(23(O)+tab[(011)2])+tab[(111)2])+tab[(101)2] (4.9)
window法で用いるテーブルデータは、入力値に応じて動的に計算する必要があるため、これらのデータはRAMに格納される。すなわち、windowのビット長kを大きくするほど、テーブルの個数が多くなり、必要なRAMサイズが大きくなる。
バイナリ法と異なり、window法では、個人鍵dのビット値(スカラー値)に関係なく、常に点の2倍算をk回と加算1回を繰り返す。よって図10に示すように、点の2倍算と加算の波形から個人鍵を解読することは不可能となるため、SPAに安全となる。
<ランダム化window法によるSPA,DPA対策法(第3の比較例)>
window法を用いることで、SPAを防ぐことはできるが、DPAを防ぐことはできない。前述した(DPA-1)から(DPA-6)によるDPAの手順では、dのビットを1ビットずつ予想しながらその予想が正しいかどうかを電力波形により識別することを繰り返した。これを応用すれば、window法におけるkビットずつdのビットを予想しながら1ビットの場合と同様にその予想が正しいかどうかを電力波形により識別することを繰り返せば、window法へのDPAの適用が可能となる。計算量は増えるが、予想時のkに相当するビット数を可変させながら処理を繰り返すことにより、window法におけるkビットの様々な値に対応できる。
これに対して、window法においてデータのランダム化を実行することで、SPAとDPAを同時に防ぐ方法が、知られている(特許文献2)。この方法はランダム化window法と呼ばれる演算法である。第2の比較例であるwindow法と第3の比較例としてのランダム化window法の違いを図11に示す。
ランダム化window法においては、テーブルデータが一時的な乱数によりランダム化される。
すなわち、一般的なwindow法のテーブルデータにおいては、tab[x] = xAのように、インデックス値xからテーブルデータが一意に与えられるのに対し、ランダム化window法ではtab[x] = (2bx+s)A(ただし、sはbビット乱数を満たす小さな整数値)のように、点のスカラー倍算を1回実行するごとに変化する乱数sを用いてテーブルデータをランダム化することが特徴である。
テーブルデータがランダム化されることで、点のスカラー倍算を計算する際のデータがランダム化されるため、個人鍵dの各ビットを予測することが困難になり、DPAに安全となる。すなわち、ランダム化により、データの内容と消費電力の相関関係が隠され、これによって、攻撃者によるビット値の予測の正誤に応じて差分波形が変化することはなくなる。さらに、window法と同様に、点の2倍算、加算の演算パターンが個人鍵dに関係なく常に一定化されるため、SPAにも安全となる。
図11に示されるように、一般的なwindow法においては個人鍵dからwindow列w[i]を作成する(図11(a))。これに対して、ランダム化window法においては、個人鍵dと乱数sからwindow列w[i]と補正値d’を作成するという違いがある(図11(b))。補正値d’は、演算途中における中間データをランダム化しつつ、最終的な演算結果をdAとするための調整を行うための値である。
より具体的には、一般的なwindow法においては、図11(a)に示されるように、例えばk=2ビットのwindow列である各インデックス値(00)2,(01)2,(10)2,(11)2に対して、そのインデックス値がそのままスカラー倍算されてテーブルデータが計算された。すなわち、(00)2A, (01)2A,(10)2A,(11)2A(図中では、「00A,01A,10A,11A」と表記)が、テーブルデータとして計算された。そして、実際のスカラー倍算演算の実行時には、個人鍵dからkビットずつ切り出されたwindow列をインデックスとするテーブルデータが取得され、加算処理が実行された。
一方、ランダム化window法では、図11(b)に示されるように、個人鍵dとスカラー倍算演算ごとに異なるbビットの乱数sとから、window列w[2],w[1],w[0]と補正値d’を作成する。補正値d’は、演算途中における中間データをランダム化しつつ、最終的な演算結果をdAとするための調整を行うための値である。すなわちまず、テーブルデータの作成のために、上記window列として現れ得るビット列、例えば(00)2,(01)2,(10)2,(11)2の各ビット列の下位ビット側に、bビットの乱数列、例えば(011)2が結合された各ビット列が生成される。例えば、(00011)2,(01011)2,(10011)2,(11011)2が生成される。そして、これらの各ビット列がスカラー倍算されたテーブルデータ、例えば(00011)2A,(01011)2A,(10011)2A,(11011)2A(図中では、「(00011)A, (01011)A,(10011)A,(11011)A」と表記)が予め計算される。各計算結果は、上記window列として現れ得るビット列、例えば(00)2,(01)2,(10)2,(11)2をインデックス値とするテーブルエントリに記憶される。そして、実際のスカラー倍算演算の実行時には、前述した個人鍵dと乱数sとから作成されているwindow列w[2],w[1],w[0]をインデックスとするテーブルデータが取得され、加算処理が実行される。
最後に、前述した個人鍵dと乱数sとから作成されている補正値d’を使ってスカラー倍算した結果を、最終的な加算結果にさらに加算することにより、求めたいスカラー倍算値dAが得られるように調整する。
ここで、乱数sのビット数をb、また、mを整数とし、個人鍵dのビット数をuとすると、式(5.1)が成り立つものとする。
u=b+km (5.1)
なお、乱数sのビット数bは、例えば30以下が好ましい。例えば、個人鍵dが378=(101111010)であるとすると、u=9である。また、ウィンドウサイズkが2であり、bが3であり、乱数sが3=(011)であるとする。この場合、式(5.1)よりm=3である。ランダム化window法では、0≦i≦(m-1)なる各iについてkビットのウィンドウ値w[i]が計算され、さらに、式(5.2)が成立するようにbビットの補正値d’が計算される。
Figure 0005488718
ここで、乱数sはbビットなので、式(5.2)から式(5.3)が得られる。
Figure 0005488718
そして、式(5.3)から移項により式(5.4)が得られる。
Figure 0005488718
式(5.4)の左辺は、個人鍵dと乱数sから計算される値を示す。そして、式(5.4)の右辺は、式(5.4)の左辺により計算される値を最上位ビットからkビットずつ区切ることでウィンドウ列が得られることと、式(5.4)の左辺により計算される値の最下位の0〜b+kビットが補正値d’となることを示す。
ランダム化window法を用いた点のスカラー倍算アルゴリズムを、図12に示す。
まず、変数Vに、初期値として無限遠点Oをセットする(図12の1201行)。
次に、bビットの乱数sを発生させる(図12の1202行)。
次に、発生させた乱数sとスカラー倍算の対象である点Aの座標を用いて、0≦x≦2k-1なる各xに対して、予め、インデックスxと対応づけて式(5.5)のテーブルデータが以下に示すアルゴリズムにより計算され、メモリに格納される。
tab[x]=(2bx+s)A (5.5)
この計算アルゴリズムとしてまず、初期値として、インデックス0、例えば(00)2に対するテーブルデータtab[0]を、tab[0]=sAとして計算する(図12の1203行)。この計算の根拠は、(00)2に乱数sを結合して得られるwindow列(00||s)2に対するスカラー倍算が、(00||s)2A=sAとなることによる。
次に、tab[0]を初期値として、順次インクリメントされるインデックスxに対応するテーブルデータtab[x]の計算が実行される。この計算処理は、次のようにして実行される。すなわちまず、スカラー倍算されるビット列は(x||s)2である。そして、(x||s)2A=(x-1||s)2A+sAである。したがって、インデックスxに対するテーブルデータtab[x]は、インデックスx-1に対応するテーブルデータtab[x-1]に2bAを加算する処理を、x=1から2k-1まで繰り返し実行することで算出できる。これを計算するのが図12の1204行である。
例えば、上記のとおりb=3でありs=(011)2=3である場合、メモリにはテーブルデータとして次の式(5.6)〜(5.9)のデータが格納される。
tab[(00)2]=tab[0]=(23×0+3)A=3A (5.6)
tab[(01)2]=tab[1]=(23×1+3)A=11A (5.7)
tab[(10)2]=tab[2]=(23×2+3)A=19A (5.8)
tab[(11)2]=tab[3]=(23×3+3)A=27A (5.9)
次に、前述の(5.4)式に基づいて、個人鍵dと乱数Sを入力として、window列w[m-1],…,w[0]と、補正値d’が計算される(図12の1205行)。
例えば、d=378=(101111010)2であり、乱数sが3=(011)2である場合、式(5.4)の左辺を計算すると、式(5.10)のとおりである。
378-(20×3+22×3+24×3)=378-(3+12+48)=315=(100111011)2 (5.10)
よって、式(5.10)により得られた値(100111011)2を2ビットずつ区切ることでウィンドウ列w[2],w[1],w[0]が得られる。また、この値(100111011)2の最下位のb=3ビットから補正値d’が得られる。具体的には、式(5.11)〜(5.14)のとおりである。
w[2]=(10)2=2 (5.11)
w[1]=(01)2=1 (5.12)
w[0]=(11)2=3 (5.13)
d’=(011)2=3 (5.14)
ランダム化window法では、以上のようにしてウィンドウ列w[i](0≦i≦m-1)と補正値d’が計算される。
以上のようにして、テーブルデータと、window列、および補正値が求まった後、実際の点Aのスカラー倍算dAが実行される。より詳しくは、i=m-1からi=0へと順に以下のループ処理(図12の1206行から1209行)と、その後に最後の1210行の処理が実行される。すなわち、ループ処理として、「2倍算をk回(例えば3回)行い(図12の1207行)、tab[w[i]]を加算し、得られた結果を変数Vに代入する(図12の1208行)」という処理が行われる。そして、ループ処理の終了後に、補正値d’によるスカラー倍算d’Aが計算されて、その計算結果が変数Vに加算される(図12の1210行)。
具体的には、例えば下記の式(5.15)の計算が実行される。
dA=22(22(22(O)+tab[w[2]])+tab[w[1]])+tab[w[0]]+d’A
=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.4)により式(5.14)の補正値d’が算出されているので、式(5.15)の計算により確かにdA(すなわちこの例では378A)が得られる。
また、式(5.15)は、個人鍵dのビット値によらず、「2倍算をk回(上記の例ではk=2)行い、加算を1回行う」という処理がm回(上記の例ではm=3)繰り返され、補正値d’を用いた1回のスカラー倍算と点Aの加算が行われることを示す。よって、ランダム化window法は、window法と同様にSPA攻撃に対して安全である。また、テーブルデータが乱数sによってランダム化されているので、ランダム化window法は、DPA攻撃に対しても安全である。
<符号付window法によるテーブルデータの削減(第4の比較例)>
ところで、window法でもランダム化window法でも、ウィンドウサイズkに応じて、2k個のエントリがテーブル内に作成される。他方で、組み込み機器など、ある種の装置では、メモリ容量が少ないため、各種の処理を行うためのメモリ使用量を少なくすることが望ましい。
組み込み機器の1つの例はスマートカードである。また、組み込み機器の他の例は、プリンタなどの電子機器により認証される部品である。例えば、偽造品排除のために、二次電池あるいはプリンタカートリッジなどのアクセサリ部品に、「認証チップ」と呼ばれるLarge Scale Integration(LSI)が組み込まれていてもよい。プリンタによるプリンタカートリッジの認証は、例えば、正規品以外のプリンタカートリッジでの印刷を不能にするために行われてもよい。もちろん、組み込み機器にはその他の様々な種類がある。
例えば、スマートカードや認証機能つきプリンタカートリッジなどの装置では特に、メモリ搭載量が少ない。よって、スカラー倍算に関しても、メモリ使用量を抑えた処理アルゴリズムが好ましい。
そこで、第4の比較例として、「符号付(signed)window法」について次に説明する。符号付window法は、window法と同様にSPA攻撃に対して安全であり、かつwindow法よりもメモリ使用量が少ない方法である。
前述したwindow法は、RSA暗号(べき乗剰余演算)にも適用することができるが、ECC(点のスカラー倍算)に特化することで、テーブルデータをおよそ半分に削減できる方法が知られている。これが「符号付window法」と呼ばれる手法である。
言い換えれば、符号付window法は、「楕円曲線上の点Aから逆元である点-Aを求める計算の処理負荷は、比較的軽い(つまり逆元の計算コストが低い)」ということに注目した方法である(式(1.4)および(1.5)、ならびにその説明を参照)。
図13に、一般的なwindow法(同図(a))と符号付window法(同図kび)の比較を示す。windowのビット長kとした場合、一般的なwindow法は、windowのビット長kに対し、2k個のテーブルデータが必要となる。これに対し、符号付window法では、2k-1+1個のテーブルデータでよいため、テーブルデータを格納するために必要なRAMのサイズを半減させることができる。
図13(a)に示す3ビットwindow法の場合、0A, 1A, …, 7Aの8個のテーブルデータが必要となる。これに対し、図13(b)に示す3ビット符号つきwindow法の場合、0A,1A,…,4Aの5個のテーブルデータが必要となる。すなわち、3ビット符号付window法は、3ビットwindow法に比較して、3個のテーブルデータを削減できる。一般的なwindow法の場合、個人鍵dをkビット単位に分割し、そのままwindow値とする。これに対し符号つきwindow法においては、同様に個人鍵dをkビット単位に分割するが、その値が一定値(2k-1もしくは2k-1+1以上)の場合、window値に対し2kをマイナスする(window補正)。このマイナスの影響をキャンセルするために、一つ上位のwindow値に+1を加算する(carry補正)。図13(b)の3ビット符号付window法の場合、3ビット分割された各window値のうち、4以上ならばそのwindow値から8をマイナスする。このマイナス演算により4A,5A,6A,7Aはそれぞれ-4A,
-3A, -2A, -1Aに変更されるが、これらは4A,3A,2A,1Aのテーブルデータを用いた点の減算処理を実行することで計算を行うことができるので、5A,6A,7Aのテーブルは不要となる。
ここで、window値から2kを減算して得られるスカラー値、すなわち(window値-2k)は、-(2k-window値)である。そして、(2k-window値)は、window値に対する2の補数に等しい。したがって、(window値-2k)は、-(window値に対する2の補数)である。すなわち、window値から2kを減算して得られるスカラー値を使った点Aのスカラー倍算値は、window値に対する2の補数をスカラー値として使った点Aのスカラー倍算の演算結果に負符号を付けたものに等しくなる。そして、window値が2k-1もしくは2k-1+1以上である場合には、2の補数は必ず2k-1以下もしくは2k-1-1以下になる。
そこで、あらかじめwindow値が0から2k-1までの2k-1+1個のスカラー値に対応するスカラー倍算値0Aから2k-1Aを計算し、window値0から2k-1のそれぞれをインデックス値とするテーブルの各エントリに格納しておく。そして、window値が2k-1もしくは2k-1+1以上である場合におけるwindow値から2kを減算して得られるスカラー値を使った点Aのスカラー倍算値は、次のようにして求めることができる。すなわち、window値に対する2の補数をインデックス値として上記2k-1+1個のスカラー倍算値の演算結果0Aから2k-1Aが格納されたテーブルを参照して対応するスカラー倍算値の演算結果を取得し、その取得結果に負符号を付ければよい。もちろん、window値が2k-1もしくは2k-1+1未満である場合には、window値をそのままインデックス値として上記2k-1+1個のスカラー倍算値の演算結果0Aから2k-1Aが格納されたテーブルを参照して対応するスカラー倍算値の演算結果を取得すればよい。このようにして、テーブルサイズが、2k-1+1に削減できる。
例えば、ウィンドウサイズkが3であるとする。すると、符号付window法で使われるインデックスは0,1,2,3,4の5つである。そして、これらの5つのインデックスに対応する対応するテーブルデータは、0A,1A,2A,3A,4Aである。符号付window法では、次の式(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)
例えば、ウィンドウサイズkが3ビットであり、個人鍵dが241=(011110001)2であるとする。符号付window法では、まず、window法と同様にして仮のウィンドウ値が求められる。すなわち、仮のウィンドウ値は次の式(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[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.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]を用いて、符号付window法では式(6.7)により点dAが計算される。
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)
その後、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)
次に、ウィンドウ値w[1](=-2)に対応して、式(6.10)のとおり3回の2倍算と1回の減算が行われる。
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)
式(6.11)の右辺を展開すると、下記の式(6.12)のとおりである。また、上記のとおり本例において個人鍵dは241である。よって、以上説明した符号付window法により点dAが正しく計算されることが理解されるであろう。
V=23(23(23(O)+tab[4])-tab[2])+tab[1]
=23(23(4A)-2A)+1A
=8(32A-2A)+1A
=241A (6.12)
なお、符号付window法は、window法と同様の理由から、SPA攻撃に対しては安全であるが、DPA攻撃に対しては脆弱である。
<符号付ランダムwindow法の検討(第3+第4の比較例)>
さて、以上のとおり第1〜第4の比較例について説明したが、SPA攻撃とDPA攻撃の双方に対して安全なランダム化window法はメモリ消費量が比較的多く、メモリ消費量の少ない符号付window法はDPA攻撃に対しては脆弱である。すなわち、上記の4つの比較例の中には、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴を持つ手法は存在しない。
他方、サイドチャネル攻撃の一種であるPA攻撃は、組み込み機器に対しても行われる危険性が十分にあり、また、組み込み機器の中には、何らかの理由からメモリ容量が限られたものがある。よって、例えば組み込み機器のようにメモリ容量の小さな装置におけるスカラー倍算の処理は、SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ないことが好ましい。
しかしながら、本願発明者が研究したところ、「SPA攻撃とDPA攻撃の双方に対して安全で、かつメモリ使用量が少ない」という特徴は、単純素朴にランダム化window法と符号付window法を組み合わせることでは得られないことが判明した。むしろ、発明者は「ランダム化window法と符号付window法は、単純素朴に組み合わせることは不可能である」という知見を得た。この知見をもう少し詳しく述べると、次のとおりである。
乱数の使用は、符号付window法の単純な適用を阻害する。そのため、SPA攻撃への対策としてランダム化window法が採用されると、符号付window法の単純な適用によるメモリ使用量の削減は不可能となる。つまり、「符号付window法とランダム化window法の単純素朴な組み合わせによって、少ないメモリ使用量で、SPA攻撃とDPA攻撃の双方に対する安全性を確保しよう」という試みは、うまくいかない。
この知見について、より詳しく説明すれば、以下の通りである。
第4の比較例である符号付window法と第3の比較例であるランダム化window法を組み合わせてSPAにもDPAにも耐性を持つ点のスカラー倍算を実現することは困難である。例えば図14の例の場合、以下のようになる。なお、下記手順1.〜5.は、図14中の手順1.〜5.に、それぞれ対応している。
1.上位側から3個目のウィンドウで110となるため、window値を010とし、スカラー倍算の処理の際には点の減算処理を行うこととなる。この系列のsは+s→-sとなる。
2.3個目のwindow値を010としたため、2個目のwindow値に1ビットのキャリーが上がる。
3.手順2.で上がったキャリーにより、2個目のwindow値に+1が加算され、100となる。
4.手順3.で3個目のwindow値が100になることにより、-4Aを参照することとなり、sの符号が+s→-sへと変更になる。
5.手順4.で2個目のsが-sとなったことにより、手順1.で3個目のwindow値を確定した際に想定していたsと異なってしまう(+s)ため、3個目のwindow値を決定できない。
上記により、上位から下位に向かってwindow値を決定していくアルゴリズムについて、window値を一意に決定できなくなる。
以上説明したことをまとめると、図15に示される表となる。まず、前述した第3の比較例であるランダム化window法は、DPA攻撃に対して(およびSPA攻撃にも)有効であり、キャリー制御も単純であるが、テーブルサイズが2kと大きい。一方、前述した第4の比較例である符号付window法は、キャリー制御が単純でテーブルサイズは2k-1+1と小さいが、DPA攻撃に対して脆弱である。そして、第3比較例であるランダム化window法と第4の比較例である符号付window法は、単純な方法では組み合わせられない。つまり、テーブルサイズが通常のwindow法の約半分(2k-1+1個)となるような方法は単純な組み合わせでは実現できない。
そこで、本出願では、DPAに対して安全で、テーブルサイズが通常のwindow法の約半分(2k-1+1)で、キャリー制御が単純な手法を提供する。
課題を解決するために本出願は以下の特徴を持つ。
・(s||window値)の形の系列
・下位側から上位側へ向かって、出願手法に基づいた生成法によるwindow値の生成
一つ目の特徴である(s||window値)の形の系列を使用することにより、window法で計算する途中結果がランダム化されるため、DPAに対して安全になる。またwindow法を用いていることにより、SPAに対しても安全となる。
さらに、二つ目の特徴である下位側から上位側へ向かってのwindow値生成を後述するアルゴリズムで実行することにより、キャリーの制御が不要な簡単な手法で安全なスカラー倍算が実現できる。
図16は、第1〜第3の実施形態の暗号処理装置の第1のハードウェア構成例を示す図である。
図16の暗号処理装置1600は、Central Processing Unit(CPU)1601、Read Only Memory(ROM)1602、Random Access Memory(RAM)1603、通信回路1604、および通信インタフェース(I/F)1605を有する。通信回路1604は、通信I/F1605を介して他の装置との間で通信を行う。
そして、CPU1601、ROM1602、RAM1603、および通信回路1604は、バス1606により互いに接続されている。また、暗号処理装置1600は、電源端子1607とグランド端子1608を有し、暗号処理装置1600内の各部へは、不図示の配線と電源端子1607を介して電源電圧が供給される。暗号処理装置1600内の各部は、不図示の配線を介してグランド端子1608とも接続されている。
CPU1601は、ROM1602に予め記憶されたプログラムをRAM1603にロードし、RAM1603をワーキングエリアとして用いながらプログラムを実行することで、各種の処理を行う。例えば、CPU1601は、図20、図22、図23、図25、図26、図28のフローチャートで示される制御処理を実行する。
なお、ROM1602の代わりにフラッシュメモリなどの他の種類の不揮発性記憶装置が使われてもよい。フラッシュメモリなどの書き換え可能な記憶装置がROM1602の代わりに使われる場合は、プログラムは、通信I/F1605を介して暗号処理装置1600にダウンロードされ、暗号処理装置1600にインストールされてもよい。
また、暗号処理装置1600は、通信I/F1605を介して他の装置と通信することができる。例えば、暗号処理装置1600は、暗号処理装置1600自身の公開鍵などの情報を、通信I/F1605を介して他の装置に送信してもよいし、他の装置の公開鍵などの情報を、通信I/F1605を介して受信してもよい。
通信I/F1605の種類は、暗号処理装置1600の種類に応じた任意の種類でよい。例えば、暗号処理装置1600は、スマートカードでもよいし、プリンタカートリッジなどのアクセサリ部品に組み込まれるLSIチップでもよいし、家電製品に組みこまれるLSIチップでもよい。例えば、暗号処理装置1600が接触式スマートカードの場合は、通信I/F1605は通信用端子を含んでもよいし、暗号処理装置1600が非接触式スマートカードの場合は、通信I/F1605はアンテナを含んでもよい。
通信回路1604は、通信I/F1605の種類と通信プロトコルに応じて、適宜の処理を行う。例えば、通信回路1604は、ディジタル・アナログ変換、アナログ・ディジタル変換、変調、復調、符号化、復号などの処理を行ってもよい。
なお、PA攻撃を行う攻撃者は、通信I/F1605を介して楕円曲線上の点のデータを暗号処理装置1600に入力し、入力された点に関して暗号処理装置1600が処理を行っているときの消費電力を測定することで、暗号処理装置1600の個人鍵を推測する。例えば、攻撃者は、電源端子1607に抵抗器を接続することで、消費電力の測定を行う。
図17は、第1〜第3の実施形態の暗号処理装置の第2のハードウェア構成例を示す図である。図17の暗号処理装置1610は、CPU1601とROM1602の代わりにECCハードウェア回路1611を有する。
また、暗号処理装置1610は、図16の暗号処理装置1600と同様のRAM1603と通信回路1604と通信I/F1605を有する。そして、暗号処理装置1610において、ECCハードウェア回路1611とRAM1603と通信回路1604は互いにバス1606で接続されている。また、暗号処理装置1610にも図16の暗号処理装置1600と同様の電源端子1607とグランド端子1608がある。
暗号処理装置1610においては、ROM1602からプログラムを読み出して実行するCPU1601の代わりに、ECCハードウェア回路1611が図20、図22、図23、図25、図26、図28のフローチャートで示される制御処理を行う。ECCハードウェア回路1611は、例えば、Application Specific Integrated Circuit(ASIC)でもよいし、ECCハードウェア回路1611の少なくとも一部がField Programmable Gate Array(FPGA)により実現されていてもよい。また、ECCハードウェア回路1611も、不図示の配線により電源端子1607およびグランド端子1608と接続されている。
なお、実施形態によっては、暗号処理装置が、汎用プロセッサとしての図16のCPU1601と、CPU1601が実行するプログラムを格納する図16のROM1602と、コプロセッサとしての図17のECCハードウェア回路1611を有していてもよい。そして、図20、図22、図23、図25、図26、図28のフローチャートで示される制御処理の一部をCPU1601が行い、残りの一部をECCハードウェア回路1611が行ってもよい。その場合も、暗号処理装置は、図16および図17と同様に、RAM1603と通信回路1604と通信I/F1605を有する。
図18および図19は、第1〜第3の実施形態の暗号処理装置の機能構成を説明する図である。図18に示されるwindows値決定ユニット1800および図19に示される点のスカラー倍算計算ユニット1900は、図16または図17に例示したハードウェアにより実現することができる。
まず、図18のwindows値決定ユニット1800は、乱数生成部1801、windows値決定部1802、補正値計算部1803、制御部1804、window値格納部1805、補正値格納部1806、および乱数格納部1807を備える。
乱数生成部1801は、bビットの2進数の乱数sを生成する。
windows(ウィンドウ)値決定部1802は、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からkビットを取り出して2進数のwindow(ウィンドウ)列w(i)として計算する。
補正値計算部1803は、window列w(i)の最上位ビットが0ならば、window列w(i)の上位ビット側に乱数sを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とする。また、補正値計算部1803は、window列w(i)の最上位ビットが1ならば、2進法におけるwindow列w(i)に対する基数の補数のビット列vを計算する。そして、そのビット列vの上位ビット側に乱数sを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dからビット列-xを減算して新たな秘密鍵dのビット列とする。
制御部1804は、windows値決定部1802の処理と補正値計算部1803の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる。
window(ウィンドウ)値格納部1805は、制御部1804での動作が終了した後に得られる各window列w(i)を格納する。
補正値格納部1806は、制御部1804での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する。
乱数格納部1807は、乱数生成部1801が生成した乱数sを格納する。
次に、図19の点のスカラー倍算計算ユニット1900は、ランダム化テーブル生成部1901、符号付ランダム化window法計算部1902、および制御部1903を備える。同ユニット1900は、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して図18のwindows値決定ユニット1800が算出した乱数sと、各ウィンドウ列w(i)と、補正値d’とから、秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する。(ここで、b,m,k,i,jは0を含む自然数とする。)
ランダム化テーブル生成部1901は、window列w(i)のビット数に対応するビット数kのビット列の値を順次変化させながら、kビットのビット列の上位ビット側に乱数sを結合して得られるインデックス値をスカラー値として点Aに対するスカラー倍算を実行し、sそのスカラー倍算の計算結果を、インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成する。
符号付ランダム化window(ウィンドウ)法計算部1902は、補正値d’をスカラー値として点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定する。そして、符号付ランダム化window法計算部1902は、各ウィンドウ列w(j)について、上位ビット側から下位ビット側に向けて、以下の第1および第2の一連の処理を、繰り返し実行する。すなわち、同計算部1902は、第1の処理として、楕円曲線上の2倍算を各ウィンドウ列のビット数に対応する回数=k回実行する処理を実行する。次に、同計算部1902は、第2の処理として、ウィンドウ列w(j)の最上位ビットが0ならば、ウィンドウ列w(j)をインデックスとしてランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算する。一方、ウィンドウ列w(j)の最上位ビットが1ならば、2進法におけるウィンドウ列w(j)に対する基数の補数のビット列をインデックスとしてランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を出力変数Vに加算する。
制御部1903は、符号付ランダム化window法計算部1902における上述の各ウィンドウ列w(j)についての上位ビット側から下位ビット側に向けての繰り返し実行を制御する。
そして、制御部1903は、上記繰り返しの結果最終的に得られた出力変数Vの値を暗号演算の結果として出力する。
図18および図19で、乱数生成部1801、windows値決定部1802、補正値計算部1803、制御部1804、ランダム化テーブル生成部1901、符号付ランダム化window法計算部1902、および制御部1903は、以下の構成として実現できる。すなわち、これらの各部は、図16のCPU1601が実行する処理であってもよいし、図17のECCハードウェア回路1611が実行する処理であってもよいし、CPU1601とECCハードウェア回路1611の組み合わせにより実行される処理であってもよい。その場合に、これらの処理を実行するプログラムは、図16または図17のROM1602またはRAM1603に記憶させて、実行することができる。また、秘密鍵dは、例えば図16または図17のROM1602に記憶させることができる。また、図18のwindow値格納部1805、補正値格納部1806、および乱数格納部1807は、例えば図16または図17のRAM1603に記憶させることができる。
図19において、点Aは、第1〜第3の実施形態の暗号処理装置以外の装置から第1〜第3の実施形態の暗号処理装置に与えられる点でもよい。例えば、点Aは、外部装置の公開鍵でもよい。外部装置の公開鍵は、例えば、DH鍵共有のために外部装置から第1〜第3の実施形態の暗号処理装置へと通知されることもあるし、DSAによる認証のために外部装置から第1〜第3の実施形態の暗号処理装置へと通知されることもある。
点Aが第1〜第3の実施形態の暗号処理装置以外の装置から第1〜第3の実施形態の暗号処理装置に与えられる点である場合、点Aは、通信I/F1605と通信回路1604により取得される。
図19の制御部1903は、出力変数Vの値のxy座標を用いて適宜の処理を行う。例えば、制御部1903は、点Vを他の装置に送信してもよいし、DSAによる認証のための処理を行ってもよいし、DH鍵共有のための処理を行ってもよい。制御部1903は、場合によっては、通信回路1604と通信I/F1605を利用して、点Vを外部に出力してもよい。例えば、第1〜第3の実施形態の暗号処理装置が、ホスト(例えばプリンタなど)により認証されるアクセサリ部品(例えばプリンタカートリッジなど)に含まれる場合、制御部1903は、ホストと通信するための通信回路1604と通信I/F1605を含む。
次に、図18のwindows値決定ユニット1800および図19の点のスカラー倍算計算ユニット1900の具体的な処理を示す第1の実施形態について、以下に説明する。
図20は、図18のwindows値決定ユニット1800の処理を表す、第1の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
入力としては、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵d=d[b+m×k]||・・・||d[1]||d[0]が入力されて処理が開始される。ここで、kはwindow値のビット数、mはwindow列の個数、bは乱数sのビット数である。
そしてまず、bビットの2進数の乱数sが生成される(ステップ2201)。これは、図18の乱数生成部1801の機能に対応する。
次に、変数iの値がm-1に、変数Lの値が0に初期化される(ステップ2202)。
次に、現在の秘密鍵dのビット列の最下位からkビットが取り出されてwindow列w(i)とされる(ステップ2203)。これは、図18のwindows値決定部1802の機能に対応する。
次に、window列w(i)の最上位ビット(MSB:Most Significant Bit)が1であるか否かが判定される(ステップ2204)。
window列w(i)の最上位ビットの最上位ビットが0ならば、window列w(i)の上位ビット側に乱数sを結合して得られる2進数のビット列x=(s||w(i))を得る(ステップ2204→2205)。
続いて、現在の秘密鍵dからビット列xを減算し、その減算結果が0未満になっているか否かが判定される(ステップ2220)。
上記減算結果が0未満になっていなければ、上記減算結果が新たな秘密鍵dのビット列とされる(ステップ2220→2206)。
上記減算結果が0未満になった場合については後述する。
一方、window列w(i)の最上位ビットの最上位ビットが1ならば、2進法におけるwindow列w(i)に対する基数の補数のビット列vを計算する(ステップ2207)。より具体的には、window列w(i)とビット列2k-1との間で対応するビット毎に排他的論理和(XOR:エクスクルーシブオア)が演算されることにより、window列w(i)の各ビットが反転され、その反転結果に1が加算され、その加算結果がvとされる。
次に、上記ビット列vの上位ビット側に乱数sを結合してビット列x=(s||v)を得る(ステップ2208)。
そして、上記ビット列xに負符号をつけたビット列-xを、現在の秘密鍵dから減算し、新たな秘密鍵dのビット列とする。すなわち、d=d-(-x)=d+xを計算する(ステップ2206′)。
以上のステップ2204から2209までの一連の処理は、図18の補正値計算部1803の機能に対応する。
次に、上記ステップ2206または2206′により新たな秘密鍵dが算出できたら、その秘密鍵dのビット列がkビット右シフトされ、最下位kビットが捨てられる(ステップ2210)。ここで、「d>>k」は、秘密鍵dをkビット右シフトさせる演算を表す。
次に、変数iの値が-1される(ステップ2211)。
そして、変数iの値が0以上であるか否かが判定される(ステップ2212)。
変数iの値が0以上であれば、ステップ2203に戻って、再度ステップ2203から2209までの一連の処理が実行される(ステップ2212→2203)。
変数iの値が0未満になったときには、ステップ2213に移行する(ステップ2212→2213)。
また、前述のステップ2220でd-xの値が0未満になったときにも、変数Lの値に現在のi+1の値がセットされた後に(ステップ2220→2221)、ステップ2213に移行する。この処理については、後述する。
以上のステップ2210から2212、およびステップ2220,2221の制御処理は、図18の制御部1804の機能に対応する。
最後に、現在の秘密鍵dの値が補正値d’とされる(ステップ2213)。
そして、最終的に得られたwindow列w[0]〜w[m-1]、乱数s、補正値d’、およびwindow開始位置を示す変数Lの値が出力されて、window値決定アルゴリズムの処理が終了する。
以上の第1の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図21の説明図を用いながら説明する。
まず、kは前述したようにwindow値のビット長であり、事前に決定しておくパラメータである。また、bは前述したように乱数sのビット長であり、最低値を事前に決定しておくパラメータである。秘密鍵dの長さ(u)とk,bによりmの値も定まる。一例として以下のように定めることができる。
Figure 0005488718
ここで、mを決めたことによりbが変化する。
別の例としては以下でもよい。
Figure 0005488718
また、以下のようにしてもよい。
Figure 0005488718
さらに、以下のようにしてもよい。
Figure 0005488718
他にも多数の導出法が考えられる。
推奨されるパラメータ長としては、下記のような例となる。
k=2,3,4,5等
b=10,12,16,20,30,40,50,60,70,80,90,100など任意の長さ
dの長さu=512,1024,2048,3072,4096,
160,192,224,256,384,521,163,233,239,283,409,571等
ここで例えば、k=2,b=4,d=(10110111001011)2 ,(dの長さu=14ビット)である場合の楕円曲線暗号演算処理を考える。このとき、数4式の計算例により、
h=u−b=10
m=5
b=u−k×m=14-2×5=4(変化なし)
となる。
この条件のもとで、まずステップ2201により、b=4ビットの乱数として、例えば(1011)2が生成される。
次に、ステップ2202により、i=m-1=5-1=4、L=0と初期化される。
次に、第1周目のステップ2203により、図21に示されるように、dの最下位から2ビットを取り出してw[4]=(11)2 とする。
次に、第1周目のステップ2204により、w[4]の最上位ビットは1であると判定される。
この結果、第1周目のステップ2207により、w[4]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
続いて、第1周目のステップ2208により、x=(s||v)=(101101)2が算出される。
そして、第1周目のステップ2209により、図21に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(10110111001011)2 +(101101)2 =(10110111111000)2として新たな秘密鍵dが算出される。
次に、第1周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(101101111110)2が算出される。
次に、第1周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=3となる。
次に、第1周目のステップ2212により、変数i=3は0以上であると判定され、第2周目のステップ2203に戻る。
次に、第2周目のステップ2203により、図21に示されるように、dの最下位から2ビットを取り出してw[3]=(10)2 とする。
次に、第2周目のステップ2204により、w[3]の最上位ビットは1であると判定される。
この結果、第2周目のステップ2207により、w[3]=(10)2 に対して2の補数が演算され、v=(10)2が算出される。
続いて、第2周目のステップ2208により、x=(s||v)=(101110)2が算出される。
そして、第2周目のステップ2209により、図21に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(101101111110)2 +(101110)2 =(101110101100)2として新たな秘密鍵dが算出される。
次に、第2周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1011101011)2が算出される。
次に、第2周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=2となる。
次に、第2周目のステップ2212により、変数i=2は0以上であると判定され、第3周目のステップ2203に戻る。
次に、第3周目のステップ2203により、図21に示されるように、dの最下位から2ビットを取り出してw[2]=(11)2 とする。
次に、第3周目のステップ2204により、w[2]の最上位ビットは1であると判定される。
この結果、第3周目のステップ2207により、w[2]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
続いて、第3周目のステップ2208により、x=(s||v)=(101101)2が算出される。
そして、第3周目のステップ2209により、図21に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(1011101011)2 +(101101)2 =(1100011000)2として新たな秘密鍵dが算出される。
次に、第3周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11000110)2が算出される。
次に、第3周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=1となる。
次に、第3周目のステップ2212により、変数i=1は0以上であると判定され、第4周目のステップ2203に戻る。
次に、第4周目のステップ2203により、図21に示されるように、dの最下位から2ビットを取り出してw[1]=(10)2 とする。
次に、第4周目のステップ2204により、w[1]の最上位ビットは1であると判定される。
この結果、第4周目のステップ2207により、w[1]=(10)2 に対して2の補数が演算され、v=(10)2が算出される。
続いて、第4周目のステップ2208により、x=(s||v)=(101110)2が算出される。
そして、第4周目のステップ2209により、図21に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11000110)2 +(101110)2 =(11110100)2として新たな秘密鍵dが算出される。
次に、第4周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111101)2が算出される。
次に、第4周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=0となる。
次に、第4周目のステップ2212により、変数i=0は0以上であると判定され、第5周目のステップ2203に戻る。
次に、第5周目のステップ2203により、図21に示されるように、dの最下位から2ビットを取り出してw[0]=(01)2 とする。
次に、第5周目のステップ2204により、w[0]の最上位ビットは1ではないと判定される。
この結果、第5周目のステップ2205により、図21に示されるように、x=(s||w[0])=(101101)2が算出される。
次に、第5周目のステップ2220により、d-x=(111101)2-(101101)2 =(010000)2は、0未満ではないと判定される。
続いて、第5周目のステップ2206により、上記d-x=(010000)2が新たな秘密鍵dの値とされる。
次に、第5周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(0100)2が算出される。
次に、第5周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=-1となる。
次に、第5周目のステップ2212により、変数i=-1は0以上ではないと判定され、ステップ2213に進む。この結果、最終的に得られている秘密鍵d=(0100)2が、図21に示されるように、補正値d’とされる。
以上の処理の結果、最終的に得られたwindow列w[0]〜w[4]、乱数s、補正値d’、およびwindow開始位置を示す変数L=0の値(w[0]から開始を示す)が出力されて、window値決定アルゴリズムの処理が終了する。
以上説明したwindow値決定アルゴリズムの処理では、まず、秘密鍵dの下位ビットからkビットずつのwindow列w[i]が取り出される。そして、そのwindow列の最上位ビットが1である場合には、図13で説明した場合と同じ原理で、window列w[i]に対して2の補数が演算されてwindow値が補正されることにより、window法におけるテーブルサイズの半減化が行われる。これと共に、本実施形態では、window列の上位ビット側に乱数sが結合される。そして、window値の補正と乱数sの結合による秘密鍵dのずれ分が、ステップ2206または2206′およびステップ2210によって補正され、次のkビットのwindow列の切り出しは、この補正された秘密鍵dに対して行われる。このようにして、本実施形態では、下位ビット側で行われた、テーブルサイズ半減化のためのwindow値の補正とランダム化のための乱数sの上位ビット側への結合による秘密鍵dのずれが秘密鍵dの上位ビット側に伝搬されてゆく。この結果、必要数のwindow列w[m-1]〜w[0]が切り出された後に残った秘密鍵dのビット列を、補正値d’として出力することができる。
以上のようにして決定されたwindow列w[0]〜w[m-1]と補正値d’と乱数sを用いることにより、ランダム化と符号付window法を同時に達成することが可能となる。
なお、パラメータu,k,b,mの選択条件により、すべてのwindowが処理される前に、d-xの値が0未満になる可能性がある。この場合には、ステップ2220→2221→2213により、d-xの値が0未満になる直前までのwindow列と、その時点の秘密鍵dの値を補正値d’として出力するように制御する。このとき、最後に打ち切られたwindow列のサフィックスが変数L=i+1として出力される。すなわち、出力されるwindow列は、通常はステップ2202によりL=0のままとなるためw[0]〜w[m-1]となるが、d-x<0の条件が成立した場合には、L=0とはならないためw[0]≠w[L]〜w[m-1]が出力されることになる。つまり、変数Lは、暗号演算処理におけるwindow開始位置を示している。
図22は、図19の点のスカラー倍算計算ユニット1900の処理を表す、第1の実施形態における点のスカラー倍算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
入力としては、図20のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数s、補正値d’、window開始位置Lである。また、スカラー倍算のための楕円曲線上の点Aが入力される。
そしてまず、ステップ2301〜2307において、符号付ランダムwindow法のためのテーブル生成フェーズの処理が実行される。この制御処理は、図19のランダム化テーブル生成部1901の機能に対応する。
ここでは、上位bビットに乱数sが設定され、下位kビットの値が0から2k-1まで変化するビット列に対して、スカラー倍算演算が実行される。そして、そのスカラー倍算結果が、下位kビットの値をインデックス値とするテーブルのエントリに格納されてゆく。
まず、乱数sをスカラー値とする点Aに対するスカラー倍算sAが計算され、その結果が変数Uに格納される(ステップ2301)。この計算には、通常のバイナリ法を適用することができる。
次に、乱数sが上位ビット側に配置された状態でのスカラー倍算結果を得るために、ステップ2301で算出された変数Uの値に対して2倍算=2Uを実行して新たな変数Uの値とする演算処理がk回実行される(ステップ2302)。あるいは、U=2kUなる2k倍算処理を公知の高速化技術によって計算してもよい。これにより、下位kビットのwindow列に乱数sが結合された状態での、乱数sに対するスカラー倍算の演算成分が得られる。
このようにして得られた演算成分に対して、下位kビットのwindow列を変化させることによるスカラー倍算の演算成分が加算されて、テーブルデータが作成される。
すなわちまず、変数Uの値がそのまま、下位kビットによる値が0である場合のテーブルエントリT[0]に格納される(ステップ2303)。これは、下位kビットによる値が0のときは、それによるスカラー倍算の演算成分も0であるからである。
次に、変数iの初期値が1とされる(ステップ2304)。
次に、U=U+Aの点の加算処理が計算され、その結果がテーブルエントリT[i]に格納される(ステップ2305)。
次に、変数iの値が+1される(ステップ2306)。
そして、変数iの値が2k-1以下であるか否かが判定される(ステップ2307)。
変数iの値が2k-1以下であれば、ステップ2305に戻って、次のテーブルエントリの計算が実行される。
以上のステップ2305から2307までの繰り返し処理は、変数iに対応する下位kビットの値が1ずつ増えると、点Aに対するスカラー倍算の結果がAずつ増えてゆくことを利用したスカラー倍算の演算処理である。このようにして、T[0]からT[2k-1]までのテーブルデータが作成される。なお、テーブルデータのサイズは、2k個の約半分の2k-1+1個でよいことに留意する。
変数iの値が2k-1に達すると、テーブル生成フェーズを終了し、次に実際の暗号処理である点のスカラー倍算フェーズの処理になる。これは、ステップ2308から2316までの部分である。この制御処理は、図19の符号付ランダム化window法計算部1902の機能に対応する。
まず、V=d’Aとして、補正値d’に対するスカラー倍算成分が算出される(ステップ2308)。この計算には、通常のバイナリ法による演算を適用することができる。それは、補正値d’の値は、たとえ解読されたとしても秘密鍵dの解読は依然として困難にしておくことができるからである。変数Vは、暗号処理の出力値が最終的に得られる出力変数である。
次に、変数jの値がwindow列の最初のサフィックスLに初期化される(ステップ2309)。
次に、ステップ2310から2316のループ処理により、秘密鍵dの上位ビット側から下位ビット側に向けて、テーブル生成フェーズで生成されたテーブルを参照しながらスカラー倍算を計算する繰り返し処理が実行される。
まず、出力変数Vの値に対して2倍算2Vを実行する処理がk回実行される(ステップ2310)。あるいは、V=2kVなる2k倍算処理を公知の高速化技術によって計算してもよい。この処理により、補正値d’と最初の上位側window列w[L]との桁位置が合わせられる。
次に、window列w(j)の最上位ビット(MSB)が1であるか否かが判定される(ステップ2311)。
window列w(i)の最上位ビットの最上位ビットが0ならば、window列w(j)をインデックスとするテーブルデータT[w(j)]が取得され、出力変数Vに加算される(ステップ2312)。
一方、window列w(i)の最上位ビットの最上位ビットが1ならば、2進法におけるwindow列w(j)に対する基数の補数のビット列indexを計算する(ステップ2313)。より具体的には、window列w(j)とビット列2k-1との間で対応するビット毎に排他的論理和(XOR)が演算されることにより、window列w(j)の各ビットが反転され、その反転結果に1が加算され、その加算結果が変数indexの値とされる。
次に、変数indexの値をインデックスとするテーブルデータT[index]が取得され、出力変数Vに加算される(ステップ2314)。
ステップ2312または2314の処理の後、変数jの値が+1される(ステップ2315)。
そして、変数jの値がm-1以下であるか否かが判定される(ステップ2316)。
変数jの値がm-1以下であれば、さらに下位側のwindow列に対するスカラー倍算処理を実行するために、ステップ2310の処理に戻る。
変数jの値がm-1を超えれば、秘密鍵d全体に対する点Aのスカラー倍算と等価な処理を終了し、出力変数Vの値を暗号演算処理の結果として出力し、図22の点のスカラー倍算アルゴリズムの処理を終了する(ステップ2311の判定がno)。
以上の第1の実施形態における点のスカラー倍算アルゴリズムの処理の具体的な数値計算例について説明する。
ここで入力されるwindow列w[0]〜w[4]、乱数s、補正値d’、 window開始位置を示す変数Lは、前述した図21の数値計算例で得られたものである。
始めに、テーブル生成フェーズの数値計算例である。
まず、ステップ2301で、乱数s=(1011)2(図21参照)を使って、U=(1011)2 ×Aが計算される。
次に、ステップ2302で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1011)2×A=4×11×A=44Aとなる。
次に、ステップ2303で、インデックス値0に対応するテーブルエントリT[0]に、U=44Aが格納される。
次に、ステップ2304で、変数i=1と初期設定される。
次に、第1周目のステップ2305で、U=U+A=45Aがインデックス値1に対応するテーブルエントリT[1]に格納される。
次に、第1周目のステップ2306で、変数i=i+1=2とされる。
次に、第1周目のステップ2307で、変数i=2≦21=2の判定がyesとなり、第2周目のステップ2305に戻る。
次に、第2周目のステップ2305で、U=U+A=46Aがインデックス値1に対応するテーブルエントリT[2]に格納される。
次に、第2周目のステップ2306で、変数i=i+1=3とされる。
次に、第2周目のステップ2307で、変数i=3≦21=2の判定がnoとなり、テーブル生成フェーズを終了する。
以上により、T[0],T[1],T[2]の2k-1+1=3個のテーブルデータが生成される。
次に、点のスカラー倍算フェーズの数値計算例である。
まず、ステップ2308で、補正値d’=(0100)2 であるから(図21参照)、V=d’A=(0100)2 ×A=4Aが計算される。
次に、ステップ2309で、変数j=L=0とされる。
次に、第1周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×4A=16Aとなる。
次に、第1周目のステップ2311で、上位側1番目のwindow列w[0]=(01)2(図21参照)について、そのMSBが1ではないと判定される。
この結果、第1周目のステップ2312で、V=V+T[w[0]]=V+T[1]=16A+45A=61Aと計算される。
次に、第1周目のステップ2315で、変数j=j+1=1となる。
次に、第1周目のステップ2316で、変数j=1≦m−1=5−1=4の判定がyesとなる。
この結果、第2周目のステップ2310に戻る。
次に、第2周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×61A=244Aとなる。
次に、第2周目のステップ2311で、上位側2番目のwindow列w[1]=(10)2(図21参照)について、そのMSBが1であると判定される。
この結果、第2周目のステップ2313で、w[1]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
次に、V=V-T[Index]=V-T[2]=244A-46A=198Aが計算される。
次に、第2周目のステップ2315で、変数j=j+1=2となる。
次に、第2周目のステップ2316で、変数j=2≦m−1=5−1=4の判定がyesとなる。
この結果、第3周目のステップ2310に戻る。
次に、第3周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×198A=792Aとなる。
次に、第3周目のステップ2311で、上位側3番目のwindow列w[2]=(11)2(図21参照)について、そのMSBが1であると判定される。
この結果、第3周目のステップ2313で、w[2]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=792A-45A=747Aが計算される。
次に、第3周目のステップ2315で、変数j=j+1=3となる。
次に、第3周目のステップ2316で、変数j=3≦m−1=5−1=4の判定がyesとなる。
この結果、第4周目のステップ2310に戻る。
次に、第4周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×747A=2988Aとなる。
次に、第4周目のステップ2311で、上位側4番目のwindow列w[3]=(10)2(図21参照)について、そのMSBが1であると判定される。
この結果、第4周目のステップ2313で、w[3]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
次に、V=V-T[Index]=V-T[2]=2988A-46A=2942Aが計算される。
次に、第4周目のステップ2315で、変数j=j+1=4となる。
次に、第4周目のステップ2316で、変数j=4≦m−1=5−1=4の判定がyesとなる。
この結果、第5周目のステップ2310に戻る。
次に、第5周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×2942A=11768Aとなる。
次に、第5周目のステップ2311で、上位側5番目のwindow列w[4]=(11)2(図21参照)について、そのMSBが1であると判定される。
この結果、第5周目のステップ2313で、w[4]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=11768A-45A=11723Aが計算される。
次に、第5周目のステップ2315で、変数j=j+1=5となる。
次に、第5周目のステップ2316で、変数j=5≦m−1=5−1=4の判定がnoとなる。
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でスカラー倍算を行った結果((10110111001011)2×A = 11723A)と一致する。そして、本実施形態は、window法であることによりSPAに対して安全であり、テーブルデータがランダム化されたことによりDPAに対しても安全であり、テーブルサイズの削減(2k-1+1個)をも実現でき、かつキャリー制御も単純な暗号演算処理の実現が可能となる。
次に、図18のwindows値決定ユニット1800および図19の点のスカラー倍算計算ユニット1900の具体的な処理を示す第2の実施形態について、以下に説明する。
第2の実施形態では、第1の実施形態の処理に加えて、window列の値毎に異なる乱数s(i)が使用される。この結果、より攪乱性を高めることが可能となる。
図23は、図18のwindows値決定ユニット1800の処理を表す、第2の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
図23において、第1の実施形態における図20のフローチャートと同じ処理を実行するステップには、同じ番号を付してある。
図23の処理が図20の処理と異なるのはまず、乱数生成フェーズの処理である。この処理では、変数jの値が0に初期化された後(ステップ2401)、変数jの値が2k-1まで増加させられながら(ステップ2403、2404)、各変数j毎に、bビットの乱数s(j)が生成される(ステップ2402)。
そして、図20のステップ2205に対応する図23のステップ2405では、window列w(i)の上位ビット側に、そのwindow列w(i)の値に対応する乱数s(w(i))を結合して得られる2進数のビット列x=(s(w(i))||w(i))を得る。
また、図20のステップ2208に対応する図23のステップ2406では、ビット列vの上位ビット側に、そのビット列vの値に対応する乱数s(v)を結合してビット列x=(s(v)||v)を得る(ステップ2406)。
このようにして決定されたwindow値w[0]〜w[m-1]が、各window列毎の乱数s[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数Lと共に出力されることになる。
以上の第2の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図24の説明図を用いながら説明する。
まず、u,k,b,mの決定の仕方は、第1の実施形態の場合と同様である。
ここで例えば、k=2,b=4,d=(11010010101111) 2 ,(dの長さu=14ビット)である場合の楕円曲線暗号を考える。このとき、数4式の計算例により、
h=u−b=10
m=5
b=u−k×m=14-2×5=4(変化なし)
となる。
この条件のもとで、まずステップ2401で、変数j=0に初期設定される。
次に、第1周目のステップ2402で、4ビットの乱数s(0)として、例えば(0111)2が生成される。
次に、第1周目のステップ2043で変数j=j+1=1とされる。
そして、第1周目のステップ2404で、変数j=1≦22-1=2の判定がyesとなり、第2周目のステップ2402に戻る。
次に、第2周目のステップ2402で、4ビットの乱数s(1)として、例えば(1001)2が生成される。
次に、第2周目のステップ2043で変数j=j+1=2とされる。
そして、第2周目のステップ2404で、変数j=2≦22-1=2の判定がyesとなり、第3周目のステップ2402に戻る。
次に、第3周目のステップ2402で、4ビットの乱数s(2)として、例えば(1100)2が生成される。
次に、第3周目のステップ2043で変数j=j+1=3とされる。
そして、第3周目のステップ2404で、変数j=3≦22-1=2の判定がnoとなり、乱数生成フェーズの処理を終了する。
次に、ステップ2202により、i=m-1=5-1=4、L=0と初期化される。
次に、第1周目のステップ2203により、図24に示されるように、dの最下位から2ビットを取り出してw[4]=(11)2 とする。
次に、第1周目のステップ2204により、w[4]の最上位ビットは1であると判定される。
この結果、第1周目のステップ2207により、w[4]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
続いて、第1周目のステップ2406により、v=(01)2に対応する乱数s(v)=s((01)2)を使って、x=(s((01)2)||v)=(100101)2が算出される。
そして、第1周目のステップ2209により、図24に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11010010101111)2 +(100101)2 =(11010011010100)2として新たな秘密鍵dが算出される。
次に、第1周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(110100110101)2が算出される。
次に、第1周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=3となる。
次に、第1周目のステップ2212により、変数i=3は0以上であると判定され、第2周目のステップ2203に戻る。
次に、第2周目のステップ2203により、図24に示されるように、dの最下位から2ビットを取り出してw[3]=(01)2 とする。
次に、第2周目のステップ2204により、w[3]の最上位ビットは1ではないと判定される。
この結果、第2周目のステップ2405により、図24に示されるように、w[3]= (01)2に対応する乱数s(w[3])=s((01)2)を使って、x=(s((01)2)||w[3])=(100101)2が算出される。
次に、第2周目のステップ2220により、d-x=(110100110101)2-(100101)2=(110100010000)2は、0未満ではないと判定される。
続いて、第2周目のステップ2206により、上記d-x=(110100010000)2が新たな秘密鍵dの値とされる。
次に、第2周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1101000100)2が算出される。
次に、第2周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=2となる。
次に、第2周目のステップ2212により、変数i=2は0以上であると判定され、第3周目のステップ2203に戻る。
次に、第3周目のステップ2203により、図24に示されるように、dの最下位から2ビットを取り出してw[2]=(00)2 とする。
次に、第3周目のステップ2204により、w[2]の最上位ビットは1ではないと判定される。
この結果、第3周目のステップ2405により、図24に示されるように、w[2]= (00)2に対応する乱数s(w[2])=s((00)2)を使って、x=(s((00)2)||w[2])=(011100)2が算出される。
次に、第3周目のステップ2220により、d-x=(1101000100)2-(011100)2=(1100101000)2は、0未満ではないと判定される。
続いて、第3周目のステップ2206により、上記d-x=(1100101000)2が新たな秘密鍵dの値とされる。
次に、第3周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11001010)2が算出される。
次に、第3周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=1となる。
次に、第3周目のステップ2212により、変数i=1は0以上であると判定され、第4周目のステップ2203に戻る。
次に、第4周目のステップ2203により、図24に示されるように、dの最下位から2ビットを取り出してw[1]=(10)2とする。
次に、第4周目のステップ2204により、w[1]の最上位ビットは1であると判定される。
この結果、第4周目のステップ2207により、w[1]=(10)2に対して2の補数が演算され、v=(10)2が算出される。
続いて、第4周目のステップ2406により、v=(10)2に対応する乱数s((10)2)を使って、x=(s((10)2)||v)=(110010)2が算出される。
そして、第4周目のステップ2209により、図24に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(11001010)2+(110010)2=(11111100)2として新たな秘密鍵dが算出される。
次に、第4周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111111)2が算出される。
次に、第4周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=0となる。
次に、第4周目のステップ2212により、変数i=0は0以上であると判定され、第5周目のステップ2203に戻る。
次に、第5周目のステップ2203により、図24に示されるように、dの最下位から2ビットを取り出してw[0]=(11)2とする。
次に、第5周目のステップ2204により、w[0]の最上位ビットは1であると判定される。
この結果、第5周目のステップ2207により、w[0]=(11)2 に対して2の補数が演算され、v=(01)2が算出される。
続いて、第5周目のステップ2406により、v=(01)2に対応する乱数s((01)2)を使って、x=(s((01)2)||v)=(100101)2が算出される。
そして、第5周目のステップ2209により、図24に示されるxに負符号を付けた値-xが、現在の秘密鍵dの値から減算される。すなわち、d=d-(-x)=d+x=(111111)2+(100101)2=(1100100)2として新たな秘密鍵dが算出される。
次に、第5周目のステップ2210により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(11001)2が算出される。
次に、第5周目のステップ2211により、変数iの値が-1される。すなわち、i=i-1=-1となる。
次に、第5周目のステップ2212により、変数i=-1は0以上ではないと判定され、ステップ2213に進む。この結果、最終的に得られている秘密鍵d=(11001)2が、図24に示されるように、補正値d’とされる。
以上の処理の結果、最終的に得られたwindow列w[0]〜w[4]、乱数s[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数L=0の値が出力されて、window値決定アルゴリズムの処理が終了する。
図25は、図19の点のスカラー倍算計算ユニット1900の処理を表す、第2の実施形態における点のスカラー倍算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
図25において、第1の実施形態における図22のフローチャートと同じ処理を実行するステップには、同じ番号を付してある。
図25の処理が図22の処理と異なるのは、ステップ2501〜2510のテーブル生成フェーズの処理である。ステップ2308〜2316の点のスカラー倍算フェーズの処理は、図22と同じである。
入力としては、図23のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数s[0]〜s[2k-1]、補正値d’、window開始位置を示す変数Lである。また、スカラー倍算のための楕円曲線上の点Aが入力される。
まず、変数iの値が0に初期化される(ステップ2501)。この変数iは、テーブルのエントリを決定する。
次に、現在の変数iに対応する乱数s[i]をスカラー値とする点Aに対するスカラー倍算s[i]Aが計算され、その結果が変数Uに格納される(ステップ2502)。この計算には、通常のバイナリ法を適用することができる。
次に、乱数s[i]が上位ビット側に配置された状態でのスカラー倍算結果を得るために、ステップ2502で算出された変数Uの値に対して2倍算=2Uを実行して新たな変数Uの値とする演算処理がk回実行される(ステップ2503)。あるいは、U=2kUなる2k倍算処理を公知の高速化技術によって計算してもよい。これにより、下位kビットのwindow列に乱数s[i]が結合された状態での、乱数s[i]に対するスカラー倍算の演算成分が得られる。
次に、変数jの値が0に初期化される(ステップ2504)。
続いて、変数jの値が増加させられながら(ステップ2507)、変数jの値が変数iの値よりも小さい限り(ステップ2505)、U=U+Aの点の加算処理が繰り返し計算される(ステップ2506)。
そして、変数jの値が変数iの値に到達した時点で、変数Uの加算結果がテーブルエントリT[i]に格納される(ステップ2508)。
次に、変数iの値が+1される(ステップ2509)。
そして、変数iの値が2k-1以下であるか否かが判定される(ステップ2510)。
変数iの値が2k-1以下であれば、ステップ2502に戻って、次のテーブルエントリの計算が実行される。
以上のようにして、テーブルエントリ毎に異なる乱数s[i]を使ったテーブルデータT[i]を作成することが可能となり、これにより、テーブルデータの攪乱性がさらに向上し、DPAに対する耐性を強くすることが可能となる。
以後、ステップ2308〜2316の点のスカラー倍算フェーズでは、このテーブルデータT[i]の内容を使って、暗号演算処理が実行される。
以上の第2の実施形態における点のスカラー倍算アルゴリズムの処理の具体的な数値計算例について説明する。
ここで入力されるwindow列w[0]〜w[4]、乱数s[0]〜s[2]、補正値d’、window開始位置を示す変数Lは、前述した図24の数値計算例で得られたものである。 始めに、テーブル生成フェーズの数値計算例である。
まず、ステップ2501で、変数i=0とされる。
次に、変数iの第1周目のステップ2502で、乱数s[0]=(0111)2(図24参照)を使って、U=(0111)2 ×Aが計算される。
次に、変数iの第1周目のステップ2503で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(0111)2×A=4×7×A=28Aとなる。
次に、変数iの第1周目のステップ2504で、変数j=0とされる。
次に、変数iの第1周目における変数jの第1周目のステップ2505で、j=0<i=0の判定がnoとなる。
この結果、変数iの第1周目のステップ2508で、インデックス値0に対応するテーブルエントリT[0]に、U=28Aが格納される。
次に、第1周目のステップ2509で、変数i=i+1=1とされる。
次に、第1周目のステップ2510で、変数i=1≦21=2の判定がyesとなり、第2周目のステップ2502に戻る。
次に、変数iの第2周目のステップ2502で、乱数s[1]=(1001)2(図24参照)を使って、U=(1001)2 ×Aが計算される。
次に、変数iの第2周目のステップ2503で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1001)2×A=4×9×A=36Aとなる。
次に、変数iの第2周目のステップ2504で、変数j=0とされる。
次に、変数iの第2周目における変数jの第1周目のステップ2505で、j=0<i=1の判定がyesとなる。
この結果、変数iの第2周目における変数jの第1周目のステップ2506で、U=U+A=36A+A=37Aが計算される。
次に、変数iの第2周目における変数jの第1周目のステップ2507で、変数j=j+1=1とされ、変数jの第2周目のステップS2505に戻る。
次に、変数iの第2周目における変数jの第2周目のステップ2505で、j=1<i=1の判定がnoとなる。
この結果、変数iの第2周目のステップ2508で、インデックス値1に対応するテーブルエントリT[1]に、U=37Aが格納される。
次に、第2周目のステップ2509で、変数i=i+1=2とされる。
次に、第2周目のステップ2510で、変数i=2≦21=2の判定がyesとなり、第3周目のステップ2502に戻る。
次に、変数iの第3周目のステップ2502で、乱数s[2]=(1100)2(図24参照)を使って、U=(1100)2 ×Aが計算される。
次に、変数iの第3周目のステップ2503で、Uの2倍算処理がk=2回実行される。すなわち、U=22U=22×(1100)2×A=4×12×A=48Aとなる。
次に、変数iの第3周目のステップ2504で、変数j=0とされる。
次に、変数iの第3周目における変数jの第1周目のステップ2505で、j=0<i=2の判定がyesとなる。
この結果、変数iの第3周目における変数jの第1周目のステップ2506で、U=U+A=48A+A=49Aが計算される。
次に、変数iの第3周目における変数jの第1周目のステップ2507で、変数j=j+1=1とされ、変数jの第2周目のステップS2505に戻る。
次に、変数iの第3周目における変数jの第2周目のステップ2505で、j=1<i=2の判定がyesとなる。
この結果、変数iの第3周目における変数jの第2周目のステップ2506で、U=U+A=49A+A=50Aが計算される。
次に、変数iの第3周目における変数jの第2周目のステップ2507で、変数j=j+1=2とされ、変数jの第3周目のステップS2505に戻る。
次に、変数iの第3周目における変数jの第3周目のステップ2505で、j=2<i=2の判定がnoとなる。
この結果、変数iの第3周目のステップ2508で、インデックス値2に対応するテーブルエントリT[2]に、U=50Aが格納される。
次に、第3周目のステップ2509で、変数i=i+1=3とされる。
次に、第3周目のステップ2510で、変数i=3≦21=2の判定がnoとなり、乱数生成フェーズの処理を終了する。
以上により、T[0],T[1],T[2]の2k-1+1=3個のテーブルデータが生成される。
次に、点のスカラー倍算フェーズの数値計算例である。
まず、ステップ2308で、補正値d’=(11001)2 であるから(図24参照)、V=d’A=(11001)2 ×A=25Aが計算される。
次に、ステップ2309で、変数j=L=0とされる。
次に、第1周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×25A=100Aとなる。
次に、第1周目のステップ2311で、上位側1番目のwindow列w[0]=(11)2(図24参照)について、そのMSBが1であると判定される。
この結果、第1周目のステップ2313で、w[0]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=100A-37A=63Aが計算される。
次に、第1周目のステップ2315で、変数j=j+1=1となる。
次に、第1周目のステップ2316で、変数j=1≦m−1=5−1=4の判定がyesとなる。
この結果、第2周目のステップ2310に戻る。
次に、第2周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×63A=252Aとなる。
次に、第2周目のステップ2311で、上位側2番目のwindow列w[1]=(10)2(図24参照)について、そのMSBが1であると判定される。
この結果、第2周目のステップ2313で、w[1]=(10)2 に対して2の補数が演算され、Index=(10)2=2が算出される。
次に、V=V-T[Index]=V-T[2]=252A-50A=202Aが計算される。
次に、第2周目のステップ2315で、変数j=j+1=2となる。
次に、第2周目のステップ2316で、変数j=2≦m−1=5−1=4の判定がyesとなる。
この結果、第3周目のステップ2310に戻る。
次に、第3周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×202A=808Aとなる。
次に、第3周目のステップ2311で、上位側3番目のwindow列w[2]=(00)2(図24参照)について、そのMSBが1ではないと判定される。
この結果、第3周目のステップ2312で、V=V+T[w[2]]=V+T[0]=808A+28A=836Aと計算される。
次に、第3周目のステップ2315で、変数j=j+1=3となる。
次に、第3周目のステップ2316で、変数j=3≦m−1=5−1=4の判定がyesとなる。
この結果、第4周目のステップ2310に戻る。
次に、第4周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×836A=3344Aとなる。
次に、第4周目のステップ2311で、上位側4番目のwindow列w[3]=(01)2(図24参照)について、そのMSBが1ではないと判定される。
この結果、第4周目のステップ2312で、V=V+T[w[3]]=V+T[1]=3344A+37A=3381Aと計算される。
次に、第4周目のステップ2315で、変数j=j+1=4となる。
次に、第4周目のステップ2316で、変数j=4≦m−1=5−1=4の判定がyesとなる。
この結果、第5周目のステップ2310に戻る。
次に、第5周目のステップ2310で、Vの2倍算処理がk=2回実行される。すなわち、V=2kV=22V=4×3381A=13524Aとなる。
次に、第5周目のステップ2311で、上位側5番目のwindow列w[4]=(11)2(図24参照)について、そのMSBが1であると判定される。
この結果、第5周目のステップ2313で、w[4]=(11)2 に対して2の補数が演算され、Index=(01)2=1が算出される。
次に、V=V-T[Index]=V-T[1]=13524A-37A=13487Aが計算される。
次に、第5周目のステップ2315で、変数j=j+1=5となる。
次に、第5周目のステップ2316で、変数j=5≦m−1=5−1=4の判定がnoとなる。
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でスカラー倍算を行った結果((11010010101111)2×A = 13487A)と一致する。そして、本実施形態は、第1の実施形態と同様の効果に加えて、テーブルデータがエントリ毎の乱数s[i]でランダム化されたことによりDPAに対してさらに安全である。
次に、第3の実施形態について、以下に説明する。第3の実施形態では、第2の実施形態と同様にwindow列の値毎に異なる乱数s(i)を使用することで攪乱性を高める技術を、楕円曲線暗号以外のべき乗剰余演算(RSA)暗号処理に適用したものである。
第3の実施形態は、図18のwindows値決定ユニット1800と同様の構成、および図19の点のスカラー倍算計算ユニット1900の代わりにべき乗剰余計算ユニットが実装される構成において実施することができる。
図26は、第3の実施形態におけるwindow値決定アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
まず、ステップ3401から3404は、乱数生成フェーズの処理である。この処理では、変数jの値が0に初期化された後(ステップ3401)、変数jの値が2k-1で増加させられながら(ステップ3403、3404)、各変数j毎に、bビットの乱数s(j)が生成される(ステップ3402)。
上記乱数生成フェーズの処理により、window値として変化し得る0から2k-1までの値毎に、bビットの乱数s(j)が生成される。 次に、ステップ3405から3415のwindow値決定フェーズの処理について説明する。
まず、変数iの値がm-1に、変数Lの値が0に初期化される(ステップ3405)。
次に、現在の秘密鍵dのビット列の最下位からkビットが取り出されてwindow列w(i)とされる(ステップ3406)。
次に、window列w(i)の上位ビット側に、そのwindow列w(i)の値に対応する乱数s(w(i))を結合して得られる2進数のビット列x=(s(w(i))||w(i))を得る(ステップ3408)。
続いて、現在の秘密鍵dからビット列xを減算し、その減算結果が0未満になっているか否かが判定される(ステップ3420)。
上記減算結果が0未満になっていなければ、上記減算結果が新たな秘密鍵dのビット列とされる(ステップ3420→3409)。
次に、上記ステップ3409により新たな秘密鍵dが算出できたら、その秘密鍵dのビット列がkビット右シフトされ、最下位kビットが捨てられる(ステップ3410)。
次に、変数iの値が-1される(ステップ3414)。
そして、変数iの値が0以上であるか否かが判定される(ステップ3415)。
変数iの値が0以上であれば、ステップ3406に戻って、再度ステップ3406から3415までの一連の処理が実行される(ステップ3415→3406)。
上述の動作が繰り返される結果、変数iの値が0未満になったときには、ステップ3416に移行する(ステップ3415→3416)。
また、前述のステップ3420でd-xの値が0未満になったときにも、変数Lの値に現在のi+1の値がセットされた後に(ステップ3420→3421)、ステップ3416に移行する。この処理については、後述する。
最後に、現在の秘密鍵dの値が補正値d’とされる(ステップ3416)。
そして、最終的に得られたwindow列w[0]〜w[m-1]、乱数s[0]〜s[2k-1]、補正値d’、およびwindow開始位置を示す変数Lの値が出力されて、window値決定アルゴリズムの処理が終了する。
以上の第3の実施形態におけるwindow値決定アルゴリズムの処理の具体的な数値計算例について、図27の説明図を用いながら説明する。
ここで例えば、k=2,b=4,d=(100011000101101)2 ,(dの長さu=15ビット)である場合のべき乗剰余演算暗号(RSA暗号等)演算処理を考える。このとき、数4式の計算例により、
h=u−b=11
m=5
b=u−k×m=15-2×5=5(変化あり)
となる。
この条件のもとで、まずステップ3401で、変数j=0に初期設定される。
次に、第1周目のステップ3402で、5ビットの乱数s(0)として、例えば(01011)2が生成される。
次に、第1周目のステップ3403で変数j=j+1=1とされる。
そして、第1周目のステップ3404で、変数j=1≦22-1=3の判定がyesとなり、第2周目のステップ3402に戻る。
次に、第2周目のステップ3402で、5ビットの乱数s(1)として、例えば(11000)2が生成される。
次に、第2周目のステップ3403で変数j=j+1=2とされる。
そして、第2周目のステップ3404で、変数j=2≦22-1=3の判定がyesとなり、第3周目のステップ2402に戻る。
次に、第3周目のステップ3402で、5ビットの乱数s(2)として、例えば(11011)2が生成される。
次に、第3周目のステップ3403で変数j=j+1=3とされる。
そして、第3周目のステップ3404で、変数j=3≦22-1=3の判定がyesとなり、第4周目のステップ3402に戻る。
次に、第4周目のステップ3402で、5ビットの乱数s(3)として、例えば(00101)2が生成される。
次に、第4周目のステップ3403で変数j=j+1=4とされる。
そして、第4周目のステップ3404で、変数j=4≦22-1=3の判定がnoとなり、乱数生成フェーズの処理を終了する。
次に、ステップ3405により、i=m-1=5-1=4、L=0と初期化される。
次に、第1周目のステップ3406により、図27に示されるように、dの最下位から2ビットを取り出してw[4]=(01)2 とする。
次に、第1周目のステップ3408により、図27に示されるように、w[4]= (01)2に対応する乱数s(w[4])=s((01)2)を使って、x=(s((01)2)||w[4])=(1100001)2が算出される。
次に、第1周目のステップ3420により、d-x=(100011000101101)2-(1100001)2=(100010111001100)2は、0未満ではないと判定される。
続いて、第1周目のステップ3420により、上記d-x=(100010111001100)2が新たな秘密鍵dの値とされる。
次に、第1周目のステップ3413により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(1000101110011)2が算出される。
次に、第1周目のステップ3414により、変数iの値が-1される。すなわち、i=i-1=3となる。
次に、第1周目のステップ3415により、変数i=3は0以上であると判定され、第2周目のステップ3406に戻る。
次に、第2周目のステップ3406により、図27に示されるように、dの最下位から2ビットを取り出してw[3]=(11)2 とする。
次に、第2周目のステップ3408により、図27に示されるように、w[3]= (11)2に対応する乱数s(w[3])=s((11)2)を使って、x=(s((11)2)||w[3])=(0010111)2が算出される。
次に、第2周目のステップ3420により、d-x=(1000101110011)2-(0010111)2=(1000101011100)2は、0未満ではないと判定される。
続いて、第2周目のステップ3420により、上記d-x=(1000101011100)2が新たな秘密鍵dの値とされる。
次に、第2周目のステップ3413により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(10001010111)2が算出される。
次に、第2周目のステップ3414により、変数iの値が-1される。すなわち、i=i-1=2となる。
次に、第2周目のステップ3415により、変数i=2は0以上であると判定され、第3周目のステップ3406に戻る。
次に、第3周目のステップ3406により、図27に示されるように、dの最下位から2ビットを取り出してw[2]=(11)2 とする。
次に、第3周目のステップ3408により、図27に示されるように、w[2]= (11)2に対応する乱数s(w[2])=s((11)2)を使って、x=(s((11)2)||w[2])=(0010111)2が算出される。
次に、第3周目のステップ3420により、d-x=(10001010111)2-(0010111)2=(10001000000)2は、0未満ではないと判定される。
続いて、第3周目のステップ3420により、上記d-x=(10001000000)2が新たな秘密鍵dの値とされる。
次に、第3周目のステップ3413により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(100010000)2が算出される。
次に、第3周目のステップ3414により、変数iの値が-1される。すなわち、i=i-1=1となる。
次に、第3周目のステップ3415により、変数i=1は0以上であると判定され、第4周目のステップ3406に戻る。
次に、第4周目のステップ3406により、図27に示されるように、dの最下位から2ビットを取り出してw[1]=(00)2 とする。
次に、第4周目のステップ3408により、図27に示されるように、w[1]= (00)2に対応する乱数s(w[1])=s((00)2)を使って、x=(s((00)2)||w[1])=(0101100)2が算出される。
次に、第4周目のステップ3420により、d-x=(100010000)2-(0101100)2=(11100100)2は、0未満ではないと判定される。
続いて、第4周目のステップ3420により、上記d-x=(11100100)2が新たな秘密鍵dの値とされる。
次に、第4周目のステップ3413により、上記秘密鍵dが2ビット右シフトされる。すなわち、d= d>>2=(111001)2が算出される。
次に、第4周目のステップ3414により、変数iの値が-1される。すなわち、i=i-1=0となる。
次に、第4周目のステップ3415により、変数i=0は0以上であると判定され、第5周目のステップ3406に戻る。
次に、第5周目のステップ3406により、図27に示されるように、dの最下位から2ビットを取り出してw[0]=(01)2 とする。
次に、第5周目のステップ3408により、図27に示されるように、w[0]= (01)2に対応する乱数s(w[0])=s((01)2)を使って、x=(s((01)2)||w[0])=(1100001)2が算出される。
次に、第5周目のステップ3420により、d-x=(111001)2-(1100001)2は、0未満であると判定される。
この結果、第5周目のステップ3421により、L=i+1=0+1=1とされる。これにより、window列w[0]は採用されない。
その後、ステップ3416に移り、現在の秘密鍵dの値が、補正値d’=(111001)2とされる。
なお、ステップ3420でd-x<0の判定がyesとならずに、ステップ3415で変数iの値が0未満になったと判定された場合、すなわち設定された数だけwindow列が決定sわれた場合にも、ステップ3416に移行して、補正値d‘が算出される。
以上により、最終的に、window列w[1]〜w[4]と、乱数s[0]〜s[3]と、補正値d‘と、window開始位置を示す変数Lが出力されて、処理を終了する。
図28は、第3の実施形態におけるべき乗剰余演算アルゴリズムを示すフローチャートである。以下、このフローチャートの処理について説明する。
入力としては、図23のwindow値決定アルゴリズムにより算出されたwindow列w[L]〜w[m-1]、乱数s[0]〜s[2k-1]、補正値d’、window開始位置を示す変数Lである。また、入力値Aと、べき乗剰余演算のためのモジュロ数nが入力される。
まず、変数iの値が0に初期化される(ステップ3501)。この変数iは、テーブルのエントリを決定する。
次に、現在の変数iに対応する乱数s[i]をべき乗値とする入力値Aに対するべき乗剰余演算「As[i] mod n」が計算され、その結果が変数Uに格納される(ステップ3502)。この計算には、通常のバイナリ法を適用することができる。
次に、乱数s[i]が上位ビット側に配置された状態でのべき乗剰余演算結果を得るために、ステップ3502で算出された変数Uの値に対してU=U2をk回実行して新たな変数Uの値とする演算処理が実行される(ステップ3503)。これにより、下位kビットのwindow列に乱数s[i]が結合された状態での、乱数s[i]に対するべき乗剰余演算の演算成分が得られる。
次に、変数jの値が0に初期化される(ステップ3504)。
続いて、変数jの値が増加させられながら(ステップ3507)、変数jの値が変数iの値よりも小さい限り(ステップ3505)、「U=U×A mod n」の演算処理が繰り返し計算される(ステップ3506)。
そして、変数jの値が変数iの値に到達した時点で、変数Uの加算結果がテーブルエントリT[i]に格納される(ステップ3508)。
次に、変数iの値が+1される(ステップ3509)。
そして、変数iの値が2k-1以下であるか否かが判定される(ステップ3510)。
変数iの値が2k-1以下であれば、ステップ3502に戻って、次のテーブルエントリの計算が実行される。
以上のようにして、テーブルエントリ毎に異なる乱数s[i]を使ったテーブルデータT[i]を作成することが可能となり、これにより、テーブルデータの攪乱性がさらに向上し、DPAに対する耐性を強くすることが可能となる。
変数iの値が2k-1に達すると、テーブル生成フェーズを終了し、次に実際の暗号処理であるべき乗剰余演算フェーズの処理になる。これは、ステップ3511から3519までの部分である。
まず、「V=Ad’ mod n」として、補正値d’に対するべき乗剰余演算成分が算出される(ステップ3511)。この計算には、通常のバイナリ法による演算を適用することができる。それは、補正値d’の値は、たとえ解読されたとしても秘密鍵dの解読は依然として困難にしておくことができるからである。変数Vは、暗号処理の出力値が最終的に得られる出力変数である。
次に、変数jの値がwindow列の最初のサフィックスLに初期化される(ステップ3512)。
次に、ステップ3514から3519のループ処理により、秘密鍵dの上位ビット側から下位ビット側に向けて、テーブル生成フェーズで生成されたテーブルを参照しながらべき乗剰余演算を計算する繰り返し処理が実行される。
まず、出力変数Vの値に対して2乗剰余演算を実行して新たなVの値とする処理「V=V2 mod n」がk回実行される(ステップ3514)。この処理により、補正値d’と最初の上位側window列w[L]との桁位置が合わせられる。
次に、window列w(j)をインデックスとするテーブルデータT[w(j)]が取得され、これを用いて、「V-V×T[w(j)] mod n」の演算が実行される(ステップ3515)。
その後、変数jの値が+1される(ステップ3518)。
そして、変数jの値がm-1以下であるか否かが判定される(ステップ3519)。
変数jの値がm-1以下であれば、さらに下位側のwindow列に対するべき乗剰余演算処理を実行するために、ステップ3514の処理に戻る。
変数jの値がm-1を超えれば、秘密鍵d全体に対する入力値Aのべき乗剰余演算と等価な処理を終了し、出力変数Vの値を暗号演算処理の結果として出力し、図28のべき乗剰余演算アルゴリズムの処理を終了する(ステップ3519の判定がno)。
以上の第3の実施形態におけるべき乗剰余演算アルゴリズムの処理の具体的な数値計算例について説明する。
ここで入力されるwindow列w[1]〜w[4]、乱数s[0]〜s[3]、補正値d’、 window開始位置を示す変数Lは、前述した図27の数値計算例で得られたものである。
始めに、テーブル生成フェーズの数値計算例である。
まず、ステップ3501で、変数i=0とされる。
次に、変数iの第1周目のステップ3502で、乱数s[0]=(01011)2(図27参照)を使って、U=A(01011)mod n が計算される。
次に、変数iの第1周目のステップ3503で、U=U4 mod n=A(01011)× 4 mod n=A44 mod nの演算が実行される。
次に、変数iの第1周目のステップ3504で、変数j=0とされる。
次に、変数iの第1周目における変数jの第1周目のステップ3505で、j=0<i=0の判定がnoとなる。
この結果、変数iの第1周目のステップ3508で、インデックス値0に対応するテーブルエントリT[0]に、U= A44mod nが格納される。
次に、第1周目のステップ3509で、変数i=i+1=1とされる。
次に、第1周目のステップ3510で、変数i=1≦22-1=3の判定がyesとなり、第2周目のステップ3502に戻る。
次に、変数iの第2周目のステップ3502で、乱数s[1]=(11000)2(図27参照)を使って、U=A(11000) mod n が計算される。
次に、変数iの第2周目のステップ3503で、U=U4 mod n=A(11000)×4 mod n=A96 mod nが実行される。
次に、変数iの第2周目のステップ3504で、変数j=0とされる。
次に、変数iの第2周目における変数jの第1周目のステップ3505で、j=0<i=1の判定がyesとなる。
この結果、変数iの第2周目における変数jの第1周目のステップ3506で、U=U×A mod n = A97 mod nが計算される。
次に、変数iの第2周目における変数jの第1周目のステップ3507で、変数j=j+1=1とされ、変数jの第2周目のステップS3505に戻る。
次に、変数iの第2周目における変数jの第2周目のステップ3505で、j=1<i=1の判定がnoとなる。
この結果、変数iの第2周目のステップ3508で、インデックス値1に対応するテーブルエントリT[1]に、U=A97mod nが格納される。
次に、第2周目のステップ3509で、変数i=i+1=2とされる。
次に、第2周目のステップ3510で、変数i=2≦22-1=3の判定がyesとなり、第3周目のステップ3502に戻る。
次に、変数iの第3周目のステップ3502で、乱数s[2]=(11011)2(図27参照)を使って、U=A11011mod nが計算される。
次に、変数iの第3周目のステップ3503で、U=U4 mod n=A(11011)×4 mod n=A108 mod n Uの演算が実行される。
次に、変数iの第3周目のステップ3504で、変数j=0とされる。
次に、変数iの第3周目における変数jの第1周目のステップ3505で、j=0<i=2の判定がyesとなる。
この結果、変数iの第3周目における変数jの第1周目のステップ3506で、U=U×A mod n=A109 mod nが計算される。
次に、変数iの第3周目における変数jの第1周目のステップ3507で、変数j=j+1=1とされ、変数jの第2周目のステップS3505に戻る。
次に、変数iの第3周目における変数jの第2周目のステップ3505で、j=1<i=2の判定がyesとなる。
この結果、変数iの第3周目における変数jの第2周目のステップ3506で、U=U×A mod n=A110 mod nが計算される。
次に、変数iの第3周目における変数jの第2周目のステップ3507で、変数j=j+1=2とされ、変数jの第3周目のステップS3505に戻る。
次に、変数iの第3周目における変数jの第3周目のステップ3505で、j=2<i=2の判定がnoとなる。
この結果、変数iの第3周目のステップ3508で、インデックス値2に対応するテーブルエントリT[2]に、U=A110mod nが格納される。
次に、第3周目のステップ3509で、変数i=i+1=3とされる。
次に、第3周目のステップ3510で、変数i=3≦22-1=3の判定がyesとなり、第4周目のステップ3502に戻る。
次に、変数iの第4周目のステップ3502で、乱数s[3]=(00101)2(図27参照)を使って、U=A00101mod nが計算される。
次に、変数iの第4周目のステップ3503で、U=U4 mod n=A(00101)×4 mod n=A20 mod nの演算が実行される。
次に、変数iの第4周目のステップ3504で、変数j=0とされる。
次に、変数iの第4周目における変数jの第1周目のステップ3505で、j=0<i=3の判定がyesとなる。
この結果、変数iの第4周目における変数jの第1周目のステップ3506で、U=U×A mod n=A21 mod nが計算される。
次に、変数iの第4周目における変数jの第1周目のステップ3507で、変数j=j+1=1とされ、変数jの第2周目のステップS3505に戻る。
次に、変数iの第4周目における変数jの第2周目のステップ3505で、j=1<i=3の判定がyesとなる。
この結果、変数iの第4周目における変数jの第2周目のステップ3506で、U=U×A mod n=A22 mod nが計算される。
次に、変数iの第4周目における変数jの第2周目のステップ3507で、変数j=j+1=2とされ、変数jの第3周目のステップS3505に戻る。
次に、変数iの第4周目における変数jの第3周目のステップ3505で、j=2<i=3の判定がyesとなる。
この結果、変数iの第4周目における変数jの第3周目のステップ3506で、U=U×A mod n=A23 mod nが計算される。
次に、変数iの第4周目における変数jの第3周目のステップ3507で、変数j=j+1=3とされ、変数jの第4周目のステップS3505に戻る。
次に、変数iの第4周目における変数jの第4周目のステップ3505で、j=3<i=3の判定がnoとなる。
この結果、変数iの第4周目のステップ3508で、インデックス値3に対応するテーブルエントリT[3]に、U=A23mod nが格納される。
次に、第4周目のステップ3509で、変数i=i+1=4とされる。
次に、第4周目のステップ3510で、変数i=4≦22-1=3の判定がnoとなり、乱数生成フェーズの処理を終了する。
以上により、T[0],T[1],T[2],T[3]の2k=4個のテーブルデータが生成される。
次に、べき乗剰余演算フェーズの数値計算例である。
まず、ステップ3511で、補正値d’=(111001)2 であるから(図27参照)、V=Ad’mod n=A(111001)mod n=A57 mod nが計算される。
次に、ステップ3512で、変数j=L=1とされる(図27より、window列の開始位置はw[1]である)。
次に、第1周目のステップ3514で、V=V2 mod nをk回=(A57)2 )2 mod n = A228mod nが計算される。
次に、第1周目のステップ3515で、V=V×T[w[1]]=A228 ×A44mod n=A272 mod nが計算される。
次に、第1周目のステップ3518で、変数j=j+1=2となる。
次に、第1周目のステップ3519で、変数j=2≦m−1=5−1=4の判定がyesとなる。
この結果、第2周目のステップ3514に戻る。
次に、第2周目のステップ3514で、V=V2 mod nをk回=(A272)2 )2 mod n = A1088mod nが計算される。
次に、第2周目のステップ3515で、V=V×T[w[2]]=A1088 ×A23mod n=A1111 mod nが計算される。
次に、第2周目のステップ3518で、変数j=j+1=3となる。
次に、第2周目のステップ3519で、変数j=3≦m−1=5−1=4の判定がyesとなる。
この結果、第3周目のステップ3514に戻る。
次に、第3周目のステップ3514で、V=V2 mod nをk回=(A1111)2 )2 mod n = A4444mod nが計算される。
次に、第3周目のステップ3515で、V=V×T[w[3]]=A4444 ×A23mod n=A4467mod nが計算される。
次に、第3周目のステップ3518で、変数j=j+1=4となる。
次に、第3周目のステップ3519で、変数j=4≦m−1=5−1=4の判定がyesとなる。
この結果、第4周目のステップ3514に戻る。
次に、第4周目のステップ3514で、V=V2 mod nをk回=(A4467)2 )2 mod n = A17868mod nが計算される。
次に、第4周目のステップ3515で、V=V×T[w[4]]=A17868 ×A97mod n=A17965mod nが計算される。
次に、第4周目のステップ3518で、変数j=j+1=5となる。
次に、第4周目のステップ3519で、変数j=5≦m−1=5−1=4の判定がnoとなる。
この結果、出力変数Vの値が、暗号演算処理の最終結果として出力される。これは、通常の手法でべき乗剰余演算を行った結果(A11010010101111 mod n=A17965 mod n)と一致し、かつ、DPA,SPAに対して安全な処理を実現している。
図15の図表に追記する形で本実施形態の効果をまとめれば、図29のようになる。この図より、第1および第2の実施形態により、DPA(およびSPA)に対して安全で、テーブルサイズが通常のwindow法の約半分(2k-1+1)で、キャリー制御が単純な暗号演算処理を提供することが可能となる。
また、図29には掲載していないが、第2および第3の実施形態により、テーブルデータの攪乱性が高く、DPAに対してさらに安全な暗号演算処理を提供することが可能となる。
さらに、第3の実施形態は、べき乗剰余演算において、DPAに対してさらに安全な暗号演算処理を提供することが可能となる。
1600、1610 暗号処理装置
1601 CPU(Central Processing Unit)
1602 ROM(Read Only Memory)
1603 RAM(Random Access Memory)
1604 通信回路
1605 通信インタフェース(I/F)
1606 バス
1607 電源端子
1608 グランド端子
1611 ECCハードウェア回路
1800 windows値決定ユニット
1801 乱数生成部
1802 windows値決定部
1803 補正値計算部
1804、1903 制御部
1805 window値格納部
1806 補正値格納部
1807 乱数格納部
1900 点のスカラー倍算ユニット
1901 ランダム化テーブル生成部
1902 符号付ランダム化window法計算部

Claims (8)

  1. bビットの2進数の乱数sを生成する乱数生成部と、
    b,m,k,i,を0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からkビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定部と、
    前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数sを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数sを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算部と、
    前記ウィンドウ値決定部の処理と前記補正値計算部の処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させる制御部と、
    前記制御部での動作が終了した後に得られる前記各ウィンドウ列w(i)を格納するウィンドウ値格納部と、
    前記制御部での動作が終了した後に得られる秘密鍵dのビット列を補正値d’として格納する補正値格納部と、
    前記乱数生成部が生成した乱数sを格納する乱数格納部と、
    前記秘密鍵dと、前記乱数格納部に格納された乱数sと、前記ウィンドウ値格納部に格納された各ウィンドウ列と、前記補正値格納部に格納された補正値d’とを用いて、暗号演算を実行する暗号演算実行部と、
    を備えることを特徴とする暗号処理装置。
  2. 前記乱数生成部は、前記乱数を、前記ウィンドウ列w(i)または前記ビット列vが取り得る値iごとに乱数s(i)として生成し、
    前記補正値計算部は、前記ウィンドウ列w(i)または前記ビット列vに、前記ウィンドウ列w(i)または前記ビット列vごとの乱数s(w(i))またはs(v)を結合し、
    前記乱数格納部は、前記ウィンドウ列w(i)または前記ビット列vが取り得る値iごとの乱数s(i)を格納する、
    ことを特徴とする請求項1に記載の暗号処理装置。
  3. b,m,k,i,jを0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’とを用いて、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する暗号処理装置であって、
    前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成するランダム化テーブル生成部と、
    前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の2倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行する符号付ランダム化ウィンドウ法計算部と、
    前記出力変数Vの値を暗号演算の結果として出力する出力部と、
    を備えることを特徴とする暗号処理装置。
  4. 前記乱数格納部には、前記ウィンドウ列の値ごとの乱数が格納され、
    前記ランダム化テーブル生成部は、前記kビットのビット列の値に対応する乱数を前記kビットのビット列に結合する、
    ことを特徴とする請求項3に記載の暗号処理装置。
  5. コンピュータが、
    bビットの2進数の乱数sを生成し、
    b,m,k,i,を0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からkビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定処理を実行し、
    前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数sを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数sを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算処理を実行し、
    前記ウィンドウ値決定処理と前記補正値計算処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させ、
    前記繰り返しの実行が終了した後に得られる前記各ウィンドウ列w(i)を出力し、
    前記繰り返しの実行が終了した後に得られる秘密鍵dのビット列を補正値d’として出力し、
    前記秘密鍵dおよび前記乱数sを出力し、
    それぞれ出力された前記秘密鍵dと、前記乱数sと、前記各ウィンドウ列と、前記補正値d’とを用いて、暗号演算を実行する、
    ことを特徴とする暗号処理方法。
  6. コンピュータが、
    b,m,k,i,jを0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’を入力して、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行する暗号処理方法であって、
    前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成し、
    前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の2倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行し、
    前記出力変数Vの値を暗号演算の結果として出力する、
    ことを特徴とする暗号処理方法。
  7. 楕円曲線暗号を処理するコンピュータが、
    bビットの2進数の乱数sを生成し、
    b,m,k,i,を0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dを初期値として、現在の秘密鍵dの最下位からkビットを取り出して2進数のウィンドウ列w(i)として計算するウィンドウ値決定処理を実行し、
    前記ウィンドウ列w(i)の最上位ビットが0ならば、前記ウィンドウ列w(i)の上位ビット側に前記乱数sを結合して得られる2進数のビット列x=(s||w(i))を得て、現在の秘密鍵dからビット列xを減算して新たな秘密鍵dのビット列とし、前記ウィンドウ列w(i)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(i)に対する基数の補数のビット列vを計算し、該ビット列vの上位ビット側に前記乱数sを結合して得られるビット列に負符号を付けたビット列-x=-(s||v)を得て、現在の秘密鍵dから前記ビット列-xを減算して新たな秘密鍵dのビット列とする補正値計算処理を実行し、
    前記ウィンドウ値決定処理と前記補正値計算処理を、iをm-1から0まで変化させながら、iが0になるまでまたは前記秘密鍵dのビット列の値が負の数になる直前まで繰り返し実行させ、
    前記繰り返しの実行が終了した後に得られる前記各ウィンドウ列w(i)を出力し、
    前記繰り返しの実行が終了した後に得られる秘密鍵dのビット列を補正値d’として出力し、
    前記秘密鍵dおよび前記乱数sを出力し、
    それぞれ出力された前記秘密鍵dと、前記乱数sと、前記各ウィンドウ列と、前記補正値d’とを用いて、暗号演算を行う、
    処理を実行させるためのプログラム。
  8. b,m,k,i,jを0を含む自然数とし、楕円曲線暗号における(b+m×k)ビットの2進数の秘密鍵dに対応して、乱数sと、各ウィンドウ列w(i)と、補正値d’を入力して、前記秘密鍵dによる楕円曲線上の点Aに対する暗号演算を実行するコンピュータに、
    前記ウィンドウ列のビット数に対応するビット数kのビット列の値を順次変化させながら、前記kビットのビット列の上位ビット側に前記乱数sを結合して得られるインデックス値をスカラー値として前記点Aに対するスカラー倍算を実行し、前記スカラー倍算の計算結果を、前記インデックス値に対応してテーブルデータとして記憶してランダム化テーブルを生成し、
    前記補正値d’をスカラー値として前記点Aに対するスカラー倍算を計算して得られる計算結果を出力変数Vの初期値として設定し、前記楕円曲線上の2倍算を前記各ウィンドウ列のビット数に対応する回数=k回実行する処理と、ウィンドウ列w(j)の最上位ビットが0ならば、前記ウィンドウ列w(j)をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して前記出力変数Vに加算し、前記ウィンドウ列w(j)の最上位ビットが1ならば、2進法における前記ウィンドウ列w(j)に対する基数の補数のビット列をインデックスとして前記ランダム化テーブル中のテーブルデータを取得して負符号を付けて得た値を前記出力変数Vに加算する処理を、前記各ウィンドウ列から選択して得られる各ウィンドウ列w(j)について下位ビット側から上位ビット側に向けて実行し、
    前記出力変数Vの値を暗号演算の結果として出力する、
    処理を実行させるためのプログラム。
JP2012550615A 2010-12-27 2010-12-27 暗号処理装置、暗号処理方法、およびプログラム Expired - Fee Related JP5488718B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2010/073635 WO2012090288A1 (ja) 2010-12-27 2010-12-27 暗号処理装置、暗号処理方法、およびプログラム

Publications (2)

Publication Number Publication Date
JP5488718B2 true JP5488718B2 (ja) 2014-05-14
JPWO2012090288A1 JPWO2012090288A1 (ja) 2014-06-05

Family

ID=46382438

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012550615A Expired - Fee Related JP5488718B2 (ja) 2010-12-27 2010-12-27 暗号処理装置、暗号処理方法、およびプログラム

Country Status (3)

Country Link
US (2) US9401805B2 (ja)
JP (1) JP5488718B2 (ja)
WO (1) WO2012090288A1 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
FR3010210B1 (fr) 2013-08-29 2017-01-13 Stmicroelectronics Rousset Protection d'un calcul contre des attaques par canaux caches
US9929862B2 (en) * 2013-12-23 2018-03-27 Nxp B.V. Optimized hardware architecture and method for ECC point doubling using Jacobian coordinates over short Weierstrass curves
US9979543B2 (en) 2013-12-23 2018-05-22 Nxp B.V. Optimized hardware architecture and method for ECC point doubling using jacobian coordinates over short weierstrass curves
US9900154B2 (en) 2013-12-23 2018-02-20 Nxp B.V. Optimized hardward architecture and method for ECC point addition using mixed affine-jacobian coordinates over short weierstrass curves
JP6360440B2 (ja) * 2015-01-06 2018-07-18 Kddi株式会社 復号装置、方法及びプログラム
US10367637B2 (en) * 2016-07-22 2019-07-30 Qualcomm Incorporated Modular exponentiation with transparent side channel attack countermeasures
WO2018048819A1 (en) * 2016-09-06 2018-03-15 Gregorek Mark R Remote power management module
US10341098B2 (en) * 2017-01-24 2019-07-02 Nxp B.V. Method of generating cryptographic key pairs
EP3503459B1 (en) * 2017-12-22 2021-04-21 Secure-IC SAS Device and method for protecting execution of a cryptographic operation
US10942909B2 (en) * 2018-09-25 2021-03-09 Salesforce.Com, Inc. Efficient production and consumption for data changes in a database under high concurrency
CN111831253A (zh) * 2020-06-30 2020-10-27 深圳市永达电子信息股份有限公司 一种超长位数减法的处理方法和计算机可读存储介质
JP2022045614A (ja) * 2020-09-09 2022-03-22 キオクシア株式会社 演算装置
CN113609511B (zh) * 2021-09-30 2021-12-21 北京智芯微电子科技有限公司 数据处理和密钥保护方法、装置、设备、存储介质
CN114510753B (zh) * 2022-04-20 2023-04-07 浙江地芯引力科技有限公司 存储器数据保护方法、装置、电子设备及存储介质
US11824979B1 (en) * 2022-11-23 2023-11-21 SafeMoon US, LLC System and method of securing a server using elliptic curve cryptography

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003233307A (ja) * 2001-12-04 2003-08-22 Fujitsu Ltd 秘密鍵を用いた耐タンパ暗号処理
JP2006145945A (ja) * 2004-11-22 2006-06-08 Sony Corp 暗号処理演算方法、および暗号処理装置、並びにコンピュータ・プログラム
JP2007187908A (ja) * 2006-01-13 2007-07-26 Hitachi Ltd サイドチャネル攻撃に耐性を有するモジュラーべき乗算計算装置及びモジュラーべき乗算計算方法
US20080219438A1 (en) * 2007-03-06 2008-09-11 Research In Motion Limited Method and Apparatus for Generating a Public Key in a Manner That Counters Power Analysis Attacks

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3797808B2 (ja) 1998-10-27 2006-07-19 富士通株式会社 スカラー倍算方法およびその装置
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
US7940927B2 (en) 2005-04-27 2011-05-10 Panasonic Corporation Information security device and elliptic curve operating device
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 暗号処理システム及び暗号処理方法
EP2264939B1 (en) 2008-03-31 2015-03-04 Fujitsu Limited Encrypting method having countermeasure function against power analyzing attacks
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
WO2011121661A1 (ja) 2010-03-31 2011-10-06 富士通株式会社 暗号処理装置および暗号処理方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003233307A (ja) * 2001-12-04 2003-08-22 Fujitsu Ltd 秘密鍵を用いた耐タンパ暗号処理
JP2006145945A (ja) * 2004-11-22 2006-06-08 Sony Corp 暗号処理演算方法、および暗号処理装置、並びにコンピュータ・プログラム
JP2007187908A (ja) * 2006-01-13 2007-07-26 Hitachi Ltd サイドチャネル攻撃に耐性を有するモジュラーべき乗算計算装置及びモジュラーべき乗算計算方法
US20080219438A1 (en) * 2007-03-06 2008-09-11 Research In Motion Limited Method and Apparatus for Generating a Public Key in a Manner That Counters Power Analysis Attacks

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6014002581; Michael Tunstall: '"Random Order m-ary Exponentiation"' LNCS, Information Security and Privacy Vol.5594, 200907, p.437-451 *

Also Published As

Publication number Publication date
US9401805B2 (en) 2016-07-26
US20170048067A1 (en) 2017-02-16
US9749135B2 (en) 2017-08-29
JPWO2012090288A1 (ja) 2014-06-05
WO2012090288A1 (ja) 2012-07-05
US20140016772A1 (en) 2014-01-16

Similar Documents

Publication Publication Date Title
JP5488718B2 (ja) 暗号処理装置、暗号処理方法、およびプログラム
KR102136911B1 (ko) 스칼라 또는 멱수와의 곱셈 연산을 포함하는 암호화 방법
JP5412274B2 (ja) サイドチャネル攻撃からの保護
JP4668931B2 (ja) 電力解析攻撃に対する耐タンパ性を持った暗号化処理装置
US8422685B2 (en) Method for elliptic curve scalar multiplication
JP5573964B2 (ja) 暗号処理装置および方法
JP5446678B2 (ja) 楕円曲線暗号演算装置及び方法
WO2009122461A1 (ja) 電力解析攻撃への対策機能を備えた暗号化方法
CN101911009B (zh) 用于以签名方案进行非对称加密的对策方法和设备
JP2019523492A (ja) 難読化算術を実行するためのデバイス及び方法
JPWO2011121661A1 (ja) 暗号処理装置および暗号処理方法
KR101990861B1 (ko) 논-모듈러 승산기, 논-모듈러 승산 방법 및 계산 장치
JP6457911B2 (ja) スカラー倍算装置
RU2401513C2 (ru) Способ формирования и проверки подлинности электронной цифровой подписи, заверяющей электронный документ
US11973866B2 (en) Cryptographic processing method, related electronic device and computer program
Kim et al. SPA countermeasure based on unsigned left-to-right recodings
JP2014081426A (ja) 半導体装置および暗号処理方法

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: 20140128

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140210

R150 Certificate of patent or registration of utility model

Ref document number: 5488718

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees