(57)【特許請求の範囲】
【請求項１】
データを暗号化・復号化する暗号化・復号化回路において、
キースケジュール・暗号化・復号化を行うデータの項（以下、第１項という）とキースケジュール・暗号化・復号化に使用するキーの項（以下、第２項という）との２項の和を循環シフトし結果を出力する回路を、
前記第１項を循環シフトする第１の循環シフト回路と、前記第２項を循環シフトする第２の循環シフト回路と、
前記各項からそれぞれ循環シフトを行うビット数分だけ上位ビットを取り除いたそれぞれのデータを加算する第１の加算回路と、
前記第１の循環シフト回路の出力と前記第２の循環シフト回路の出力と前記第１の加算回路のキャリー出力を加算する第２の加算回路と、
前記第１項と第２項を加減算する加減算回路と、
該加減算回路のキャリー出力のそれぞれに対応して予め定められた値の内の該加減算回路のキャリー出力に対応する値を前記第２の加算回路の出力から減算する減算回路により構成することを特徴とする暗号化・復号化回路。
【請求項２】
請求項１記載の暗号化・復号化回路において、
前記加減算回路のキャリー出力が得られる前に、前記減算回路の出力として、前記加減算回路のキャリー出力が０の場合と１の場合の二通りを平行して求めておき、前記加減算回路の演算終了時に、前記二通りの減算回路の出力から、該加減算回路のキャリー出力に対応する出力を選択することを特徴とする暗号化・復号化回路。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、平文を暗号化・復号化する暗号化・復号化回路に係り、特に、暗号化・復号化における演算速度を高速化する暗号化・復号化回路に関する。
【０００２】
【従来の技術】
通信や記録等において情報を特定の相手以外に知られないようにするために、従来から情報を暗号化することが知られている。
暗号化では、情報を意味のわからない情報になるように暗号化し、その暗号化した情報を通信で用いたり、記録媒体等に記録する。
そして、暗号化された情報に対して、復号化を行うことにより暗号化される以前の情報にする。
このような暗号化・復号化には、一般に秘密鍵方式と公開鍵方式の二つがある。秘密鍵方式は、暗号化・復号化に用いる鍵が同一の方式である。
公開鍵方式は暗号化・復号化で異なる鍵を用い、暗号化側または復号化側のどちらかの鍵が公開される方式である。
【０００３】
秘密鍵方式の暗号化・復号化方式には様々なものがあり、その一つとして公開特許公報の特開平1-276189において示される暗号アルゴリズムMulti2がある。
Multi2方式の暗号化・復号化方法において、入力データおよび出力データは64ビットである。暗号化・復号化に用いるワークキーは256ビットであり、これを32ビットに分割して暗号化・復号化に用いる。
暗号化・復号化に用いるワークキーは64ビットのデータキーと256ビットのシステムキーを用いて生成する。
ワークキーを生成することをキースケジュールと呼ぶ。
図９はキースケジュールの処理を表す。
図１０は暗号化処理を表す。
図１１は復号化処理を表す。
図９、図１０、図１１のπ1、π2、π3、π4は、図２の基本関数の処理を表している。
またMulti2暗号方式は、ISO 8372やISO/IEC 10116で定義されているElectronic Codebook (ECB) Mode、Cipher Block Chaining (CBC) Mode、Cipher Feedback (CFB) Mode、Output Feedback (OFB) Modeを適用することができる。
Multi2暗号方式を実現する回路に関する従来の技術について述べる。
キースケジュール・暗号化・復号化において行われる演算は図２に示す基本関数による演算であるため、公開特許公報の特開平9-233066、特開平9-230788において、それぞれ回路規模の削減のためキースケジュール処理と復号化処理、キースケジュールと暗号化処理を一つの演算器で実現している。
【０００４】
【発明が解決しようとする課題】
上記従来の技術で述べた発明はいずれも回路規模の削減を目的としており、キースケージュール・暗号化・復号化に関して高速化する発明はほとんどない。
本発明の目的は、所定の暗号アルゴリズムで暗号化された暗号文を復号化する、または平文を暗号化する回路において、高速化を行うことにある。
また、本発明の他の目的は、高速化と回路規模の削減を両立させることである。
【０００５】
【課題を解決するための手段】
上記目的を達成するため、本発明のデータを暗号化・復号化する暗号化・復号化回路において、
キースケジュール・暗号化・復号化を行うデータの項（以下、第１項という）とキースケジュール・暗号化・復号化に使用するキーの項（以下、第２項という）との２項の和を循環シフトし結果を出力する回路を、
前記第１項を循環シフトする第１の循環シフト回路と、
前記第２項を循環シフトする第２の循環シフト回路と、
前記各項からそれぞれ循環シフトを行うビット数分だけ上位ビットを取り除いたそれぞれのデータを加算する第１の加算回路と、前記第１の循環シフト回路の出力と前記第２の循環シフト回路の出力と前記第１の加算回路のキャリー出力を加算する第２の加算回路と、
前記２項を加減算する加減算回路と、
該加減算回路のキャリー出力のそれぞれに対応して予め定められた値の内の該加減算回路のキャリー出力に対応する値を前記第２の加算回路の出力から減算する減算回路により構成するようにしている。
また、前記加減算回路のキャリー出力が得られる前に、前記減算回路の出力として、前記加減算回路のキャリー出力が０の場合と１の場合の二通りを平行して求めておき、前記加減算回路の演算終了時に、前記二通りの減算回路の出力から、該加減算回路のキャリー出力に対応する出力を選択するようにしている。
また、データを暗号化・復号化する暗号化・復号化回路において、
暗号化・復号化の演算前に既知の値となっているキースケジュール・暗号化・復号化に使用するキーと、キースケジュール・暗号化・復号化の処理で定められた定数と、キースケジュール・暗号化・復号化に使用するキーに対して循環シフトを行った結果の３項を予め加算する加算回路と、
該加算回路による加算結果を記憶する記憶装置を有し、
演算開始後に、該記憶装置に保持されているあらかじめ求めておいた値と、演算中に得られた循環シフト対象の値と、該値を循環シフトした結果との３項の和を、前記加算回路で求めるようにしている。
【０００６】
【発明の実施の形態】
以下、本発明の実施の形態を図面を参照して説明する。
図２は本発明の暗号化・復号化・キースケジュールで用いるアルゴリズムの基本関数の詳細を示した図である。
図２の基本関数において加減算、循環シフト、加減算の順に演算が行われている箇所がある。ところで、2項の和に対して循環シフトを行う演算は図３に示すように4項の加減算だけで行うことができる。即ち、2項の和に対して循環シフトを行う演算結果は、上記の2項の各項の循環シフトの結果を加算し、これに上記各項に対してそれぞれ循環シフトを行うビット数分だけ上位ビットを取り除いたもので加算したときのキャリーを加え、その結果から、上記2項を加減算した結果のキャリーに循環シフトを行うビット数分だけ２を乗じた積を、引いた結果に等しくなる。
したがって、加減算、循環シフト、加減算の順の演算は多項の加減算だけに置き換えることができる。
演算が多項の加減算のみの場合、桁上げ保留加算器を用いることで演算の高速化を行うことができる。これが本発明の効果の一つである。
【０００７】
図２の基本関数に対して図４に示すようにラッチL, R, Aを挿入し、ラッチ間の処理をStepと定義する。
図４のK1、K2、K3、K4は暗号化・復号化・キースケジュールに用いるキーである。
図４の各Stepの処理は図５に示す式で表すことができる。
図５の各変数の値は図６（暗号化）、図７（復号化）で示される。図６のStep．1におけるラッチA, LにはStep．1の処理結果が格納され、図にはその内容が示されている。Step．2，Step．3，Step．4 についても同様である。
また、図５のWは図３の式を用いることで各Stepの演算を6項の加算で表すことができる。なお、循環シフトのビット数ｎは図６、７に示すように１あるいは２の値をとる。
この各Stepで加算される値（上記6項の値）を図８に示す。
図８の第3項はキーを循環シフトした値、第4項はキーの値、第5項は定数であり、暗号化・復号化・キースケジュールの演算開始時には既知の値となっているため、暗号化・復号化・キースケジュールの演算処理を行う前にあらかじめ計算し、初期値として記憶しておくことができる。
各Stepの処理は繰り返し行われるので、このようにしておけば繰り返すたびに第3項、第4項、第5項の和を求める必要がなくなり演算の高速化と回路規模の削減を実現できる。これが本発明の効果の一つである。
【０００８】
暗号化・復号化方法を実行する本発明の暗号化・復号化・キースケジュール回路の実施の形態の概略構成例を示すブロック図を図１に示す。
図１で示されるラッチはすべて同一のクロックで動作しており、32ビット幅である。80、81で示されるCSAは桁上げ保留加算器であり、図中のすべての構成要素は32ビット幅である。
図１のINPUTを通してレジスタファイル52、53に256ビットのシステムキーや256ビットのワークキーが記憶される。
また、INPUTには暗号化時には平文が、復号化時には暗号文が、キースケジュール時にはデータキーが入力され、適切なラッチに記憶される。
OUTPUTには暗号化時には暗号文が、復号化時には平文が出力される。
【０００９】
次に、図１の動作をキースケジュールの場合で説明する。
暗号化・復号化の場合も図１に示すブロック図で制御を変えるだけでECBモード、CBCモード、OFBモードを実現できる。
キースケジュールを行うためにはシステムキーが必要であるため、セレクタ36、37はINPUTを選択し、INPUTから入力された合計256ビットのシステムキーがレジスタファイル52,53で記憶される。
この時記憶されたシステムキーを32ビットごとに分割したものを順にSK0,SK1,SK2,SK3, SK4,SK5,SK6,SK7とする。
以降では、クロック単位で図１におけるキースケジュールでの前記初期値を求める動作を述べる。
データキーが入力される前に、初期値の演算を行う。求める初期値を PW00、 PW01、 PW02、 PW03、 PW04、 PW05、 PW06、 PW07、 PW10、 PW11、 PW12、 PW13、 PW14、 PW15、 PW16、 PW17とする。
【００１０】
セレクタ28は固定値-1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK0を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK1を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW00、PW10とする。
【００１１】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。
セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値2を選択し、セレクタ29は固定値0を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK2を選択する。ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW01、PW11とする。
【００１２】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を反転したものを選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK3を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW02、PW12とする。
【００１３】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。
セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値-1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK4を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW03、PW13とする。
【００１４】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。
セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK5を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW04、PW14とする。
【００１５】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。
セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値2を選択し、セレクタ29は固定値0を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK6を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW05、PW15とする。
【００１６】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を反転したものを選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
セレクタ28は固定値1を選択し、セレクタ29は固定値-3を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK7を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW06、PW16とする。
【００１７】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ42はセレクタ38の出力を選択し、セレクタ43はセレクタ39の出力を選択する。
セレクタ44、45は0を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
ラッチ16，17はそれぞれ加算器82，83の出力を記憶する。
ラッチ16，17の出力はそれぞれレジスタファイル50，51に記憶される。
ここではその値をそれぞれPW07、PW17とする。
レジスタファイル50，51に記憶されたPW00、 PW01、 PW02、 PW03、 PW04、 PW05、 PW06、 PW07、 PW10、 PW11、 PW12、 PW13、 PW14、 PW15、 PW16、 PW17が、図８の第3項、第4項、第5項の和であり、以降のキースケジュールの演算に使用される。
初期値の求め方は暗号化・復号化のどちらの場合でも同じである。
【００１８】
次に、キースケジュールの演算について述べる。
以降では、クロック単位で図１におけるキースケジュールの動作を述べる。
キースケジュールでは256ビットのワークキーを生成するために、入力として64ビットのデータキーが必要である。
INPUTから64ビットのデータキーを入力する。
この時、セレクタ20、21はそれぞれ入力されたデータキーの前半32ビットと後半32ビットを選択し、ラッチ00と01はその値を保持する。
論理積54、55の右側の入力を1とし、論理積56，58の右側の入力を0とする。
セレクタ32は排他的論理和66の出力を選択し、セレクタ31、33は排他的論理和68の出力を選択し、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
【００１９】
セレクタ28はレジスタファイル50に記憶されているPW00を選択し、セレクタ29はレジスタファイル51に記憶されているPW10を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK0を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30の出力を記憶する。
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位31ビットについてはセレクタ38の出力を選択し、下位1ビットについては‘0’を選択する。
セレクタ45は上位31ビットについてはセレクタ40の出力を選択し、下位1ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器94の出力を選択する。
論理積60、62、64の右側の入力を1とし、論理積61、63、65の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW01を選択し、セレクタ29はレジスタファイル51に記憶されているPW11を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK1を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32は排他的論理和74の出力を選択し、セレクタ33はラッチ13の出力を選択する。
セレクタ24は排他的論理和74の出力を選択する。ラッチ04はセレクタ24、ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積56の右側の入力を1とする。セレクタ36は論理積56の出力を選択し、レジスタファイル52はセレクタ36の出力をK0として記憶する。
【００２０】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器93の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ44は上位30ビットについてはセレクタ38の出力を選択し、下位2ビットについては‘0’を選択する。
セレクタ45は上位30ビットについてはセレクタ40の出力を選択し、下位2ビットについては‘0’を選択する。
セレクタ44はセレクタ38の出力を選択し、セレクタ45はセレクタ40の出力を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器95の出力を選択する。
論理積60の右側の入力を1とし、論理積61、62、63、64、65の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW02を選択し、セレクタ29はレジスタファイル51に記憶されているPW12を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK2を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32はラッチ12の出力を選択し、セレクタ33はラッチ13の出力を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
【００２１】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力の反転を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位31ビットについてはセレクタ38の出力を選択し、下位1ビットについては‘0’を選択する。
セレクタ45は上位31ビットについてはセレクタ40の出力を選択し、下位1ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器96の出力を選択する。
論理積60、61、63、65の右側の入力を1とし、論理積62、64の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW03を選択し、セレクタ29はレジスタファイル51に記憶されているPW13を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK3を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32はラッチ12の出力を選択し、セレクタ33は排他的論理和75の出力を選択する。
セレクタ25は排他的論理和75の出力を選択する。
ラッチ05はセレクタ25、ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積58の右側の入力を1とする。セレクタ37は論理積58の出力を選択し、レジスタファイル53はセレクタ37の出力をK1として記憶する。
【００２２】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位30ビットについてはセレクタ38の出力を選択し、下位2ビットについては‘0’を選択する。
セレクタ45は上位30ビットについてはセレクタ40の出力を選択し、下位2ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47はセレクタ46の出力を選択する。論理積62、64、65の右側の入力を1とし、論理積60、61、63の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW04を選択し、セレクタ29はレジスタファイル51に記憶されているPW14を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK4を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32は排他的論理和74の出力を選択し、セレクタ33は排他的論理和75の出力を選択する。
セレクタ24は排他的論理和74の出力を選択し、セレクタ25は排他的論理和75の出力を選択する。
ラッチ04はセレクタ24、ラッチ05はセレクタ25、ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積56、58の右側の入力を1とする。
セレクタ36は論理積56の出力を選択し、セレクタ37は論理積58の出力を選択し、レジスタファイル52はセレクタ36の出力をK2として記憶し、レジスタファイル53はセレクタ37の出力をK3として記憶する。
【００２３】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位31ビットについてはセレクタ38の出力を選択し、下位1ビットについては‘0’を選択する。
セレクタ45は上位31ビットについてはセレクタ40の出力を選択し、下位1ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器94の出力を選択する。
論理積60、62、64の右側の入力を1とし、論理積61、63、65の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW05を選択し、セレクタ29はレジスタファイル51に記憶されているPW15を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK5を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32は排他的論理和74の出力を選択し、セレクタ33はラッチ13の出力を選択する。
セレクタ24は排他的論理和74の出力を選択する。
ラッチ04はセレクタ24、ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積56の右側の入力を1とする。セレクタ36は論理積56の出力を選択し、レジスタファイル52はセレクタ36の出力をK4として記憶する。
【００２４】
セレクタ38は循環シフト演算器91の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器93の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位30ビットについてはセレクタ38の出力を選択し、下位2ビットについては‘0’を選択する。
セレクタ45は上位30ビットについてはセレクタ40の出力を選択し、下位2ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器95の出力を選択する。
論理積60の右側の入力を1とし、論理積61、62、63、64、65の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW06を選択し、セレクタ29はレジスタファイル51に記憶されているPW16を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK6を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32はラッチ12の出力を選択し、セレクタ33はラッチ13の出力を選択する。
ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
【００２５】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力の反転を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位31ビットについてはセレクタ38の出力を選択し、下位1ビットについては‘0’を選択する。
セレクタ45は上位31ビットについてはセレクタ40の出力を選択し、下位1ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47は循環シフト演算器96の出力を選択する。
論理積60、61、63、65の右側の入力を1とし、論理積62、64の右側の入力を0とする。
セレクタ28はレジスタファイル50に記憶されているPW07を選択し、セレクタ29はレジスタファイル51に記憶されているPW17を選択し、セレクタ30はレジスタファイル52,53に記憶されているSK7を選択し、セレクタ31は排他的論理和75の出力を選択し、セレクタ32はラッチ12の出力を選択し、セレクタ33は排他的論理和75の出力を選択する。セレクタ25は排他的論理和75の出力を選択する。
ラッチ05はセレクタ25、ラッチ08はセレクタ28、ラッチ09はセレクタ29、ラッチ10はセレクタ30、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積58の右側の入力を1とする。セレクタ37は論理積58の出力を選択し、レジスタファイル53はセレクタ37の出力をK5として記憶する。
【００２６】
セレクタ38は循環シフト演算器90の出力を選択し、セレクタ39はラッチ10の出力を選択する。
セレクタ40は循環シフト演算器92の出力を選択し、セレクタ41はラッチ11の出力を選択する。
セレクタ42はセレクタ40の出力を選択し、セレクタ43はセレクタ41の出力を選択する。
セレクタ44は上位30ビットについてはセレクタ38の出力を選択し、下位2ビットについては‘0’を選択する。
セレクタ45は上位30ビットについてはセレクタ40の出力を選択し、下位2ビットについては‘0’を選択する。
キャリージェネレータ84の出力が、加算器82、83のイニシャルキャリーとして与えられる。
セレクタ46はキャリージェネレータ85の結果が0ならば加算器82の出力を選択し、キャリージェネレータ85の結果が1ならば加算器83の出力を選択する。
セレクタ47はセレクタ46の出力を選択する。
論理積62、64、65の右側の入力を1とし、論理積60、61、63の右側の入力を0とする。
セレクタ31は排他的論理和75の出力を選択し、セレクタ32は排他的論理和74の出力を選択し、セレクタ33は排他的論理和75の出力を選択する。
セレクタ24は排他的論理和74の出力を選択し、セレクタ25は排他的論理和75の出力を選択する。
ラッチ04はセレクタ24、ラッチ05はセレクタ25、ラッチ11はセレクタ31、ラッチ12はセレクタ32、ラッチ13はセレクタ33の出力を記憶する。
論理積56、58の右側の入力を1とする。セレクタ36は論理積56の出力を選択し、セレクタ37は論理積58の出力を選択し、レジスタファイル52はセレクタ36の出力をK6として記憶し、レジスタファイル53はセレクタ37の出力をK7として記憶する。
以上の処理で求められたK0、 K1、 K2、 K3、 K4、 K5、 K6、 K7がキースケジュールによって得られるワークキーである。
【００２７】
【発明の効果】
本発明は以上のように構成されているため、加減算、循環シフト、加減算の順の演算は多項の加減算だけに置き換えることができ、演算が多項の加減算のみのため演算の高速化を行うことができる。また、桁上げ保留加算器を用いることで、さらに演算の高速化を行うことができる。
また、多項の加減算だけに置き換えたことで、暗号化・復号化・キースケジュールの演算開始時には既知の値となっているものを、暗号化・復号化・キースケジュールの演算処理を行う前にあらかじめ計算し、初期値として保持することで、繰り返し行われる演算において和を求める必要がなくなり演算の高速化と回路規模の削減を行うことができる。
【図面の簡単な説明】
【図１】本発明の暗号化・復号化・キースケージュールを実行する本発明の回路の実施の形態の構成例を示すブロック図である。
【図２】本発明の暗号化・復号化・キースケジュールで用いるアルゴリズムの基本関数の詳細を示した図である。
【図３】本発明の暗号化・復号化・キースケジュールで用いる、加減算、循環シフトの順の演算を加減算だけに式変形することを示す図である。
【図４】本発明の暗号化・復号化・キースケジュール用いるアルゴリズムの基本関数に対して、本発明においてラッチを挿入した図である。
【図５】図４で定義された各Stepの処理を示す図である。
【図６】図５で示された式の暗号化における各Stepでの変数の値を示す図である。
【図７】図５で示された式の復号化における各Stepでの変数の値を示す図である。
【図８】図５で示されたWを図３を用いて多項の加減算に変形したときの各Stepでの項の値を示す図である。
【図９】図２で定義された基本関数を用いて、本発明のキースケジュールの動作を示したブロック図である。
【図１０】図２で定義された基本関数を用いて、本発明の暗号化の動作を示したブロック図である。
【図１１】図２で定義された基本関数を用いて、本発明の復号化の動作を示したブロック図である。
【符号の説明】
００〜１７  ３２ビット幅のラッチ
２０〜４７  ３２ビット幅のセレクタ
５０〜５３  レジスタファイル
５４〜６５  ３２ビット幅の論理積
６６〜７５  ３２ビット幅の排他的論理和
７６  ３２ビット幅の論理和
８０，８１  ３２ビット幅の桁上げ保留加算器
８２，８３  ３２ビット加算器
８４，８５  ３２ビットのキャリージェネレータ
８６  シフタ
９０〜９６  循環シフト演算器
【図１】
0003795315.tif 000002
【図２】
0003795315.tif 000003
【図３】
0003795315.tif 000004
【図４】
0003795315.tif 000005
【図５】
0003795315.tif 000006
【図６】
0003795315.tif 000007
【図７】
0003795315.tif 000008
【図８】
0003795315.tif 000009
【図９】
0003795315.tif 000010
【図１０】
0003795315.tif 000011
【図１１】
0003795315.tif 000012