(57)【特許請求の範囲】
【請求項１】
非負の整数Ａ，Ｂ及びｎビットの奇数Ｎに対し、剰余乗算（ｍｏｄｕｌａｒ  ｍｕｌｔｉｐｌｉｃａｔｉｏｎ）Ａ＊Ｂ＊Ｒ＾（−１）ｍｏｄ  Ｎ＋ｓ＊Ｎ（ｓは非負の整数，Ｒ＝２＾ｎ，以下、Ｘ＾Ｙは、ＸのＹ乗を表すものとする）の値Ｗを整数Ｍ及び整数Ｗを未知数とする不定方程式Ａ＊Ｂ＋Ｍ＊Ｎ＝Ｗ＊ＲのＭの値を下位のビットからｋビットごとに順次求めることにより前記Ｗを求める剰余乗算演算装置において、
前記Ａを記憶する第１の記憶装置と、
テーブルＴＢＬ（ｊ，ｓ）（ただし、０≦ｊ＜２＾ｋ、かつ０≦ｓ＜２＾ｋ）を記憶する第２の記憶装置と、
前記Ｗとして最初に０を記憶する第３の記憶装置と、
前記Ａの下位側からｋビットづつ値を取り出し値ｊとして第４の記憶装置に格納する第１の処理を行う制御装置と、
前記Ｗの下位ｋビットの値ｓと、前記値ｊとを用いて、前記第２の記憶装置に格納されたテーブルＴＢＬから値ＴＢＬ（ｊ，ｓ）を選択し、該Ｗに該ＴＢＬ（ｊ，ｓ）を加算する第２の処理を行う加算器と、
前記加算器による加算結果をｋビット右シフトして前記第３の記憶装置にＷとして格納する第３の処理を行うシフト手段とを有し、
前記ＴＢＬ（ｊ，ｓ）には、前記Ｂとｋビット長の値ｊとの乗算結果ｊ＊Ｂと前記Ｍのｋビット長の値ｔとの乗算結果ｔ＊Ｎ（ｔ＝０，１，…，２＾ｋ−１）の和ｊ＊Ｂ＋ｔ＊Ｎが、前記ｊの値と、ｓ＝２＾ｋ−（ｊ＊Ｂ＋ｔ＊Ｎ）ｍｏｄ  ２＾ｋで定義される値ｓにしたがって格納されており、前記第１乃至第３の処理を第１、第２、第３の処理の順番でｎ／ｋ回繰り返して実行して前記Ａ＊Ｂ＊Ｒ＾（−１）ｍｏｄ  Ｎ＋ｓ＊Ｎを求めることを特徴とする剰余乗算演算装置。
【請求項２】
前記Ｗに該ＴＢＬ（ｊ，ｓ）を加算する処理で発生するキャリー信号の値を０とする手段を有することを特徴とする請求項１記載の剰余乗算演算装置。
【請求項３】
非負の整数Ａ，Ｂ及びｎビットの奇数Ｎに対し、剰余乗算（ｍｏｄｕｌａｒ  ｍｕｌｔｉｐｌｉｃａｔｉｏｎ）Ａ＊Ｂ＊Ｒ＾（−１）ｍｏｄ  Ｎ＋ｓ＊Ｎ（ｓは非負の整数，Ｒ＝２＾ｎ，以下、Ｘ＾Ｙは、ＸのＹ乗を表すものとする）の値Ｗを整数Ｍ及び整数Ｗを未知数とする不定方程式Ａ＊Ｂ＋Ｍ＊Ｎ＝Ｗ＊ＲのＭの値を下位のビットからｋビットごとに順次求めることにより前記Ｗを求める剰余乗算演算装置において、
前記Ａを記憶する第１の記憶装置と、
テーブルＮＴＢＬ（ｊ，ｓ）＝（ｊ＊Ｂ＋ｔ＊Ｎ）＞＞ｋ（ただし、０≦ｊ＜２＾ｋ、かつ０≦ｓ＜２＾ｋ）を記憶する第２の記憶装置と、
前記Ｗとして最初に０を記憶する第３の記憶装置と、
前記Ａの下位側からｋビットづつ値を取り出し値ｊとして第４の記憶装置に格納する第１の処理を行う第１の制御装置と、
前記Ｗの下位ｋビットの値ｓと、前記値ｊとを用いて、前記第２の記憶装置に格納されたテーブルＮＴＢＬから値ＮＴＢＬ（ｊ，ｓ）を選択する第２の処理を行う第２の制御装置と、
該Ｗの下位ｋビットの値が全て０である場合はＷを右にｋビットシフトし、該Ｗの下位ｋビットの値のいずれか１ビット以上が１である場合にはＷを右にｋビットシフトした後に１を加える処理を行い、該Ｗに該ＮＴＢＬ（ｊ，ｓ）を加算する第３の処理を行う加算器と、
前記加算器による加算結果を前記第３の記憶装置にＷとして格納する第４の処理を行う手段とを有し、
前記ＮＴＢＬ（ｊ，ｓ）には、前記Ｂとｋビット長の値ｊとの乗算結果ｊ＊Ｂと前記Ｍのｋビット長の値ｔとの乗算結果ｔ＊Ｎ（ｔ＝０，１，…，２＾ｋ−１）の和ｊ＊Ｂ＋ｔ＊Ｎが、前記ｊの値と、ｓ＝２＾ｋ−（ｊ＊Ｂ＋ｔ＊Ｎ）ｍｏｄ  ２＾ｋで定義される値ｓにしたがって格納されており、前記第１乃至第４の処理を第１、第２、第３、第４の処理の順番でｎ／ｋ回繰り返して実行して前記Ａ＊Ｂ＊Ｒ＾（−１）ｍｏｄ  Ｎ＋ｓ＊Ｎを求めることを特徴とする剰余乗算演算装置。
【請求項４】
前記Ｗに該ＮＴＢＬ（ｊ，ｓ）を加算する処理で発生するキャリー信号の値を０とする手段を有することを特徴とする請求項３記載の剰余乗算演算装置。
【請求項５】
前記ｋが２であることを特徴とする請求項１記載の剰余乗算演算装置。
【請求項６】
前記ｋが２であることを特徴とする請求項３記載の剰余乗算演算装置。
【請求項７】
０と１のみを係数に持つような多項式Ａ（Ｘ），Ｂ（Ｘ）及び同じく０と１のみを係数に持ち、かつその定数項が１であるようなｎ次の既約多項式Ｆ（Ｘ）に対し、ＧＦ（２＾ｎ）における剰余乗算Ａ（Ｘ）＊Ｂ（Ｘ）＊Ｒ（Ｘ）＾（−１）  ｍｏｄ  Ｆ（Ｘ）（但し、Ｒ（Ｘ）＝Ｘ＾ｎ）の値をＭ（Ｘ）及び  Ｗ（Ｘ）を未知数とする不定方程式Ａ（Ｘ）＊Ｂ（Ｘ）＋Ｍ（Ｘ）＊Ｆ（Ｘ）＝Ｗ（Ｘ）＊Ｒ（Ｘ）のＭ（Ｘ）の値を低い次元の項からｋ項ごとに順次求めることにより前記Ｗ（Ｘ）を求める剰余乗算演算装置において、
前記Ａ（Ｘ）の係数を記憶する第１の記憶装置と、
前記Ｂ（Ｘ）の係数を記憶する第２の記憶装置と、
テーブルＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））（ただし、ｊ（Ｘ），ｓ（Ｘ）はｋ−１次以下の，０と１のみを係数にもつような多項式）を記憶する第３の記憶装置と、
前記Ｗ（Ｘ）として最初に０を記憶する第４の記憶装置と、
前記Ａ（Ｘ）の低次元側からｋ項づつ取り出し値ｊ（Ｘ）として第５の記憶装置に格納する第１の処理を行う制御装置と、
前記Ｗ（Ｘ）の低次元側からｋ項を取り出した値ｓ（Ｘ）と、前記値ｊ（Ｘ）とを用いて、前記第３の記憶装置に格納されたテーブルＴＢＬから値ＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））を選択し、該Ｗ（Ｘ）に該ＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））をＧＦ（２＾ｎ）における加算を行う第２の処理を行う排他的論理和演算器と、
前記排他的論理和演算器によるＧＦ（２＾ｎ）における加算結果をｋビット右シフトして、前記第４の記憶装置にＷ（Ｘ）として格納する第３の処理を行うシフト手段とを有し、
前記ＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））には、前記Ｂ（Ｘ）とｋ項の値ｊ（Ｘ）との乗算結果ｊ（Ｘ）＊Ｂ（Ｘ）と前記Ｍ（Ｘ）のｋ項分の値ｔ（Ｘ）との乗算結果ｔ（Ｘ）＊Ｆ（Ｘ）（ｔ＝０，１，Ｘ，…，Ｘ＾（ｋ−１）＋Ｘ＾（ｋ−２）＋…＋１）のＧＦ（２＾ｎ）における和ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）が、前記ｊ（Ｘ）の値と、ｓ（Ｘ）＝ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）ｍｏｄ  Ｘ＾ｋで定義される値ｓ（Ｘ）に従って格納されており、
前記第１乃至第３の処理を第１、第２、第３の処理の順番でｎ／ｋ回繰り返して実行して前記Ａ（Ｘ）＊Ｂ（Ｘ）＊Ｒ（Ｘ）＾（−１）ｍｏｄ  Ｆ（Ｘ）を求める剰余乗算演算装置であり、ここでの加算（＋）および乗算（＊）はガロア体ＧＦ（２＾ｎ）における加算と乗算であることを特徴とする剰余乗算演算装置。
【請求項８】
０と１のみを係数に持つような多項式Ａ（Ｘ），Ｂ（Ｘ）及び同じく０と１のみを係数に持ち、かつその定数項が１であるようなｎ次の既約多項式Ｆ（Ｘ）に対し、ＧＦ（２＾ｎ）における剰余乗算Ａ（Ｘ）＊Ｂ（Ｘ）＊Ｒ（Ｘ）＾（−１）  ｍｏｄ  Ｆ（Ｘ）（但し、Ｒ（Ｘ）＝Ｘ＾ｎ）の値をＭ（Ｘ）及び  Ｗ（Ｘ）を未知数とする不定方程式Ａ（Ｘ）＊Ｂ（Ｘ）＋Ｍ（Ｘ）＊Ｆ（Ｘ）＝Ｗ（Ｘ）＊Ｒ（Ｘ）のＭ（Ｘ）の値を低い次元の項からｋ項ごとに順次求めることにより前記Ｗ（Ｘ）を求める剰余乗算演算装置において、
前記Ａ（Ｘ）の係数を記憶する第１の記憶装置と、
前記Ｂ（Ｘ）の係数を記憶する第２の記憶装置と、
テーブルＮＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））＝（ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）−（ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）ｍｏｄ  Ｘ＾ｋ））／Ｘ＾ｋ（ただし、ｊ（Ｘ），ｓ（Ｘ）はｋ−１次以下の，０と１のみを係数にもつような多項式であり、ｓ（Ｘ）はｓ（Ｘ）＝ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）ｍｏｄ  Ｘ＾ｋで定義される多項式）を記憶する第３の記憶装置と、
前記Ｗ（Ｘ）として最初に０を記憶する第４の記憶装置と、
前記Ａ（Ｘ）の低次元側からｋ項づつ取り出し値ｊ（Ｘ）として第５の記憶装置に格納する第１の処理を行う制御装置と、
前記Ｗ（Ｘ）の低次元側からｋ項を取り出した値ｓ（Ｘ）と、前記値ｊ（Ｘ）とを用いて、前記第３の記憶装置に格納されたテーブルＮＴＢＬから値ＮＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））を選択し、該Ｗ（Ｘ）の係数をｋ分だけシフトすることで、下位ｋ項の係数を０とした後にＸ＾ｋで割る処理を行い、該Ｗ（Ｘ）に該ＮＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））をＧＦ（２＾ｎ）における加算を行い、前記第４の記憶装置にＷ（Ｘ）として格納する第２の処理を行うシフト手段及び排他的論理和演算器とを有し、
前記ＮＴＢＬ（ｊ（Ｘ），ｓ（Ｘ））には、前記Ｂ（Ｘ）とｋ項の値ｊ（Ｘ）との乗算結果ｊ（Ｘ）＊Ｂ（Ｘ）と前記Ｍ（Ｘ）のｋ項分の値ｔ（Ｘ）との乗算結果ｔ（Ｘ）＊Ｆ（Ｘ）（ｔ＝０，１，Ｘ，…，Ｘ＾（ｋ−１）＋Ｘ＾（ｋ−２）＋…＋１）のＧＦ（２＾ｎ）における和ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）の低次元側からｋ項を０とし、Ｘ＾ｋで割った値が、前記ｊ（Ｘ）の値と、ｓ（Ｘ）＝ｊ（Ｘ）＊Ｂ（Ｘ）＋ｔ（Ｘ）＊Ｆ（Ｘ）ｍｏｄ  Ｘ＾ｋで定義される値ｓ（Ｘ）に従って格納されており、
前記第１乃至第２の処理を第１、第２の処理の順番でｎ／ｋ回繰り返して実行して前記Ａ（Ｘ）＊Ｂ（Ｘ）＊Ｒ（Ｘ）＾（−１）ｍｏｄ  Ｆ（Ｘ）を求める剰余乗算演算装置であり、ここでの加算（＋）、減算（−）および乗算（＊）はガロア体ＧＦ（２＾ｎ）における加算、減算、乗算であることを特徴とする剰余乗算演算装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，剰余乗算演算(modular multiplication)や、べき乗剰余演算(modular exponentiation)を用いた符号化(encryption)及び復号化(decryption)装置に適用して有効なものであり、特に、ICカード(smart card)のような高いセキュリティを持つデータ処理装置に適用して有効な技術に関するものである。
【０００２】
【従来の技術】
ヨーロッパで広く利用されているＧＳＭ(Global Systems for Mobile communications)規格のモバイルホンをはじめとするモバイル端末や、ICカード(smart card)などでは、利用者認証(user authentication)や、電子商取引(electric commerce)を行うことができる。一般に、電子マネー(electric money)として利用する場合、それはＩＣカードの形態を取っており、ＧＳＭモバイルホン(GSM mobile radiotelephone system)の場合は、ＳＩＭ(Subscriber Identification Module)とよばれる形態を取っている。SIMもICカードも端子付きの半導体チップをプラスティックの板に張り付けたものであり、いずれもデバイスの実体は同じく半導体チップであるので、以下ＩＣカードについて説明する。
ＩＣカードは、勝手に書き換えることが許されないような個人情報の保持や、秘密情報である暗号鍵(cryptographic key)を用いたデータの暗号化(encryption)や暗号文(cipher text)の復号化(decryption)を行う装置である。ICカード自体は電源を持っておらず，ＩＣカード用のリーダライタ(Card reader/writer)に差し込まれると，電源の供給を受け，動作可能となる。動作可能になると，リーダライタから送信されるコマンドを受信し，そのコマンドに従って，データの転送等の処理を行う。ICカードの一般的な解説は，オーム社出版電子情報通信学会編水沢順一著「ICカード」などにある。
ICカードの構成は，図１に示すように，カード101の上に，ICカード用チップ102を搭載したものである。図に示すように、一般にICカードは，ISO7816の規格に定められた位置に供給電圧端子Vcc, グランド端子GND，リセット端子RST, 入出力端子I/O, クロック端子CLKを持ち，これらの端子を通して，リーダーライタから電源の供給やリーダライタとのデータの通信を行う(W.Rankl and Effing : SMARTCARD HANDBOOK, John Wiley & Sons, 1997, pp.41参照)。
ICカード用チップの構成は，基本的には通常のマイクロコンピュータと同じ構成である。その構成は，図2に示すように，中央処理装置(CPU：Central Processing Unit)201，記憶装置(Memory)204，入出力（I/O）ポート207，コ・プロセッサ(coprocessor)202からなる（コ・プロセッサはない場合もある）。CPU201は，論理演算(logical operation)や算術演算(arithmetic operation)などを行う装置であり，記憶装置204は，プログラムやデータを格納する装置である。入出力ポートは，リーダライタと通信を行う装置である。コ・プロセッサは，暗号処理そのもの、または、暗号処理に必要な演算を高速に行う装置であり、例えば、RSA暗号の剰余演算を行う為の特別な演算装置や、DES(Data Encryption Standard)の処理を行う暗号装置などがある。ICカード用プロセッサの中には，コ・プロセッサを持たないものも多くある。データバス203は，各装置を接続するバスである。
記憶装置２０４は，ROM(Read Only Memory)やRAM(Random Access Memory)，EEPROM(Electrical Erasable Programmable Read Only Memory)などからなる。ROMは，変更できないメモリであり，主にプログラムを格納するメモリである。RAMは自由に書き換えができるメモリであるが，電源の供給が中断されると，記憶している内容は消滅する。ICカードがリーダライタから抜かれると電源の供給が中断されるため，RAMの内容は，保持されなくなる。EEPROMは，電源の供給が中断されてもその内容を保持することができるメモリである。このメモリは、書き換える必要があり，ICカードがリーダライタから抜かれても，保持するデータを格納するために使われる。例えば，プリペイドカードの利用度数などは，使用するたびに書き換えられ，かつリーダライタから抜かれてもデータを保持する必要があるため，EEPROMで保持される。
利用者認証や、電子マネー決済を実現するには、公開鍵暗号(public key cryptography)の技術が必要である。公開鍵暗号とは、公開情報の中に秘密情報を埋め込んで用いるものであり、送信側と受信側で異なる鍵を用いる為、非対称鍵暗号(asymmetric key cryptography)とも呼ばれる。現在広く利用されている公開鍵暗号として、RSA暗号がある。RSA暗号は、大きな素数の積を生成することは容易だが、与えられた合成数を因数分解することは困難であるという事実に基づいている。RSA暗号では、公開モジュラス(public modulus)Nと、与えられた暗号文(cipher text)Yに対し、秘密鍵指数(secret exponent)Xを用いて、Y^X mod N（Y^Xは、YのX乗を意味する）という計算を行うことにより、平文(plain text)Mを得る計算、又は、この逆の操作が行われる。この操作は、べき乗剰余演算(modular exponentiation)と呼ばれる。
ここで、前記X,Y,Nは、2001年現在、1024ビットから2048ビット程度の非常に大きな数が利用される為、「Y^X mod N」をいかにして高速に実行するかが、従来から応用数学、工学の分野で課題とされていた。特に、ICカードのように記憶装置の容量が制限されており、かつCPUの能力が低いデバイスにおいては、前記べき乗剰余演算は非常に大きなタスクであり、その高速演算は非常に重要な課題である。
べき乗剰余演算のアルゴリズムは種々知られているが、例えば、次に示すものは、広く利用されている。これは、加法連鎖方式(addition chain method)と呼ばれている。
[アルゴリズム１]
input Y, X=(X[n-1]X[n-2]...X[1]X[0]), N
output Y^X mod N
A = 1                                ステップ１
B = Y                                ステップ２
For j = n-1 to 0 step 1{            ステップ３
A = A^2 mod N                      ステップ４
If X[j] = 1 then A = A*B mod N      ステップ５
}
output A                              ステップ６
このアルゴリズムにおいては、nは、Xのビット長に対応され、(X[n-1]X[n-2]...X[1]X[0])は、Xの二進数表現である。本アルゴリズムは、概略的には、二乗の剰余乗算「A^2 mod N」（ステップ４）及び、剰余乗算「A = A*B mod N」（ステップ５）を組み合せて実行され、X[n-1], X[n-2], ..., X[1], X[0]における1の個数をH(X)とすると、二乗の剰余乗算「A^2 mod N」にn回、剰余乗算「A = A*B mod N」にH(X)回の演算が繰り返し行われることになる。
上記のアルゴリズム1で、正しい結果が得られることを数値例で確認しておく。
アルゴリズムの確認の意味では、指数Xを具体化すれば十分であるので、Y及びNは、記号のまま用いることにする。
S = Y^45 mod N
をアルゴリズム１に従って計算する。ここで、指数45は、二進数では、
45 = 101101（二進数）
と書くことができる。従って、アルゴリズム１の記号を用いて指数を表現すると、
X[5] = 1, X[4] = 0, X[3] = 1, X[2] = 1, X[1] = 0, X[0] = 1
となる。ビット数nは6である。Sの初期値は1である。
(1) j=5のとき
Sの初期値は1であるから、これを二乗しNで割った剰余を取っても、1である（ステップ４）。
X[5] = 1であるから、ステップ５が実行され、
S = 1*Y mod N
= Y mod N
が得られる。
(2) j=4のとき
このときのSの値は、最初S = Y mod Nであるから、これを二乗してNで割った剰余を取ると、S = Y^2 mod Nとなる。
X[4] = 0であるから、ステップ５は実行されず、S = Y^2 mod Nのままである。
(3) j=3のとき
このときのSの値は、最初S = Y^2 mod Nであるから、これを二乗してNで割った剰余を取ると、S = Y^4 mod Nとなる。
X[3] = 1であるから、ステップ５が実行され、
S = Y^4*Y mod N = Y^5 mod N
となる。
(4) j=2のとき
このときのSの値は、最初S = Y^5 mod Nであるから、これを二乗してNで割った剰余を取ると、S = Y^10 mod Nとなる。
X[2] = 1であるから、ステップ５が実行され、
S = Y^10*Y mod N = Y^11 mod N
となる。
(5) j=1のとき
このときのSの値は、最初S = Y^11 mod Nであるから、これを二乗してNで割った剰余を取ると、S = Y^22 mod Nとなる。
X[1] = 0であるから、ステップ５は実行されず、S = Y^22 mod Nのままである。
(6) j=0のとき
このときのSの値は、最初S=Y^22 mod Nであるから、これを二乗してNで割った剰余を取ると、S = Y^44 mod Nとなる。
X[0] = 1であるから、ステップ５が実行され、
S = Y^44*Y mod N = Y^45 mod N
となり、所望の結果が得られる。
このようにアルゴリズム1ではべき乗剰余演算を剰余乗算（二乗も含む）に分解して実行する為、「A*B mod N」の演算機能を持つ演算装置を用いればよい。
しかしながら、A, B, Nはいずれも非常に大きな値であり、例えば、データ長を現在主流の1024ビットであるとすると、中間結果A*Bは、2048ビットの大きな数となる問題がある。さらに、A*BをNで割った値が最終結果となるため、2048ビット÷1024ビットという大きな値を扱う除算を実行しなければならない。ここで、乗算は、乗数と被乗数を分割することにより、マイクロプロセッサ等により並列処理が可能であるが、除算は、並列化が困難であり、これが高速化を阻む要因となっていた。
このような剰余乗算「A*B mod N」における除算の問題を解決するため、Nによる除算を行わずに「A*B*R^(-1) mod N」を実行するアルゴリズム２が知られている。ここで、Rは、2^n(nは例えばNのビット長(bit-length))であり、R>Nを満たす正の整数である。又、以下では、Nを奇数と仮定する。この仮定は、RSAや素体(prime field)上の楕円曲線暗号(elliptic curve cryptography)においては妥当な仮定である。実際、RSAにおいては、Nは大きな素数の積であり、素体では、大きな素数を法とする剰余演算(modular arithmetic operation)が行われるので、同様に、Nは奇数である。
下記アルゴリズム２は、数学者ピーター・モンゴメリ(Peter Montgomery)によって提案されたものである。アルゴリズム２を導く論証の詳細については、ここでは説明を省略するが、例えば、モンゴメリ自身によって書かれた論文P. L. Montgomery, ”Modular Multiplication without Trial Division”, Math. Comp., vol. 44, 1985, pp.519-521、又は、暗号理論(cryptology)における標準的ハンドブック A. Menezes, P.C.van Oorschot, S.A.Vanstone, ”Handbook of Applied Cryptography”, CRC-press, 1997, pp. 602-603に記載がある。
[アルゴリズム２]
W = 0
For j = 0 to n-1 step +1{
T = W + A[j]*B
If T is odd then W = ( T + N )/2
Else W = T/2
}
If W >= N then W = W - N
Output W
アルゴリズム２において求まるのは、A*B*R^(-1) mod Nの値であるので、この演算を行う装置を用いてRSA暗号におけるべき乗剰余演算を実行するには、次のアルゴリズム３のように修正したアルゴリズムを用いる必要がある。
[アルゴリズム３]
input Y, X=(X[n-1]X[n-2]...X[1]X[0]), N
output Y^X mod N
A = R mod N                                ステップ１
B = Y*R mod N                              ステップ２
For j =n-1 to 0 step 1{                    ステップ３
A = (A^2)*R^(-1) mod N                    ステップ４
If X[j] = 1 then A = A*B*R^(-1) mod N      ステップ５
}
A = A*R^(-1) mod N                            ステップ６
output A                                      ステップ７
アルゴリズム３においてステップ１−５の間、乗数(multiplier)及び被乗数(multiplicand)には、R mod Nが乗ぜられた形をとる。このデータ形式を、以下、モンゴメリ形式と呼ぶことにする。上記モンゴメリ乗算「ABR^(-1) mod N」において、モンゴメリ形式は不変に保たれる。実際、Aのモンゴメリ形式表示をMont(A) = A*R mod Nのように書くことにすると、
Mont(A)*Mont(B)*R^(-1) mod N
= A*R*B*R*R^(-1) mod N
= A*B*R mod N
= Mont(A*B)
となる。従って、例えば、「A*B*R^(-1) mod N」, 「(A^2)*R^(-1) mod N」, 「A*R^(-1) mod N」を計算する演算器があれば、上記アルゴリズム３の手続きをCPUとこれらの演算器を用いて高速に実行することができる。「(A^2)*R^(-1) mod N」, 「A*R^(-1) mod N」は、それぞれ、「A*B*R^(-1) mod N」において、B=A，B=1とおいたものであるので、「A*B*R^(-1) mod N」という演算器を構成すれば、べき乗剰余演算を実現することができることがわかる。
次に、ステップ２で示した「A*B*R^(-1) mod N」を計算するアルゴリズムにおいて、これを高速化する方法について、これまでに行われてきたことを簡単にまとめておく。
説明の為、アルゴリズム２を再掲する。
[アルゴリズム２（再掲）]
W = 0                                ステップ１
For j = 0 to n-1 step +1{            ステップ２
T = W + A[j]*B                      ステップ３
If T is odd then W = ( T + N )/2    ステップ４
Else W = T/2                        ステップ５
}
If W >= N then W = W - N              ステップ６
Output W                              ステップ７
公知の代表的な高速化方法は、以下のように分類することができる。
第一の高速化方法：ステップ３，４，５を含むループの繰り返しの回数を減らすもの
第二の高速化方法：ステップ３，４，５の処理を並列化するもの
第三の高速化方法：ステップ６の処理をより簡単なものに置換えるもの
第一の高速化方法の代表的なものとして、加算処理を複数ビットまとめて実行するものがある。例えば、kビットの処理をまとめて実行する方法を以下のアルゴリズム４に示す。
[アルゴリズム４]
For j = 0 to 2^k - 1 step +1{          ステップ１
TBL(j, B) = j*B                        ステップ２
TBL(j, N) = j*N                        ステップ３
}
W = 0                                  ステップ４
For j = 0 to n/k-1 step +1{            ステップ５
T = W + TBL(A[j,k], B)              ステップ６
U = T mod 2^k                      ステップ７
M[j,k] = -U*N[0,k]^(-1) mod 2^k    ステップ８
W = T + TBL(M[j,k], N)              ステップ９
W = W/2^k                          ステップ１０
}
If W >= N then W = W - N                ステップ１１
Output W                                ステップ１２
ここでは簡単の為、kはnの約数であるものとする。例えば、n=1024のときは、k=2, 4, 8等を選べばよい。A[j, k]は、Aの下からj番目のkビットブロックの値を示している。同様に、M[j,k]は、Mの下からj番目のkビットブロックの値を示し、N[0, k]は、Nの最下位のkビットブロックの値を示している。又、ステップ8の演算は、値は正になるようにとるものとする。該アルゴリズム４において、k = 1とするとNが奇数であるため、MはUに一致し、アルゴリズム２が得られる。この方法に基づいて、剰余乗算を行うものは、特開平7-20778, 武仲正彦他「剰余計算装置，テーブル作成装置および乗算剰余計算装置」において、その実現方法が示されている。
アルゴリズム４は、若干複雑であるので、そのしくみを簡単に説明する。
アルゴリズム４の内容を説明するに先立って、モンゴメリ法の原理について簡単に理解しておく必要がある。モンゴメリ法は、原理的には、MとWを未知数とした不定方程式(Diophantine equation)：
（式１）   A*B + M*N = W*R
を解くことと同値である。まず、Nは奇数であり、R=2^nと互いに素であるから、（式１）は整数の解を持つことに注意する。Nが偶数の場合、（式１）は必ずしも整数解(integer solution)を持たないので、Nが奇数であるという仮定は、本質的なものである。
（式１）の意味を理解する為に、これを図で表現したものが、図３である。
R=2^nであるから、（式１）の右辺の下位nビットは全て0であるので、（式１）を満たすMを求めるということは、ABとMNの下位nビットが0になるようにMを選ぶという操作に他ならない。この上位半分のビット列が、求める、A*B*R^(-1) mod Nの値となる。但し、2nビットの数と2nビットの数の和は2n+1ビットになり、最上位のビットは1になる可能性がある（以下、このビットをOVビットと呼ぶことにする）。これは、アルゴリズム４のステップ１１において解消される。
（式１）の両辺をR=2^nで割った余り(residue)を取ると、
（式２）  (A*B mod 2^n) + (M*N mod 2^n) = 0
を得る。（式２）を変形して、
（式３）        M = -A*B*N^(-1) mod 2^n
を得る。法が2のべき（power）なので、このMはビットブロック毎に順に求めることができる。これがアルゴリズム４の意味である。 アルゴリズム４においては、ループの回数が1/kになっているので、粗く言って、ループ部は約k倍の速度となる。但し、この場合、kを大きくすると、乗算テーブルのサイズが大きくなるという問題がある。サイズが大きくなると、RAM領域が圧迫される。一般に、ICカード等のデバイスでは、RAM領域が小さいので、kを大きくとることはできないことが多い。これが第一の問題である。
第二の高速化方法は、第一の高速化方法と合わせて用いることができる。アルゴリズム４において、Mの値は、Tの下位kビットが決まった時点で決定される（ステップ８）ことに注目すると、決定直後にステップ９の処理が実行可能であることがわかる。従って、nビットの加算器(adder)を二つ搭載し、ステップ６とステップ９を並列に実行するような回路を構成すれば、速度はほぼ2倍になる。但し、この方法を取ると、加算器が二倍必要となる。これは演算器の量が二倍になることを意味するだけでなく、実行時の消費電力(power consumption)もまた二倍になることを意味している。これが第二の問題である。
第三の高速化方法は、第一、第二の高速化方法とは独立である。
よく知られているように、アルゴリズム４のステップ１１のような比較処理は、実際に減算を実行し、負フラグ(negative flag)を調べることによって達成される。これは、1024ビット等の大きな数同士の減算処理であるので、処理時間が無視できない場合がある。一方、計算機では、R = 2^nとの比較は容易である。
そこで、最後の比較減算処理部（ステップ１１）を、次のように変更したアルゴリズム５を用いることにより高速化を実現することができる。この変更による高速化については、既に、特開平10-21057,中田邦彦「データ処理装置及びマイクロコンピュータ」, Kunihiko Nakada: DATA PROCESSOR AND MICROPROCESSOR, United States Patent, US005961578Aに記載がある。
[アルゴリズム５]
For j = 0 to 2^k - 1 step +1{        ステップ１
TBL(j, B) = j*B                      ステップ２
TBL(j, N) = j*N                      ステップ３
}
W = 0                                ステップ４
For j = 0 to n/k-1 step +1{          ステップ５
T = W + TBL(A[j,k], B)            ステップ６
U = T mod 2^k                      ステップ７
M[j,k] = -U*N[0,k]^(-1) mod 2^k    ステップ８
W = T + TBL(M[j,k], N)              ステップ９
W = W/2^k                            ステップ１０
}
If W >= R then W = W - N                ステップ１１
Output W                                ステップ１２
ここで、ステップ１１における比較処理は、図３におけるOVビットが1であるかどうかを判定するだけで実現できる。これは減算処理よりもずっと軽い処理であり、高速である。但し、アルゴリズム５で得られる値は、A*B*R^(-1) mod N 自身ではなくA*B*R^(-1) mod N + Nである場合がある。しかし、ビット長はnビットのままであるので、べき乗剰余演算では、最終的に値の修正を行うだけでよい。
本発明は、この高速化方法とは無関係であり、第一、第二の高速化方式と関係するものである。
上記の問題１，２は、楕円曲線暗号(elliptic curve cryptosystem)で現れる標数２のガロア体(Galois field of characteristic 2)においても生ずるものである。
ガロア体の概念を簡単に説明しておく。ガロア体そのものは、純粋に数学の概念であるが、適当な同型写像(homomorphism)を構成することによって、具体的な演算に翻訳することができる。ガロア体を計算機上に実現する方法のうち、最も簡単なものは、多項式の剰余演算(modular arithmetic operation)を用いるものである。
まず、係数(coefficient)が、0か1であるような多項式全体を考え、この集合をPOLYとする。POLYの元(element)で、勝手にn次の既約多項式(irreducible polynomial of degree n)F(X)を選び、POLYの二つの元、A(X), B(X)に対し、その和（差と同義になる）を、通常の多項式の和において、係数の和は排他的論理和(exclusive OR)の意味で行うものと定義し、積をA(X)*B(X) mod F(X)によって定義する。代数学においてよく知られているように、F(X)の倍元(multiple)でないPOLYの元は、前記の積演算に対する逆(inverse)を持つ。POLYにおいて、A(X)とB(X)が同値(equivalent)であるとは、これらの差A(X)-B(X)がF(X)の倍元になっていることと定義し、POLYをこの同値関係(equivalent relation)によって同値類(equivalent class)に分けたものをGF(2^n)と書く。これが、標数２のガロア体である。GF(2^n)の代数構造(algebraic structure)は、n次の既約多項式F(X)の選び方に依らないことはよく知られている。実装上は、3項(3 terms)及び5項からなる多項式を選ぶことが多い。この多項式F(X)を、reduction polynomialと呼ぶことがある。
ガロア体の積演算は、通常の積演算に現れる加算処理を排他的論理和の意味で行うことによって実現される。前記加算器において、キャリーの伝播を行わなければ、ビット毎の排他的論理和(bitwise exclusive OR)を行うことと同値になり、ガロア体の積演算が実現される。
モンゴメリ法においても、本質的に同様の操作を行っている。通常のモンゴメリ法において必要だった「モジュラスNは奇数」であるという条件は、F(X)の定数項が1であるという条件に置換えられ、これは、F(X)が既約であるということから、自動的に従うものであり、モンゴメリ法の適用に問題はない。通常のモンゴメリ法におけるR=2^nは、R(X) = X^nに置換える。また、モンゴメリ法において重要であったMの決定の処理もまた、キャリー伝播を行わないことによって実現することができる。 従って、ガロア体におけるモンゴメリ法の処理は、以下のように実現することができる。
[アルゴリズム６]
W(X) = 0                                        ステップ１
For j = 0 to n-1 step +1{                        ステップ２
T(X) = W(X) + A[j]*B(X)                        ステップ３
If T(X)mod X is 1 then W(X) = (T(X) + F(X))/X  ステップ４
Else W = T/X                                    ステップ５
}
ここで、A[j]は、A(X)のｊ次の項の係数である。また、和は係数毎の排他的論理和の意味で用いている。アルゴリズム６において、通常のモンゴメリ法において存在した減算処理が必要ないのは、ガロア体においては、次数を除いて大小関係が存在せず、A(X), B(X)の次数がn次未満であれば(GF(2^n)では、これは常に成り立つ)、上記アルゴリズム６において構成されるW(X)は、n次未満となるので、そのままF(X)に対する剰余となるためである。従って、通常の剰余乗算においてモンゴメリ法を行う際に生ずる第三の問題は、ガロア体においては存在しない。
このアルゴリズム６で、正しい答が得られることを数値例によって確認しておく。簡単の為、GF(2^4)において、F(X) = X^4 + X + 1とする。A(X) = X^3 + X^2 + 1, B(X) = X^3 + X + 1に対し、GF(2^4)におけるAとBの積、すなわち、A(X)*B(X) mod F(X)を計算する。
この場合、A[0] = 1, A[1] = 0, A[2] = 1, A[3] = 1であることに注意して、アルゴリズム６の処理を順に実行する。
（1） j = 0 のとき
W(X) = 0, A[0] = 1であるから、ステップ3では、
W(X) = 0 + 1*(X^3 + X + 1)
= X^3 + X + 1
となり、この定数項が1であるから、ステップ４を実行し、
W (X) = (X^3 + X + 1 + X^4 + X + 1)/X
= (X^4 + X^3 + 2*X + 2)/X
= (X^4 + X^3)/X
= X^3 + X^2
となる。ここで、2倍を0としていることに注意する。
（2） j = 1のとき
W(X) = X^3 + X^2, A[1] = 0であるから、ステップ３では、
W(X) = X^3 + X^2 + 0*(X^3 + X + 1)
= X^3 + X^2
となる。この定数項は0であるので、ステップ５を実行し、
W(X) = (X^3 + X^2)/X
= X^2 + X
となる。
（3） j = 2のとき
W(X) = X^2 + X, A[2] = 1であるから、ステップ３では、
W(X) = X^2 + X + 1*(X^3 + X + 1)
= X^3 + X^2 + 2*X + 1
= X^3 + X^2 + 1
となる。この定数項は、1であるので、ステップ４を実行し、
W(X) = (X^3 + X^2 + 1 + X^4 + X + 1)/X
= (X^4 + X^3 + X^2 + X + 2)/X
= (X^4 + X^3 + X^2 + X)/X
= X^3 + X^2 + X + 1
となる。
（4） j = 3のとき
W(X) = X^3 + X^2 + X + 1, A[3] = 1であるから、ステップ３では、
W(X) = X^3 + X^2 + X + 1 + 1*(X^3 + X + 1)
= 2*X^3 + X^2 + 2*X + 2
= X^2
となる。定数項は、0であるので、ステップ５を実行し、
W(X) = X^2/X
= X
となる。上記の計算で得られたW(X)は、A(X)*B(X)*R(X)^(-1) mod F(X)になっているはずであるので、R(X)^(-1) mof F(X)を除去する為にR(X)=X^4を乗ずると、
X*X^4 mod (X^4 + X + 1)
= X*(X+1) = X^2 + X
となる。
この結果が正しいかどうかを確認する為に、A(X)*B(X) mod F(X)を通常の方法で計算する。
A(X)*B(X)
= (X^3 + X^2 + 1)*(X^3 + X + 1)
= X^6 + X^5 + X^4 + 3*X^3 + X^2 + X + 1
= X^6 + X^5 + X^4 + X^3 + X^2 + X + 1
であるから、
A(X)*B(X) mod F(X)
= X^6 + X^5 + X^4 + X^3 + X^2 + X + 1 mod (X^4 + X + 1)
= (X^2 + X + 1)*(X^4 + X + 1) + X^2 + X mod (X^4 + X + 1)
= X^2 + X
となり、確かに、アルゴリズム６で計算した値にR(X)を乗じたものと同じ多項式が得られる。
上記のガロア体における計算においては、２を0に置換える操作をしているが、これは、和の計算を排他的論理和で実行していることによる。
このアルゴリズムをkビット毎に処理するように修正することは、通常の剰余乗算の場合と同様にして実現することができる。GF(2^n)におけるモンゴメリ法のアルゴリズムを示しておく。
[アルゴリズム７]
For j = 0 to 2^k - 1 step +1{                ステップ１
TBL(H[j](X), B(X)) = H[j](X)*B(X)          ステップ２
TBL(H[j](X), F(X)) = H[j](X)*F(X)          ステップ３
}
W(X) = 0                                      ステップ４
For j = 0 to n/k-1 step +1{                    ステップ５
T(X) = W(X) + TBL(A[j,k](X), B(X))          ステップ６
U(X) = T(X) mod X^k                          ステップ７
M[j,k](X) = U(X)*F[0,k](X)^(-1) mod X^k      ステップ８
W(X) = T(X) + TBL(M[j,k](X), F(X))            ステップ９
W(X) = W(X)/X^k                              ステップ１０
}
ここで、アルゴリズム７における多項式H[j](X)は、ｊの二進数展開が、j = (j[k-1]j[k-2]...j[0])であるときに、H[j](X) = j[k-1]*X^(k-1) + j[k-2]*X^(k-2) + ...+ j[0]を対応させて得られるものである。又、A[j,k](X)は、多項式A(X)をビット列表現した場合のｊ番目のkビットブロックに対応する多項式であり、F[0,k](X), M[j,k](X)も、これに準ずる。さらに、ステップ６、９の和は、各項毎の排他的論理和を意味する。数値例は省略する。
【０００３】
【発明が解決しようとしている課題】
本発明は、大きな数に対する剰余乗算（modular multiplication）及びべき乗剰余演算(modular exponentiation)を実行する為のマイクロコンピュータ並びにその実行方法に関し、モンゴメリ(Montgomery)の方法(P. L. Montgomery, ”Modular Multiplication without Trial Division”, Math. Comp., vol. 44, 1985, pp.519-521)に基づき、これを該マイクロコンピュータ上に実装する際に上記【従来の技術】において説明した二つの課題、すなわち、
（第一の課題）同時に複数ビットを処理する場合に必要な乗算テーブルが肥大化してしまうこと
（第二の課題）A*B, M*Nの処理を同時に実行して二倍の速度を実現する場合、演算器の量及び消費電力が二倍になってしまうこと
を解決し、又、ガロア体GF(2^n)の積演算に対して同様の問題を解決しようとするものである。
本発明の前記ならびにその他の目的と新規な特徴については、本明細書の記述及び添付図面から明らかになるであろう。
【０００４】
【課題を解決するための手段】
本願において開示される発明の概要を説明すれば、下記の通りである。
下記モンゴメリ法のアルゴリズム４（再掲）を考える。
[アルゴリズム４（再掲）]
For j = 0 to 2^k - 1 step +1{          ステップ１
TBL(j, B) = j*B                        ステップ２
TBL(j, N) = j*N                        ステップ３
}
W = 0                                  ステップ４
For j = 0 to n/k-1 step +1{            ステップ５
T = W + TBL(A[j,k], B)              ステップ６
U = T mod 2^k                        ステップ７
M[j,k] = -U*N[0,k]^(-1) mod 2^k      ステップ８
W = T + TBL(M[j,k], N)                ステップ９
W = W/2^k                              ステップ１０
}
If W >= N then W = W - N                  ステップ１１
Output W                                  ステップ１２
先に〔従来の技術〕において述べたように、アルゴリズム４における処理ステップ６及び９は、大きな数の加算処理であり、ハードウエアの大部分は、この加算器であると考えてよい。
ステップ６とステップ９の処理は、A*B の処理と M*N の処理のkビットブロックに対する処理であるので、これを合成し、A*B + M*Nのkビットブロックに対する加算処理を行ってもよいことがわかる。各ループ一回に対応する加算処理は、「kビットの数×B」及び「kビットの数×N」という形をしているので、必要となる新たなテーブルは、次のような形になることがわかる。
TBL( j, t ) = ｊ*B + ｔ*N(j, t = 0, 1, 2, ..., 2^k - 1)
このテーブルの選択には、二つのパラメータj, tが必要である。これらのパラメータは、Wに加えたときに、その和の下位kビットが0になるように選べばよい。
すなわち、第jステップの処理に際し、テーブルとして、
TBL( A[j,k], M[j,k] ) = A[j,k],*B + M[j,k]*N
を選べばよい。M[j,k]は、A[j,k]にも依存して決まる値である。下記のアルゴリズム８は、テーブルをあらかじめ並べ替えておき、Mの計算を行わずに済むようにしたものである。
[アルゴリズム８]
For j = 0 to 2^k-1 step 1{            ステップ１
For s = 0 to 2^k-1 step 1{          ステップ２
U = (s + j*B[0, k]) mod 2^k      ステップ３
M =−U*N[0,k]^(-1) mod 2^k        ステップ４
TBL[ j , s ] = j*B + M*N          ステップ５
}
}
W = 0                                  ステップ６
For i = 0 to n/k-1 step 1｛            ステップ７
W = W + TBL(A[i, k], W[0, k])        ステップ８
W = W/2^k                            ステップ９
}
If W >= N then W = W - N                ステップ１０
Output W                                ステップ１１
上記アルゴリズム８は、本発明の本質を表している。アルゴリズム４において二個所に現れた加算処理、すなわち、アルゴリズム４におけるステップ６及び９の処理は、アルゴリズム８においては、一つの加算処理になっている。もし、アルゴリズム４におけるステップ６及び９の処理を順に計算していた場合、アルゴリズム７を採用することにより、計算速度が約2倍となる。又、多くコプロセッサが行っているようにアルゴリズム４におけるステップ６及び９の処理を並列に実行している場合は、加算器が二個必要だが、アルゴリズム７を採用した場合は、加算器の数を半分にすることができ、さらに、このことの直接の結果として、消費電力が減少する。
このアルゴリズム７において、キャリーの伝播を行わなければ、GF(2^n)の積演算が実現することは、〔従来の技術〕にて説明した通りである。従って、GF(2^n)の積演算回路に対しても、上記の通常の剰余乗算において生ずる本発明の効果が現れる。
【０００５】
【発明の実施の形態】
以下に前記アルゴリズム８を再掲する。以下、このアルゴリズムに従って、回路を構成する方法を述べる。
[アルゴリズム８（再掲）]
For j = 0 to 2^k-1 step 1{            ステップ１
For s = 0 to 2^k-1 step 1{          ステップ２
U = (s + j*B[0, k]) mod 2^k      ステップ３
M =−U*N[0,k]^(-1) mod 2^k        ステップ４
TBL[ j , s ] = j*B + M*N          ステップ５
}
}
W = 0                                  ステップ６
For i = 0 to n/k-1 step 1｛            ステップ７
W = W + TBL(A[i, k], W[0, k])        ステップ８
W = W/2^k                            ステップ９
}
If W >= N then W = W - N                ステップ１０
Output W                                ステップ１１
アルゴリズム７の処理は、大きく分けて三つの部分から構成される。すなわち、ステップ１からステップ５までの「テーブル生成部」、ステップ６からステップ９までの「加算処理部」、及び、ステップ10，11の「値修正部」の三つである。
まず、一般性の高い「加算処理部」を説明し、次に「値修正部」、最後に「テーブル生成部」を説明し、これらを統合した回路構成について説明する。
加算器の構成法は種々のものが知られているが、ここでは代表的なものについて説明する。
加算器は、1ビット毎の加算器を並べて構成される。今、二つのmビットの数S及びTの加算を行う回路を構成する。以下の説明において、それぞれの二進数表示S = (S[m-1]S[m-2]...S[1]S[0]), T = (T[m-1]T[m-2]...T[1]T[0])及びその和Z = (Z[m]Z[m-1]...Z[1]Z[0])を用いる。加算処理をビット単位に分解して考えたとき、ｊ番目のビットの加算に必要な値は、S[j], T[j]及び、直前の計算で生じたキャリーC[j-1]である。但し、C[-1] = 0及び、Z[m] = C[m-1]と定めておく。
図４は、1ビットの加算を行う全加算器(full adder)の例である。j番目の1ビット全加算器は、S[j], T[j]及び、前段のキャリー信号C[j-1]を入力として、Zの第ｊビットの値Z[j]及びキャリー信号C[j]を出力する回路として捉えることができる。
図４の回路は、論理式：
（式４） Z[j] = (S[j] AND T[j] AND C[j-1]) OR (S[j] AND NOT(T[j]) AND NOT(C[j-1])) OR (NOT(S[j]) AND T[j] AND NOT(C[j-1])) OR (NOT(S[j]) AND NOT(T[j]) AND C[j-1]),
（式５） C[j] = NOT((S[j] AND NOT(T[j]) AND NOT(C[j-1])) OR (NOT(S[j]) AND T[j] AND NOT(C[j-1])) OR (NOT(S[j]) AND NOT(T[j]) AND C[j-1]) OR (NOT(S[j]) AND NOT(T[j]) AND NOT(C[j-1]))
を回路化したものである。図４の401, 402, 403, 404, 405は、AND回路であり、406, 407はOR回路、409, 410, 411, 412, 413, 414, 415, 416, 417は、インバータ（NOT回路）である。これらが、それぞれ、（式４）、（式５）のAND, OR, NOTに対応する。AND，OR，NOTはぞれぞれ、いくつかのトランジスタから構成される論理ゲート(logic gate)である。ANDは、入力の全てが1のときのみ1を出力し、それ以外では0を出力する論理ゲートであり、ORは、入力のどれか1つでも1であれば出力が1になり、全て0のときのみ出力が0となる論理ゲートである。NOT（インバータ）は、入力0に対しては1を出力し、入力1に対しては、0を出力する論理ゲートである。
1ビットの全加算器を並べれば、複数ビットの全加算器を作ることができる。図５に、4ビットの全加算器を示す。501，502，503，504は、図４に示した1ビットの全加算器であって、（式４）、（式５）に従って計算がなされる。最下位のビットでは、キャリーを0にセットしておく。又、最後のキャリーはZ[4]となる。ここでは、4ビットの場合を示したが、1ビットの全加算器を増やすことによって、何ビットの加算でもできることは明らかである。
ここに示した全加算器の構成方法は、「桁上げ伝播加算器」(ripple carry adder)と呼ばれる最も素朴なものであり、桁上げ伝播時間(carry propagation time)の比率が大きく、最も加算時間のかかる回路である。より高速に加算を行う為のハードウエアアルゴリズムは、数多く存在するが、加算器の構成法は、本発明の本質とは無関係であるので、これ以上の説明は省略する。
次に、値修正部の処理について説明する。値修正部では、減算処理(subtraction)が用いられる。減算器(subtracter)は、加算器と似た構造をしており、桁上げ伝播加算器を利用して構成することができる。このため、通常の計算機は、加算回路は持っているが、減算回路は持っていない。
図6は、全加算器を利用した4ビットの減算回路（Z = S T）の構成例である。601，602，603，604は1ビットの全加算器であるが、入力に際し、最初のキャリー（ボロー）が1になっている点と、Tをインバータ605，606，607，608によって反転させているという点が異なる。減算では、最後のキャリー（ボロー）が1になるときは、結果が負になったことを意味している。この現象はアンダーフロー(under flow)と呼ばれる。
上記の減算器の概念を用いて、値修正部の構成例を説明する。図７は、値修正回路のブロック図(block diagram)である。n+1ビットのレジスタ702には、値Wが、nビットのレジスタ703には、モジュラスNの値が含まれており、両者が、n+1ビットの減算器704によって、W-Nが計算される。この値W-Nと、この演算の結果として発生するボローを選択信号(selection signal)、及び、Wの値がセレクタ705に入力され、選択信号が0であれば、セレクタ705は、W-Nを選択して出力し、選択信号が1であれば、Wを選択して、これを出力する。
ここでは、W，Nは、専用のレジスタとして説明したが、これをCPU処理で利用するRAM上に配置することもできることは言うまでもない。
次に、テーブル生成部の回路について説明する。簡単の為、k=2の場合のみ示す。
k=2の場合のテーブル生成部で生成される値を列挙すると、図8の表のようになる。この構成例では、入力値A，Bに依存しないモジュラスの値Nの倍数、N, 2*N， 3*Nについては、あらかじめ計算して、これをレジスタ909，910，911に保持しておき、これを用いる。また、入力値Bは、入力値そのものであるから、計算する必要はない。Bは、レジスタ906に保持されている。
0及び、上記の４つの値B, N, 2*N, 3*N以外の11個の値は、毎回計算しなければならない。ここでは、加算器のみ利用して、前記11個の値を計算する構成を示した。レジスタの大きさは、最大で（k+1=）3ビット大きく取らなければならない。各レジスタは、データバス921に接続され、前記データバス921は、加算処理部にデータを供給する信号線として利用される。904は、n+2ビットの数の加算を行う加算器であり、n+3ビットの和の値をセレクタ903に送る。
制御装置905は、クロック信号から決定された計算開始信号を受けて内部のカウンタを二進数表示で、0001に初期化し、セレクタ901を経由して、Bの値を加算器904の入力（両方）として加算器904を動作させる。加算器904で計算が始まる直前に、前記加算器904から制御装置905に制御信号を送る。制御装置905は、前記制御信号を受けて、その内部のカウンタをインクリメントし、二進数表示で、0010という値を得、この下位2ビット00と上位2ビットをそれぞれ、j*B + t*Nにおけるj、ｔとして、セレクタ903が、加算器904の答を書き込むレジスタ907の位置を決定し、前記加算結果を書き込む。次に、再び計算開始信号が制御装置905に送信され、制御装置905は、セレクタ901に制御信号を送り、Bと2*Bを読み出して、加算器904に入力し、先と同じ動作をしてレジスタ908に値3*Bを書き込む。ここまでの動作で、テーブルを合成する為の値、B, 2*B, 3*B, N, 2*N, 3*Nが全て揃ったことになる。以下同様に制御装置のカウンタの値から、読み出すレジスタと書き込むレジスタを決定し、同様の動作を繰り返す。但し、カウンタの下位2ビットが00のときは、加算動作は、スキップするものとする。こうして、全ての値が揃った後は、レジスタ906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920は、読み出し専用のレジスタとして利用される。
次に、これらを組み合せて、A*B*R^(-1) mod Nを計算し、結果をAレジスタに書き込む回路のブロック図を図１０に示す。但し、値調整部については、煩雑さを避ける為省略した。一般に、値調整部で必要な減算処理は、加算器1015の入力値を変更することによって実現する。
図１０は、本発明における重要な構成を全て含んでいる。以下、変数名は、アルゴリズム８で用いたものと同じものを利用する。
図10において、まず、Aレジスタ1003に格納されたAの値を下位から順に読み出す。Aレジスタの構成は、図１１に示されている。この際、制御装置1007は、読み出す2ビットブロックの番号iを9ビットレジスタ1006から受け取って、該当する2ビットブロックの値を読み出し、これをレジスタ1008に送信する。レジスタ1009には、Wの下位2ビットが格納されている。1008，1009の値が、値選択及び信号制御装置1011に送信され、1011は、該当するデータをデータバス1001を介して1002の値テーブルから読み出し、値を1027ビットと1026ビットの値の加算を行う加算器1015に送る。但し、前記加算器1015には、専用のレジスタ1013，1014が接続されており、テーブルから読み出された値は、一時的に1027ビットのレジスタ1014に保持される。1013は、1026ビットのレジスタであり、アルゴリズム７に現れるWが格納される。動作開始時には0にクリアされている。値テーブル1002に含まれるj*B + t*Nという形をしたデータとWの和が加算器1015で加算される。この加算結果は、下位2ビットが二進数表示で00になっているので、これを2ビット右シフタ1016で切り落とし、制御装置1017に入力される。一方、加算器1015は、計算開始と同時に、値1を加算器1018に送り、加算器は、9ビットレジスタ1019の値と、計算開始信号「１」を合計し、その結果を9ビットレジスタ1019に送る。1019には、最初0が格納されている。この和は、制御装置1017に送られ、制御装置1017は、前記の和が、512に達していなければ、1016の出力結果をそのままレジスタ1013に書き込み、1013の値は、1011にてWの下位2ビットのみが取り出されて、レジスタ1009に書き込まれる。又、この際に、1017から、1011を経由して1007に信号が送られ、加算器1005によりiの値がインクリメントされ、Aレジスタの次の2ビットブロックが読み出され、先に延べたのと同じ過程を経てテーブルの値との加算が行われる。1019の値が、512に達していれば、選択的透過回路1012に信号を送り、1013にあるWの値をAレジスタに送る。この時点でのAレジスタの値は、A*B*R^(-1) mod N又は、A*B*R^(-1) mod N＋Nである。後者では、AからNを減算する処理が必要になる。減算処理部は省略する。これは、本発明請求項１，7の実施例の一つである。
上記実施例は、本発明の要旨を逸脱しない範囲において種々変更可能である。例えば、以下のような変更が考えられる。
（１） 加算器1015は、ここでは、1027ビットを同時に加算する構成になっているが、これを複数のブロックに分割して、これらをブロック毎に順に加算していくことにより実現することもできる。この場合、ハード量は減るが、速度は落ちる。
（２） 2ビット左シフタ1016を用いないで、直接1013のレジスタに下位2ビットより上位のビットのみ接続することもできる。
（３） 値A, B, Nのビット数を変更する。例えば、2048ビットや、512ビット、768ビット等に変更することもできる。
（４） kの値を2でない値、例えば、1，3，4等の値に変更することもできる。但し、nがkの倍数に成っていない場合は、修正する為の論理回路が必要である。
（５） テーブルにおいて、0をなくし、代わりに、Wに加える値が0のときは、Wの値を加算器に入力せず、直接シフタに入力するような論理回路を追加する。
上記の変更は、本質的に本発明の趣旨である「加算用テーブルの合成」と無関係に行うことができる。
次に、上記のような変更とは異なり、若干の注意を要するものについて説明する。
再び、アルゴリズム８を示す。
[アルゴリズム８（再掲）]
For j = 0 to 2^k-1 step 1{            ステップ１
For s = 0 to 2^k-1 step 1{          ステップ２
U = (s + j*B[0, k]) mod 2^k      ステップ３
M =−U*N[0,k]^(-1) mod 2^k        ステップ４
TBL[ j , s ] = j*B + M*N          ステップ５
}
}
W = 0                                  ステップ６
For i = 0 to n/k-1 step 1｛            ステップ７
W = W + TBL(A[i, k], W[0, k])        ステップ８
W = W/2^k                            ステップ９
}
If W >= N then W = W - N                ステップ１０
Output W                                ステップ１１
ここで、テーブルTBL[j, s]の値は、最大で、(2^k-1)*B + (2^k-1)*Nとなる。この値は、最大で、n+k+1ビットとなるので、kの値に応じて、TBL[j, s]のビット長を増やさなければならない。データ数は、4^k個あるので、kに伴うデータの増加は、k*4^kビットに達する。一般にkは大きな値ではないので、本発明を実現する上で大きな問題になることはないが、望ましい現象ではない。この問題を避ける方法が存在する。
ステップ８及び９に着目する。ステップ８における、TBL(A[i, k], W[0, k])の値は、ステップ８の和の下位kビットが、必ず0になるようにが選ばれている。そして、ステップ９にて、そのkビットを右シフトによって切り落としている。これは、下位kビットの計算が、全く不要であることを示している。従って、テーブルの値そのものも、下位kビットを切り落としたもの（kビット右シフトしたもの）を用意するだけでよいことがわかる。
具体的には、値「j*B + t*N」を用いる代わりに、これをkビットシフトした値「(j*B + t*N)>>k」を新しいテーブルと定義して、アルゴリズム８と同様の計算を行う。但し、Wの値は、加算処理の前にkビット右シフトしておく。すなわち、以下のアルゴリズムに従って計算を行う。
[アルゴリズム９]
For j = 0 to 2^k-1 step 1{                  ステップ１
For s = 0 to 2^k-1 step 1{                ステップ２
U = (s + j*B[0, k]) mod 2^k            ステップ３
M =−U*N[0,k]^(-1) mod 2^k              ステップ４
NTBL[ j , s ] = (j*B + M*N)>>k          ステップ５
}
}
W = 0                                        ステップ６
For i = 0 to n/k-1 step 1｛                  ステップ７
W = W/2^k                                ステップ８
W = W + NTBL(A[i, k], W[0, k])            ステップ９
}
If W >= N then W = W - N                    ステップ１０
Output W                                    ステップ１１
ここで、ステップ８は、実装上は、シフタを利用する必要はない。右シフトは、常にkビットだけ行われるので、これを直接kビットシフトに対応するように配線する。下位kビットの和の計算は行わない。但し、Wの下位kビットのうち、少なくとも１つが1になる場合、すなわち、下位kビットのそれぞれの論理和(logical OR)が1である場合、これをキャリーC[-1]として加算器に入力する。実際、前記論理和が0の場合は、当該kビット全てが0であることを示しており、これに対応するMの下位kビットも0でなければならないが、前記論理和が1である場合、Mとの和の下位kビットが全て0になるようにMを選ぶと、必ずキャリーが発生するからである。
これらを考慮した加算処理の回路の実施例を図15に示す。本実施例は、k=2の場合である。図15に示す回路は、NTBLの値を格納するNTBLレジスタ1504と、Wの値を格納するWレジスタ1503が加算器1502に接続されているものである。Wレジスタの下位2ビットは、加算器1502には接続されておらず、代わりに、値選択及び信号制御装置に接続されており、この2ビットは、NTBLの値を選択するのに用いられる。さらに、前記2ビットはそれぞれ、論理和を計算するORゲート1501に接続されている。ORゲート1501の計算値は、キャリー信号C[-1]として加算器1502に入力される。前記キャリー信号C[-1]は、加算を行う際のキャリーの初期値として利用される。これは本発明4,7の実施例の一つである。
次に、ガロア体GF(2^n)に対し、以下のアルゴリズム７（再掲）に従って動作する本発明の実施例を説明する。
[アルゴリズム７（再掲）]
For j = 0 to 2^k - 1 step +1{                ステップ１
TBL(H[j](X), B(X)) = H[j](X)*B(X)        ステップ２
TBL(H[j](X), F(X)) = H[j](X)*F(X)        ステップ３
}
W(X) = 0                                    ステップ４
For j = 0 to n/k-1 step +1{                ステップ５
T(X) = W(X) + TBL(A[j,k](X), B(X))      ステップ６
U(X) = T(X) mod X^k                    ステップ７
M[j,k](X) = U(X)*F[0,k](X)^(-1) mod X^k  ステップ８
W(X) = W(X) + TBL(M[j,k](X), F(X))        ステップ９
W(X) = W(X)/X^k                          ステップ１０
}
ガロア体GF(2^n)における演算については、【従来の技術】において説明した通りである。従って、先に説明した本発明の第一の実施形態における回路における加算処理を全てビット毎の排他的論理和に変更することによって実現される。
積演算の処理は、シフト処理と加算処理で構成されているので、加算処理の部分をビット毎の排他的論理和の処理に置換えるだけでよい。勿論、テーブルの構成においても、和を排他的論理和に置換えることは言うまでもない。但し、通常のモンゴメリ法における法(modulus)Nがnビットだったのに対し、n次の多項式を使う為、n+1ビットの表現を必要とするという点が異なる。又、ガロア体GF(2^n)の場合は、最後の値修正処理は不要である。その他の構成は、通常のモンゴメリ法の回路と全く同一の構成でよい。これを図１２に示す。但し、ここでは、k=2とし, reduction polynomial F(X)の次数(degree)は、257であるものとする。 以下、変数名は、アルゴリズム７で用いたものと同じものを利用する。
図12において、まず、Aレジスタ1203に格納されたAの値を下位から順に読み出す。Aレジスタの構成は、図１１に示されているものと同一である。この際、制御装置1207は、読み出す2ビットブロックの番号iを7ビットレジスタ1206から受け取って、該当する2ビットブロックの値を読み出し、これをレジスタ1208に送信する。レジスタ1209には、Wの下位2ビットが格納されている。1208，1209の値が、値選択及び信号制御装置1211に送信され、1211は、該当するデータをデータバス1201を介して1202の値テーブル（テーブル生成については後に説明する）から読み出し、値を258ビットと256ビットの値の排他的論理和を行う排他的論理和計算器1215に送る。但し、前記排他的論理和計算器1215には、専用のレジスタ1213，1214が接続されており、テーブルから読み出された値は、一時的に258ビットのレジスタ1214に保持される。1213は、258ビットのレジスタであり、アルゴリズム７に現れるW(X)が格納される。動作開始時には0にクリアされている。値テーブル1202に含まれる「（一次以下の多項式）*B(X) + （一次以下の多項式）*F(X)という形をしたデータ（図１３参照）とW(X)の排他的論理和が排他的論理和計算器1215で排他的論理和の計算がなされる。この結果は、下位2ビットが二進数表示で00になっているので、これを2ビット右シフタ1216で切り落とし、制御装置1217に入力される。一方、排他的論理和計算器1215は、計算開始と同時に、値1を加算器1218に送り、加算器は、7ビットレジスタ1219の値と、計算開始信号「１」を合計し、その結果を7ビットレジスタ1219に送る。1219には、最初0が格納されている。この和は、制御装置1217に送られ、制御装置1217は、前記の和が、128に達していなければ、1216の出力結果をそのままレジスタ1213に書き込み、1213の値は、1211にてW(X)の下位2ビットのみが取り出されて、レジスタ1209に書き込まれる。又、この際に、1217から、1211を経由して1207に信号が送られ、排他的論理和計算器1205によりiの値がインクリメントされ、Aレジスタの次の2ビットブロックが読み出され、先に延べたのと同じ過程を経てテーブルの値との排他的論理和の計算が行われる。1219の値が、128に達していれば、選択的透過回路1212に信号を送り、1213にあるW(X)の値をAレジスタに送る。この時点でのAレジスタの値は、A(X)*B(X)*R(X)^(-1) mod F(X)である。
テーブル生成回路も、加算処理を排他的論理和処理に置換えることにより、実現される。これを図１４に示す。
この構成例では、入力値A(X)，B(X)に依存しないreduction polynomial F(X)の倍元、F(X), XF(X),(X+1)F(X)については、あらかじめ計算して、これをレジスタ1409，1410，1411に保持しておき、これを用いる。また、入力値B(X)は、入力値そのものであるから、計算する必要はない。B(X)は、レジスタ1406に保持されている。
0及び、上記の４つの値B(X), F(X), XF(X)，(X+1)F(X)以外の11個の値は、毎回計算しなければならない。ここでは、排他的論理和計算器のみを利用して、前記11個の値を計算する構成を示した。レジスタの大きさは、最大で（k=）2ビット大きく取らなければならない。各レジスタは、データバス1421に接続され、前記データバス1421は、排他的論理和処理部にデータを供給する信号線として利用される。1404は、258ビットの数の加算を行う加算器であり、258ビットの和の値（GF(2^n)では桁上がりは生じないので、ビット数は増えないことに注意）をセレクタ1403に送る。
制御装置1405は、クロック信号から決定された計算開始信号を受けて内部のカウンタを二進数表示で、0001に初期化し、セレクタ1401を経由して、B(X)の値を加算器1404の入力（両方）として排他的論理和計算器1404を動作させる。排他的論理和計算器1404で計算が始まる直前に、前記排他的論理和計算器1404から制御装置1405に制御信号を送る。制御装置1405は、前記制御信号を受けて、その内部のカウンタをインクリメントし、二進数表示で、0010という値を得、この下位2ビット00と上位2ビットをそれぞれ、j(X)*B(X) + t(X)*F(X)におけるj(X)、ｔ(X)として、セレクタ1403が、排他的論理和計算器1404の答を書き込むレジスタ1407の位置を決定し、前記排他的論理和の結果を書き込む。次に、再び計算開始信号が制御装置1405に送信され、制御装置1405は、セレクタ1401に制御信号を送り、B(X)とXB(X)を読み出して、排他的論理和計算器1404に入力し、先と同じ動作をしてレジスタ1408に値(X+1)B(X)を書き込む。ここまでの動作で、テーブルを合成する為の値、B(X), XB(X), (X+1)B(X), F(X), XF(X), (X+1)F(X)が全て揃ったことになる。以下同様に制御装置のカウンタの値から、読み出すレジスタと書き込むレジスタを決定し、同様の動作を繰り返す。但し、カウンタの下位2ビットが00のときは、加算動作は、スキップするものとする。こうして、全ての値が揃った後は、レジスタ1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, 1419, 1420は、読み出し専用のレジスタとして利用される。これは、本発明請求項2，7の実施例の一つである。
上記実施例は、本発明の要旨を逸脱しない範囲において種々変更可能である。例えば、以下のような変更が考えられる。
（１） 排他的論理和計算器1215は、ここでは、258ビットを同時に加算する構成になっているが、これを複数のブロックに分割して、これらをブロック毎に順に加算していくことにより実現することもできる。この場合、ハード量は減るが、速度は落ちる。
（２） 2ビット左シフタ1216を用いないで、直接1213のレジスタに下位2ビットより上位のビットのみ接続することもできる。
（３） 値A(X), B(X), F(X)のビット数を変更する。
（４） kの値を2でない値、例えば、1，3，4等の値に変更することもできる。但し、nがkの倍数に成っていない場合は、修正する為の論理回路が必要である。
（５） テーブルにおいて、0をなくし、代わりに、W(X)に加える値が0のときは、W(X)の値を排他的論理和計算器に入力せず、直接シフタに入力するような論理回路を追加する。
上記の変更は、本質的に本発明の趣旨である「値テーブルの合成」と無関係に行うことができる。
ガロア体においても、通常のモンゴメリ法の処理の場合と同じようにして、テーブルサイズをkビット減らすことができる。キャリー及び、最後の値調整の為の減算処理を除いて考え方はアルゴリズム９と全く同一である。以下に、そのアルゴリズムを示す。
[アルゴリズム１０]
For j = 0 to 2^k - 1 step +1{                ステップ１
NTBL(H[j](X), B(X)) = H[j](X)*B(X)>>k      ステップ２
NTBL(H[j](X), F(X)) = H[j](X)*F(X)>>k      ステップ３
}
W(X) = 0                                      ステップ４
For j = 0 to n/k-1 step +1{                    ステップ５
T(X) = W(X) + TBL(A[j,k](X), B(X))          ステップ６
U(X) = T(X) mod X^k                        ステップ７
M[j,k](X) = U(X)*F[0,k](X)^(-1) mod X^k    ステップ８
W(X) = W(X) + NTBL(M[j,k](X), F(X))        ステップ９
W(X) = W(X)/X^k                            ステップ１０
}
ここで、上記M[j,k](X)の決定については、処理中のW(X)の下位のkビットをそのままとればよく、キャリーは発生しない点が、通常のモンゴメリ法と異なる（但し、数学的表現は、ほぼ同じ）。
図１５に対応するガロア体の計算回路を図１６に示す。図１５における回路との違いは、加算器が排他的論理和計算器1601になっている点と、キャリー信号を生成するOR回路がないという点である。これは、本発明請求項４，７の実施例の一つである。
ここまでは、剰余乗算に対する本発明の実施例と、ガロア体G(2^n)に対する本発明の実施例を別々に示したが、両者を融合することができる。
RSA暗号と楕円曲線暗号で必要とされるデータ長は著しく異なる。一般に、RSA暗号でのNのビット数は、十分な安全性を有する為には、1024ビットから2048ビット程度が必要である。一方、RSA暗号と同等の強度を有する楕円曲線暗号でのデータ長は、160ビットから256ビット程度である。従って、RSAの回路の一部分をGF(2^n)の演算器として利用するという構成が可能となる。
GF(2^n)の和演算が、通常の加算処理において、キャリーを全て0とおいたものと一致していることは、以下のようにすればわかる。
例えば、図４の回路に対応する論理式のうち、第ｊビットを表現するもの：
（式４（再掲）） Z[j] = (S[j] AND T[j] AND C[j-1]) OR (S[j] AND NOT(T[j]) AND NOT(C[j-1])) OR (NOT(S[j]) AND T[j] AND NOT(C[j-1])) OR (NOT(S[j]) AND NOT(T[j]) AND C[j-1]),
において、C[j-1] = 0とおけば、
（式６） Z[j] = (S[j] AND T[j] AND 0) OR (S[j] AND NOT(T[j]) AND NOT(0)) OR (NOT(S[j]) AND T[j] AND NOT(0)) OR (NOT(S[j]) AND NOT(T[j]) AND 0)= (S[j] AND NOT(T[j])) OR (NOT(S[j]) AND T[j])
= S[j] EXOR T[j]
を得る。ここで、S[j] EXOR T[j]は、S[j]とT[j]の排他的論理和である。すなわち、キャリーを全て0にすれば、それは、ビット毎の排他的論理和であることがわかる。
ビット毎の排他的論理和は、GF(2^n)の元Aの多項式表現：A(X) = A[n-1]*X^(n-1) + A[n-2]*X^(n-2) + … + A[1]*X + A[0]を、ビット列：(A[n-1]A[n-2]…A[1]A[0])に対応させたときの、GF(2^n)における和の操作に一致していることがわかる。
従って、加算器において、キャリーを0とおく回路を追加して、GF(2^n)の加算（排他的論理和）を実現することができる。この実施例を図１７に示す。図１７は、図４の加算器にセレクタを付けたものである。加算器は連鎖的に接続されており、キャリーC[j]は、次の加算器に伝播する。それぞれのセレクタは、前加算器からのキャリーと、値0を制御信号が1であるか0であるかに応じてキャリーか、0を選択する。例えば、制御信号が1のとき、キャリーを選択し、0のときは、値0を選択することにすれば、前者では通常の加算器、後者ではGF(2^n)の加算器（排他的論理和計算器）として機能する。
これを組み合せて、図１５，１６の回路を共用する加算器の構成を図18に示す。図18におけるキャリー制御機能付き加算器は、図17におけるものと同じであり、切り替え信号によって、剰余乗算用の加算器か、ガロア体GF(2^n)の積演算用の加算器として機能するかが決定される。これは、本発明請求項６，７の実施例の一つである。
本発明の趣旨は、kの値とは無関係であるが、実装上は、kをいくらでも大きく取るわけにはいかない。特にICカード用のマイクロコンピュータにおいては、RAMのサイズは、数キロバイトから十数キロバイト程度であり、kの値は大きく制約される。又、他の方法との比較においても、本発明のアドバンテージが最も高くなるのは、k=2の場合であることが、発明者によって見出された。従って、これを請求項に含め、請求項７とした。
また、べき乗剰余演算、又は、ガロア体GF(2^n)の積演算を実現する為のハードウエア構成は、上記の各種実施の形態に限定されず、適宜変更可能であることは言うまでもない。
【０００６】
【発明の効果】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば、下記の通りである。
すなわち、高速にべき乗剰余演算「Y^X mod N」、及びガロア体GF(2^n)上の楕円曲線暗号の処理を実現することができる。
また、べき乗剰余演算、又は、ガロア体GF(2^n)上の積演算の為に上記の専用ハードウエアの実現において、その論理回路規模を最小限にすることができる。
更に、上記専用ハードウエアをICカード用マイクロコンピュータと同一の半導体チップに搭載し、べき乗剰余演算「Y^X mod N」を適用した暗号化・復号化'(encryption/decryption)、又はガロア体GF(2^n)上の楕円曲線暗号の暗号化・復号化為のマイクロコンピュータを低コストで使いやすく実現することができる。又、ICカードだけでなく、GSM等のモバイル端末等の、低消費電力で暗号処理をすることが必要な装置に対して同様の効果が見込まれることは言うまでもない。
【図面の簡単な説明】
【図１】 ICカードの概観及び、端子。
【図２】マイクロコンピュータの構成。
【図３】モンゴメリ法の原理。
【図４】 1ビットの全加算器の例。
【図５】 4ビットの全加算器。
【図６】全加算器を利用した4ビットの減算回路。
【図７】値修正回路。
【図８】 k=2の場合の値テーブル。
【図９】 k=2の場合の値テーブル生成回路。
【図１０】本発明の実施例。
【図１１】 Aレジスタ。
【図１２】ガロア体GF(2^n)に対する本発明の実施例。
【図１３】ガロア体GF(2^n)に対するk=2の場合の値テーブル。
【図１４】ガロア体GF(2^n)に対するk=2の場合の値テーブル生成回路。
【図１５】モンゴメリ剰余乗算における加算処理装置の実施例。
【図１６】ガロア体GF(2^n)に対するモンゴメリ法における加算処理装置の実施例。
【図１７】キャリー制御機能付き加算器。
【図１８】剰余乗算用加算器とガロア体GF(2^n)の積演算用加算器の共用回路。
【図１】
0003904421.tif 000002
【図２】
0003904421.tif 000003
【図３】
0003904421.tif 000004
【図４】
0003904421.tif 000005
【図５】
0003904421.tif 000006
【図６】
0003904421.tif 000007
【図７】
0003904421.tif 000008
【図８】
0003904421.tif 000009
【図９】
0003904421.tif 000010
【図１０】
0003904421.tif 000011
【図１１】
0003904421.tif 000012
【図１２】
0003904421.tif 000013
【図１３】
0003904421.tif 000014
【図１４】
0003904421.tif 000015
【図１５】
0003904421.tif 000016
【図１６】
0003904421.tif 000017
【図１７】
0003904421.tif 000018
【図１８】
0003904421.tif 000019