(57)【要約】第１、第２レジスタ２０１、２０２に設定されたパラメータを変えることによって、誤り検出符号（ＣＲＣ）用行列値又は楕円曲線暗号（ＥＣＣ）用行列値を行列値演算部３０で生成し、行列値レジスタ５１に保持する行列値を切替えることによって、前記行列値と第３レジスタに設定されたデータとの積和演算を実行する積和演算部をＣＲＣ符号化演算とＥＣＣ暗号化演算とに共用する。
2004001701.tif 000002
【特許請求の範囲】
【請求項１】
それぞれ所定ビット長のパラメータが設定される第１、第２レジスタ（２０１、２０２）と、符号化すべきデータが設定される第３レジスタ（２０３）と、上記第１、第２レジスタの設定値から行列値を生成する行列値演算部（３０）と、上記行列値演算部で生成された行列値を保持する行列値レジスタ（５１）と、上記行列値レジスタが保持する行列値と上記第３レジスタに設定されたデータとの積和演算を実行する積和演算部（４０）とを有し、
上記第１、第２レジスタの設定パラメータを変えることによって、上記行列値演算部で誤り検出用の行列値と暗号化用の行列値を選択的に生成し、上記行列値レジスタに保持する行列値を切替えることによって、上記積和演算部で誤り符号化演算と暗号化演算を選択的に行うことを特徴とする符号演算装置。
【請求項２】
少なくとも一方にｎ次多項式の係数値データが設定される第１、第２レジスタ（２０１と２０２）と、符号化すべきデータが設定される第３レジスタ（２０３）と、上記第１、第２レジスタの設定値からｎ×ｎの行列値を生成する行列値演算部（３０）と、上記行列値演算部で生成された行列値を保持する行列値レジスタ（５１）と、上記行列値レジスタが保持する行列値と上記第３レジスタに設定されたデータとの積和演算を実行する積和演算部（４０）とを有し、
上記第３レジスタに送信データまたは受信データを供給することによって、上記積和演算部から符号化データを得るようにしたことを特徴とする符号演算装置。
【請求項３】
前記行列値演算部で誤り検出用の行列値を生成し、前記積和演算部から前記第３レジスタの設定データと対応する誤り検出符号を得ることを特徴とする請求項２に記載の符号演算装置。
【請求項４】
前記第１、第２レジスタに、ガロア体のｎ次の多項式ｇ（ｘ）の最高次ｎの係数を除いた係数データ（ｇ’）を設定し、前記積和演算部から、前記第３レジスタの設定データに対する多項式ｇ（ｘ）を法（ｍｏｄ）とするＣＲＣ符号を得ることを特徴とする請求項３に記載の符号演算装置。
【請求項５】
前記行列値演算部で暗号化用の行列値を生成し、前記積和演算部から前記第３レジスタの設定データの暗号化符号を得ることを特徴とする請求項２に記載の符号演算装置。
【請求項６】
ガロア体のｎ次既約多項式ｇ（ｘ）の係数データと暗号鍵データを記憶するための第１メモリと、上記メモリから係数データと暗号鍵データをそれぞれ複数のデータブロックに分割して読み出し、前記第１、第２レジスタに設定する制御部（７０）と、複数の部分行列値を記憶するための第２メモリとを備え、
前記行列値演算部（３０）でｎ×ｎの複数の部分行列値を生成し、上記制御部の制御の下で、上記行列値演算部で生成された部分行列値を上記第２のメモリに記憶しておき、上記第２のメモリから前記行列値レジスタ（５１）に部分行列値を選択的にロードし、前記積和演算部で前記第３レジスタの設定データと複数の部分行列値との積和演算を繰り返すことによって、前記暗号化符号を得ることを特徴とする請求項５に記載の符号演算装置。
【請求項７】
前記積和演算部で生成された積和演算結果を中間演算値として保持されている既演算値に排他的論理和加算し、新たな中間演算値として保持するための手段を（５２、５３）有することを特徴とする請求項６に記載の符号演算装置。
【発明の詳細な説明】
【技術分野】  本発明は、通信データ用の符号演算装置に関し、更に詳しくは、ディジタル・パケットデータの送受信において必要となる誤り検出（訂正）符号の生成とデータ暗号化／復号化処理のための符号演算装置に関する。
【背景技術】  ディジタル通信装置では、データの機密性保持およびネットワーク上での信号誤りの発生に備えて、パケットデータの暗号化／復号化機能と誤り検出（訂正）符号の生成機能が必要となる。音声データやテキストデータの他に、情報量の多い静止画像や動画像等の通信ニーズが増えるに従って、ディジタル通信装置には、データ転送速度の高速化に適した暗号化／復号化技術と誤り検出（訂正）符号の生成技術が要求されてきている。
データパケットの誤り検出符号としては、例えば、誤り訂正は行わずに誤り検出のみを目的としたＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｈｅｃｋ  Ｃｏｄｅｓ：巡回冗長検査符号）がよく使われる。ＣＲＣ演算式については、例えば、Ｒａｍａｂａｄｒａｎ，Ｔ．Ｖ．ａｎｄ  Ｇａｉｔｏｎｄｅ  Ｓ．Ｓ．“Ａ  Ｔｕｔｏｒｉａｌ  ｏｎ  ＣＲＣ  Ｃｏｍｐｕｔａｔｉｏｎｓ”，ＩＥＥＥ  Ｍｉｃｒｏ，ｖｏｌ．８、Ｎｏ．４、ｐｐ．６２−７５、Ａｕｇ．１９８８に記載されている。
一方、データの機密性を保持するために使用される暗号方式としては、ＲＳＡ暗号が有名である。しかしながら、ＲＳＡでは、暗号／復号鍵として１０２４ビットの長い符号を必要としているため、最近では、符号長が１６０ビット程度と短くて済む楕円曲線暗号（ＥＣＣ；Ｅｌｌｉｐｔｉｃ  Ｃｕｒｖｅ  Ｃｒｙｐｔｏｇｒａｐｈｙ）が注目されている。楕円曲線暗号処理に関する文献としては、例えば、Ｍｏｏｎ，Ｓ．、Ｐａｒｋ，Ｊ．ａｎｄ  Ｌｅｅ，Ｙ．、“Ｆａｓｔ  ＶＬＳＩ  Ａｒｉｔｈｍｅｔｉｃ  Ａｌｇｏｔｉｔｈｍｓ  ｆｏｒ  Ｈｉｇｈ−Ｓｅｃｕｒｉｔｙ  Ｅｌｌｉｐｔｉｃ  Ｃｕｒｖｅ  Ｃｒｙｐｔｏｇｒａｐｈｉｃ  Ａｐｐｌｉｃａｔｉｏｎｓ”ＩＥＥＥ  Ｔｒａｎｓ．Ｃｏｎｓｕｍｅｒ  Ｅｌｅｃｔｒｏｎｉｃｓ、ｖｏｌ．４７、Ｎｏ．３、ｐｐ．７００−７０８、Ａｕｇ．２００１がある。上記文献には、楕円曲線暗号（ＥＣＣ）に必要な演算式と、ＥＣＣ処理を実現した大規模集積回路の１例について説明されている。
ＲＳＡは、桁上げ伝播が発生するモジュラー演算を採用しているため、ハードウェア量が多くなる。これに対して、ＥＣＣは、以下に説明するように、桁上げ伝播が発生しないガロア体（有限体）をベースにしているため、データの暗号／復号化をコンパクトなハードウェアで実現できる。
式（１）が示すガロア体上のｎ次多項式ｇ（ｘ）によるモジュラー演算（ｍｏｄ）を考える。
2004001701.tif 000003
この多項式のガロア体は、一般にＧＦ（２ｎ）と表記される。係数ｇｉの値は“０”または“１”であり、ｇｉ∈ＧＦ（２）と表記される。また、
2004001701.tif 000004
が、本明細書では、特に混乱しない限り（＋）演算子で代用する。
今、長さｎのデータを表現する次の３つの多項式について考える。
2004001701.tif 000005
但し、ａｉ，ｂｉ，ｃｉ∈ＧＦ（２）
ＥＣＣの場合、共通鍵または秘密鍵と呼ばれる暗号鍵を示すデータを多項式ａ（ｘ）とし、この暗号鍵が適用される送受信データを多項式ｂ（ｘ）とすると、送信側における暗号化データ、または受信側における復号化データ（元の平文データ）は、次式（２）の演算結果ｃ（ｘ）として得られる。
2004001701.tif 000006
式（２）を詳しく書くと、次式（３）にようになる。
2004001701.tif 000007
文献：Ｍａｓｔｒｏｖｉｔｏ，Ｅ．Ｄ．，“ＶＬＳＩ  Ｄｅｓｉｇｎｓ  ｆｏｒ  Ｍｕｌｔｉｐｌｉｃａｔｉｏｎ  ｏｖｅｒ  Ｆｉｎｉｔｅ  Ｆｉｅｌｄｓ  ＧＦ（２ｍ）”、Ｐｒｏｃ．Ｓｉｘｔｈ  Ｉｎｔ’１  Ｃｏｎｆ．「Ａｐｐｌｉｅｄ  Ａｌｇｅｂｒａ，Ａｌｇｅｂｒａｉｃ  Ａｌｇｏｒｉｔｈｍｓ，ａｎｄ  Ｅｒｒｏｒ−Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅｓ（ＡＡＥＣＣ−６）」ｐｐ．２９７−３０９，Ｊｕｌ．１９８８と、公開公報ＷＯ  ９１／２００２８号（発明の名称「Ｕｎｉｖｅｒｓａｌ  Ｇａｌｏｉｓ  Ｆｉｅｌｄ  Ｍｕｌｔｉｐｌｉｅｒ」）において、Ｍａｓｔｒｏｖｉｔｏは、式（３）を次の行列形式に変換することを試みている。
2004001701.tif 000008
式（４）におけるｎ×ｎの行列Ｍは、Ｍａｓｔｒｏｖｉｔｏ行列と呼ばれており、行列Ｍの値は、多項式ａ（ｘ）とｇ（ｘ）から前もって計算することができる。
一方、ＣＲＣの値は、送信メッセージ（または受信メッセージ）のデータを多項式ｂ（ｘ）で示した場合に、次式（６）で示すように、ｘｎ・ｂ（ｘ）を多項式ｇ（ｘ）で割った時に得られる余りｃ（ｘ）として算出される。
2004001701.tif 000009
ここで、ｘｎ・ｂ（ｘ）は、データｂ（ｘ）をｎビット左シフトすることを意味しており、データの送信側では、式（６）で算出されたＣＲＣの値：多項式ｃ（ｘ）を送信データｂ（ｘ）に加算した形で、伝送路に送出する。
データの受信側では、ＣＲＣ付きの受信データｂ（ｘ）に対して同様の演算を行い、演算結果ｃ（ｘ）が０となった場合、極めて高い確率で受信データｂ（ｘ）には誤りがないものと判定する。
式（２）と式（６）とを比較すると、ＣＲＣとＥＣＣの演算式が極めて類似していることがわかる。両者の違いは、ＣＲＣの場合、データｂ（ｘ）に乗算される値がｎ次のｘｎであるのに対して、ＥＣＣの場合は、ｎ−１次の多項式ａ（ｘ）となっている点にある。
Ｍａｓｔｒｏｖｉｔｏ行列について述べた上記文献では、ＢＣＨやＲｅｅｄ−Ｓｏｌｏｍｏｎと呼ばれる誤り訂正方式を式（２）で一般的に取り扱おうとしているように思われる。しかしながら、上記文献には、これらの符号化方式を具体的にどのようにして式（２）に結びつけるかについて具体的な記載がない。また、後述する本発明が着目したＣＲＣ符号の行列表現に関して、上記文献には何ら示唆されていない。
【発明の開示】
本発明の目的は、誤り検出処理と暗号／復号化処理に共用できる符号演算装置を提供することにある。
本発明の他の目的は、誤り検出処理と暗号／復号化処理に共用できるガロア体（有限体）符号演算装置を提供することにある。
本発明の更に他の目的は、誤り検出処理用と暗号／復号化処理用の行列値を同一の行列値演算部で算出し、これらの行列値を選択的に利用して、誤り検出処理と暗号／復号化処理を行うようにした符号演算装置を提供することにある。
本発明の更に他の目的は、コンパクトなハードウェア構成で誤り検出処理と暗号／復号化処理を実行できるパケット通信装置を提供することにある。
これらの目的を達成するために、本発明では、ガロア体ベースのＣＲＣとＥＣＣの演算式の類似性に着目し、ＣＲＣ演算とＥＣＣ演算のためのハードウェアを共通化することを特徴とする。
ＣＲＣと楕円曲線暗号ＥＣＣの演算処理を共通化しようとした場合、容易に考えられる解決方法の１つは、式（２）で示したＥＣＣ演算でデータｂ（ｘ）に乗算される多項式ａ（ｘ）の次数をｎ−１次からｎ次に上げることによって、式（６）で示したＣＲＣ演算におけるｘｎの次数と一致させておき、ＣＲＣ演算を行う場合は、多項式ａ（ｘ）のｎ次の係数部を使用する方法である。しかしながら、このように多項式ａ（ｘ）の次数を増やす方法では、本質的な解決策とはならない。
本発明では、ガロア体モジュロ演算がもつ次の性質を利用して、ＣＲＣとＥＣＣの演算処理を共通化する。
すなわち、式（１）が示すように、ガロア体モジュロ演算に適用される既約多項式ｇ（ｘ）は、ｘｎの係数ｇｎが“１”となっている。そこで、式（６）が示すＣＲＣ演算に適用されるｎ次以上の高次項ｘｎをｇ（ｘ）でモジュロ演算し、ｎ−１次以下の余りの項にリダクションすると、次の多項式（７）が得られる。
2004001701.tif 000010
ここで、式（７）の右辺を
2004001701.tif 000011
と置き換えると、式（６）に示したＣＲＣの演算式は、次式（９）のように変形され、ＥＣＣの演算式（２）と同様に、データｂ（ｘ）に乗算される多項式の次数をｎ−１次にすることができる。
2004001701.tif 000012
ＣＲＣの値は、ａ（ｘ）に代えてｇ’（ｘ）の値をセットすることにより、式（９）に従って算出できる。
また、ｘｎよりも更に高次の項ｘｎ＋１をｇ（ｘ）でモジュロ演算すると、式（７）を利用して、次式（１０）が示すように、ｎ−１次以下の項にリダクションできることが判る。
2004001701.tif 000013
従って、ｎ次以上の高次項は、ｎ−１次以下の項にリダクションした後、ｘｉの係数項間を比較することによって、式（４）または（５）の行列値を得ることができる。
本発明の特徴の１つは、ＣＲＣの演算式を式（９）のように変形し、次数をＥＣＣ演算式（３）に適合させることによって、同一の行列値演算部を利用して、ＥＣＣ用行列値とＣＲＣ用行列値を計算できるようにしたことにある。また、本発明の他の特徴は、予め計算されたＥＣＣ用行列値とＣＲＣ用行列値を選択的に利用することによって、同一の積和演算部で、ＥＣＣ符号化／復号化演算とＣＲＣ演算を実行できるようにしたことにある。
【図面の簡単な説明】  第１図は、本発明が適用される誤り検出機能と暗号処理機能を備えたパケット通信装置の構成を示すブロック図。
第２図は、ＣＲＣ誤り検出の符号化、復号化処理を説明するための図。
第３図は、ＥＣＣ暗号化、復号化処理を説明するための図。
第４図は、行列演算回路３０を備えた本発明による演算装置の１実施例を示すブロック図。
第５図は、行列演算回路３０で生成される行列Ｍの計算値配列を説明するための図。
第６図は、ｎ×ｎの行列Ｍの計算値を複数の部分行列に分割して生成する場合の説明図。
第７図は、ＥＣＣ用の行列Ｍを構成する部分行列と入出力データとの関係を説明するための図。
第８図は、ＣＲＣとＥＣＣに共用される行列値演算部３０の１実施例を示す図。
第９図は、第４図に示したコントローラ７０が実行するＣＲＣ行列値生成ルーチン１００の１実施例を示すフローチャート。
第１０図は、コントローラ７０が実行するＥＣＣ用行列値生成ルーチン１２０の１実施例を示すフローチャート。
第１１図は、コントローラ７０が実行する送信データ処理ルーチン２００と受信データ処理ルーチン３００を示すフローチャート。
第１２図は、送信データ処理ルーチン２００における送信データ暗号化２１０の詳細を示すフローチャート。
第１３図は、送信データ処理ルーチン２００におけるＣＲＣ生成２３０の詳細を示すフローチャート。
【発明を実施するための最良の形態】  第１図は、本発明が適用されるデータ誤り検出機能と暗号処理機能を備えたパケット通信装置のブロック図を示す。
パケット通信装置は、コアプロセッサ（Ｐ−ＣＯＲＥ）１０と、送受信データ処理部２０と、伝送路１３に接続された送信部１１および受信部１２とからなる。送信部１１と受信部１２は、伝送路１３が無線の場合、Ａ／Ｄ、Ｄ／Ａ変換器と、ＲＦ（Ｒａｄｉｏ  Ｆｒｅｑｕｅｎｃｙ）処理部とを含み、伝送路１３がアナログ有線回線の場合は、モデム処理部を含む。
送受信データ処理部２０は、制御プロセッサ（Ｐ−ＣＯＮＴ）２１と、暗号符号化部（ＥＣＣ−ＥＮＣ）２２、誤り検出符号化部（ＣＲＣ−ＥＮＣ）２３、誤り検出復号化部（ＣＲＣ−ＤＥＣ）２４、暗号復号化部（ＥＣＣ−ＤＥＣ）２５と、バッファメモリ（ＢＵＦ−ＭＥＭ）２６、メモリ（ＭＥＭ）２７からなり、これらの要素は、内部バス２９（２９Ａ、２９Ｂ）によって相互接続されている。
コアプロセッサ１０から出力された送信メッセージ（平文データ）は、バッファメモリ２６の送信バッファ領域に一時的に格納され、送信データに機密保持が必要な場合は、送信メッセージが暗号符号化部２２で暗号化される。送信メッセージ（平文データまたは暗号化データ）は、誤り検出符号化部２３で生成した誤り検出符号を付加した形で、送信部１１から伝送路１３に送出される。
逆に、伝送路１３から受信した誤り検出符号付きの受信メッセージ（平文データまたは暗号化データ）は、受信部１２からバッファメモリ２６の受信バッファ領域に一旦格納され、誤り検出復号化部２４で受信メッセージの誤り検出符号の余り演算が行われる。余りがゼロの場合、受信データに誤りがないものと判断し、受信メッセージから誤り検出符号が除去される。誤り検出符号を取り除いた受信メッセージのデータが暗号文の場合、暗号復号化部２５で平文に戻した後、バッファメモリ２６を介してコアプロセッサ１０に転送される。誤り検出およびデータの暗号／復号化に必要な情報は、メモリ２７から読み出され、暗号符号化部２２、誤り検出符号化部２３、誤り検出復号化部２４、暗号復号化部２５は、制御プロセッサ２１に制御される。
第２図は、誤り検出にＣＲＣを適用した場合の誤り検出符号化部２３と誤り検出復号化部２４の動作を示す。
この場合、誤り検出符号化部２３では、送信データをｎビット長（ｎ＝３２ビット）のデータブロックｂ（ｘ）に分割し、データブロック毎に符号化する。先ず、式（６）が示すように、データｂ（ｘ）をｎビット左へシフト（ｘｎ・ｂ（ｘ）の演算）した後、これを予め指定された数値ｇ（ｘ）で割って（モジュロ演算）、余りｒ（ｘ）を求める。
2004001701.tif 000014
2004001701.tif 000015
の演算を行う。その結果、元のｎビットデータブロックは、２ｎビット長のデータブロックｗ（ｘ）に変換した形で伝送路に送出される。
一方、受信側の誤り検出復号化部２４では、伝送路から受信したデー
2004001701.tif 000016
ｇ（ｘ）でモジュロ演算を実行して、余りを求める。伝送路上で誤りが発生していなければ、次式（１２）が成立し、余りｃ（ｘ）がゼロになる。
2004001701.tif 000017
この場合、受信データｗ’（ｘ）からｒ’（ｘ）を除去し、ｎビット右シフトすることによって、元のデータブロックｂ（ｘ）＝ｂ’（ｘ）を復元できる。尚、伝送路からの受信メッセージ長が２ｎビットよりも長い場合は、２ｎビット長のデータブロック毎に、上述した誤り検出復号化処理が繰り返される。
第３図は、暗号化にＥＣＣを適用した場合の暗号符号化部２２と暗号復号化部２５の動作を示す。
暗号符号化部２２では、送信データをｎビットのデータブロックに分割し、送信データブロックを多項式ｂ（ｘ）、共通鍵を多項式ａ（ｘ）とし、既約多項式ｇ（ｘ）でモジュロ演算を実行することにより、式（２）が示す暗号化データｃ（ｘ）を生成する。
ＥＣＣ暗号符号化データのブロック長ｎは、ＣＲＣよりも長い１６０ビット程度になるため、ＣＲＣと同一ハードウェアを適用するために、送信データブロックｂ（ｘ）、共通鍵ａ（ｘ）、既約多項式ｇ（ｘ）をそれぞれＣＲＣビット長に合わせた複数のサブブロック分割して、暗号化処理を繰り返す。
誤り検出符号が付加された暗号化データは、受信側で誤り検出され、もし、誤りがなければ、誤り検出符号を除去した暗号化データｃ（ｘ）に戻される。受信側の暗号復号化部２５では、次式（１３）が示すように、式（２）のａ（ｘ）、ｂ（ｘ）の代わりに秘密鍵ｄ（ｘ）と受信データｃ（ｘ）を適用し、既約多項式ｇ（ｘ）によってモジュロ演算を実行することによって、復号化されたデータｂ（ｘ）を得る。
2004001701.tif 000018
本発明の特徴は、上述した誤り検出符号化部２３、誤り検出復号化部２４、暗号符号化部２２、暗号復号化部２５に必要なハードウェアを共用することによって、送受信データ処理部２０の構成を簡単化したことにある。
第４図は、本発明による送受信データ処理部２０の１実施例を示す。
送受信データ処理部（符号演算装置）２０は、行列値演算部（ＭＡＴ−ＵＮＩＴ）３０、積和演算部（ＣＡＬ−ＵＮＩＴ）４０、制御部（ＣＯＮＴＲＯＬＬＥＲ）７０と、バッファメモリ（ＢＵＦ−ＮＥＭ）２６、パラメータ格納用のメモリ２７、行列値格納用のメモリ（ＭＡＴ−ＭＥＭ）５０、行列値レジスタ（Ｍ−ＲＥＧ）５１、演算結果保持メモリ（Ｃ−ＭＥＭ）５２と、パラメータレジスタ（Ａ−ＲＥＧ、Ｇ−ＲＥＧ）２０１、２０２、データレジスタ（Ｂ−ＲＥＧ）２０３、符号レジスタ（Ｃ−ＲＥＧ）２０４と、ＥＯＲ加算回路５３と、一致検出回路５４からなる。
メモリ２７は、ＣＲＣ演算で必要となるリダクションされた多項式ｇ’（ｘ）の記憶領域（ｇ’−ＣＲＣ）２７１と、ＥＣＣ演算で必要となる既約多項式ｇ（ｘ）の記憶領域（ｇ−ＥＣＣ）２７２、暗号鍵（公開鍵）の記憶領域（Ｅ−ＫＥＹ）２７３と、復号鍵（秘密鍵）の記憶領域（Ｄ−ＫＥＹ）２７４とを含む。
また、バッファメモリ２６には、コアプロセッサ１０から供給された送信メッセージの格納領域（Ｔｘ−ＢＵＦ）２６１Ａ、暗号化送信メッセージの格納領域（Ｔｘ−ＥＮＣ）２６２Ａと、受信部から供給されたＣＲＣ付の受信メッセージの格納領域（Ｒｘ−ＣＲＣ）２６３Ｂ、ＣＲＣ除去後の暗号化受信メッセージの格納領域（Ｒｘ−ＥＮＣ）２６２Ｂ、復号化された受信メッセージの格納領域（Ｒｘ−ＢＵＦ）２６１Ｂとが定義され、コアプロセッサ１０と送受信データ処理部２０との間では、Ｔｘ−ＢＵＦ領域２６１ＡとＲｘ−ＢＵＦ領域２６１Ｂを介してメッセージが送受信される。
本実施例で示した送受信データ処理部（符号演算装置）２０の動作モードには、行列値演算モードと、送信データ暗号化モードと、送信データ誤り符号化モードと、受信データ誤り検出モードと、暗号データ復号化モードとがある。これらの動作モードの切替えは、制御部７０が行う。
行列値演算モードにおいて、例えば、ＥＣＣ暗号化用の行列値を生成する場合は、制御部７０が、メモリ領域２７２から読み出した既約多項式ｇ（ｘ）の値をＧ−ＲＥＧ２０２に設定し、メモリ領域２７３から読み出した暗号鍵をＡ−ＲＥＧ２０１に設定した状態で、行列値演算部３０を起動する。生成された行列値は、メモリ５０の暗号化用行列領域に保持される。
同様に、ＥＣＣ復号化用の行列値は、メモリ領域２７２からＧ−ＲＥＧ２０２に既約多項式ｇ（ｘ）の値を設定し、メモリ領域２７４からＡ−ＲＥＧ２０１に復号鍵を設定した状態で生成され、行列値演算部３０で生成された行列値は、メモリ５０の復号用行列領域に保持される。
ＣＲＣ用の行列値は、Ａ−ＲＥＧ２０１とＧ−ＲＥＧ２０２にメモリ領域２７１からｇ’（ｘ）の値を設定した状態で生成され、行列値演算部３０で生成された行列値は、メモリ５０のＣＲＣ用行列領域に保持される。
ここで、Ａ−ＲＥＧ２０１とＧ−ＲＥＧ２０２を、例えば、ＣＲＣ演算用のパラメータ長に合わせて３２ビット長とした場合、ＣＲＣ用の行列値は、これらのレジスタへの１回のパラメータロードで計算できる。しかしながら、ＥＣＣ演算のパラメータは、ＣＲＣ演算用のパラメータよりも長いため、ＥＣＣ暗号化用および復号化用の行列値は、後述するように、メモリ２７から既約多項式ｇ（ｘ）と暗号化鍵をそれぞれ３２ビット単位で分割して読み出し、レジスタ２０１、２０２の設定パラメータを切替えながら、行列値演算を複数回繰り返すことによって生成される。
送信データ暗号化モードでは、バッファメモリのＴｘ−ＢＵＦ領域から３２ビットのサブブロック単位で読み出した送信データをＢ−ＲＥＧ２０３に供給し、送信データ暗号化に必要な部分行列値をメモリ５０からＭ−ＲＥＧ５１にロードして、積和演算部４０を起動する。この場合、Ｂ−ＲＥＧ２０３に設定された１つのデータブロックに対して、Ｍ−ＲＥＧ５０の内容を切替えながら、複数回の積和演算が繰り返される。
積和演算部４０の演算結果は、Ｃ−ＲＥＧレジスタ２０４に出力される。Ｃ−ＲＥＧレジスタ２０４に出力された演算結果は、Ｃ−ＭＥＭ５２に中間演算値として保持される。Ｃ−ＭＥＭ５２は、ＥＣＣ符号長に応じたビット数の記憶容量を有し、積和演算サイクル毎に、ＥＯＲ加算回路５３によって、新たな演算結果が部分行列と対応した中間演算値に加算される。
ＥＣＣ符号長に相当する複数サブブロック分の送信データについて暗号化演算処理が完了すると、Ｃ−ＭＥＭ５２の内容が暗号化データとして読み出され、バッファメモリ２６のＴｘ−ＥＮＣ領域２６２Ａに転送される。
上述した積和演算の繰り返しによって、Ｔｘ−ＢＵＦ領域に格納された１メッセージ分の暗号化処理が完了すると、動作モードが送信データ誤り符号化モード（ＣＲＣ演算モード）に切り替えられる。
送信データ誤り符号化モードでは、ＭＡＴ−ＭＷＯ５０からＭ−ＲＥＧ５１にＣＲＣ用の行列値をロードした状態で、バッファメモリ２６のＴｘ−ＥＮＣ領域２６２Ａから、３２ビット単位で暗号化データブロックを読み出し、Ｂ−ＲＥＧレジスタ２０３と送信部１１に転送する。但し、送信データが暗号化を必要としない場合は、バッファメモリ２６のＴｘ−ＢＵＦ領域２６１Ａから読み出されたデータブロックがＢ−ＲＥＧレジスタ２０３と送信部１１に供給される。
積和演算部４０は、Ｂ−ＲＥＧレジスタ２０３のデータブロックとＭ−ＲＥＧ５１が示すＣＲＣ用行列値との積和演算を実行し、演算結果をＣ−ＲＥＧレジスタ２０４に出力する。この場合、Ｃ−ＲＥＧレジスタ２０４に出力された演算結果は、既に供給済みのデータブロックに付加すべきＣＲＣ符号として、バス２９を介して送信部１０に転送される。
受信データ誤り検出モードでは、バッファメモリ２６のＲｘ−ＣＲＣ領域２６３Ｂから読み出した受信データを対象として、積和演算部４０により、Ｂ−ＲＥＧレジスタ２０３のデータブロックとＭ−ＲＥＧ５１のＣＲＣ用行列値との積和演算を実行する。
この場合、Ｒｘ−ＣＲＣ領域２６３Ｂには、３２ビットのデータブロック毎に３２ビットのＣＲＣ符号ブロックを付加した形で、受信データが格納されている。従って、受信データの誤りの有無は、例えば、第１サイクルで３２ビットのデータブロックを読み出してＣＲＣ：ｒ（ｘ）を生成し、第２サイクルで、上記データブロックに続く３２ビットのＣＲＣ符号ブロックを読み出してＣＲＣ：ｒ’（ｘ）を生成し、ｒ’（ｘ）とｒ（ｘ）の一致を確認することによって判定できる。
上記ｒ’（ｘ）とｒ（ｘ）との一致検出は、一致検出回路５４で行われ、検出結果が制御部７０に通知される。制御部７０は、誤り検出を終えたデータブロックをバッファメモリのＲｘ−ＥＮＣ領域２６２Ｂ（非暗号化データブロックの場合はＲｘ−ＢＵＦ領城２６１Ｂ）に転送し、誤りのあるデータブロックは廃棄する。
暗号データ復号化モードでは、Ｒｘ−ＥＮＣ領域２６２Ｂから読み出したデータブロックを対象として、積和演算部４０で送信データ暗号化モードと同様の演算を行う。復号化されたデータは、Ｃ−ＭＥＭ５２からＲｘ−ＢＵＦ領域２６１Ｂに転送される。
第５図は、行列値演算部３０で生成される行列Ｍの１例を示す。
第４図の実施例では、行列値演算部３０が３２×３２サイズの行列を生成するものとして説明したが、ここでは、簡単化のために、８×８の行列を示す。ｂ０〜ｂ７は、Ｂ−ＲＥＧ２０３に設定されるデータビット、ｃ０〜ｃ７は、演算結果としてＣ−ＲＥＧ２０４に出力されるＣＲＣまたはＥＣＣのビットを示している。
行列Ｍの第１列の値（ｍ００〜ｍ７０）は、多項式ａ（ｘ）の各ビットの値（ａ０〜ａ７）で決まる。
第２列以降の値（ｍ０１〜ｍ７７）は、基本的には
2004001701.tif 000019
の関係にあり、各列の第１行目の値（ｍ０１、ｍ０２、ｍ０３…ｍ０７）は、
2004001701.tif 000020
の関係にある。ここで、ｍ（ｍａｘ，ｊ−１）は、第ｊ−１列の最終行の行列値を意味している。
ここで、多項式ｇ（ｘ）の値は、規格で定められた固定値となる。また、ＥＣＣ暗号化／復号化の場合、多項式ａ（ｘ）は暗号鍵であり、或る期間内では固定の値（半固定値）となる。また、誤り検出の場合に、ａ（ｘ）に代えて使用される多項式ｇ’（ｘ）は、完全な固定値である。従って、これらのパラメータから生成される行列Ｍは、固定または半固定値となるため、行列値演算部３０で一度算出しておけば、演算結果を繰り返して利用できる。
行列演算部３０と積和演算部４０の行列演算能力は、ハードウェアの制約から、例えば、１６×１６または３２×３２のように限られたサイズ（以下、基本サイズと言う）となる。基本サイズより大きいｎ×ｎサイズの行列Ｍを扱うためには、行列Ｍを基本サイズをもつ複数の部分行列に分割し、部分行列毎の演算動作を繰り返す必要がある。
第６図は、ｎ×ｎの行列Ｍを部分行列Ｍ（０，０）〜Ｍ（Ｉ，Ｊ）に分割した例を示す。
ここで、例えば、最初の部分行列Ｍ（０，０）における第２列（データビットｂ１列）の第１行（演算結果ｃ０の行）の行列値ｍ（０，１）は、行列Ｍの左下に位置した部分行列Ｍ（Ｉ，０）における第１列（データビットｂ０の列）の最終行の行列値ｍ（ｎ−１，０）に依存している。図面では省略されている次の部分行列Ｍ（１，０）における第２列第１行の行列値ｍ（ｋ，１）は、上記最初の部分行列Ｍ（０，０）における第１列最終行の行列値ｍ（ｋ−１，０）に依存している。また、行列Ｍ全体における第１列（データビットｂ０の列）を除いて、各列では、行列Ｍの第１行目（演算結果ｃ０の行）の値が後続する全ての行（演算結果ｃ１〜ｃｎ−１の行）に反映されている。
従って、行列演算部３０で部分行列毎に行列値を生成する場合は、これらの境界条件を考慮したパラメータ設定が必要となる。
第７図は、１６０×１６０ビットの行列を３２×３２の基本サイズをもつ複数ブロックに分割した場合の部分行列Ｍ（０，０）〜Ｍ（４，４）の配列と、入力データ（Ｂ０１〜Ｂ１５９）、出力符号（Ｃ０１〜Ｃ１５９）の関係を示す。
このような部分行列を扱う場合、積和演算部４０には、入力データ（Ｂ０１〜Ｂ１５９）が３２ビット単位のデータブロックＤ−０〜Ｄ−４分割した形で入力され、出力符号（Ｃ０１〜Ｃ１５９）が３２ビット単位の符号ブロックＥＣＣ−０〜ＥＣＣ−４に分割した形で出力されることになる。
第８図は、ＥＣＣ行列値を３２×３２ビットの部分行列毎に生成するようにした行列値演算部３０の１実施例を示す。
行列値演算部３０は、Ａ−ＲＥＧ２０１およびＧ−ＲＥＧ２０２の各ビットと対応して用意された複数のＡＮＤ回路３１−ｉ、第１のセレクタ群３３−ｉおよび排他論理和（ＥＯＲ）回路３２−ｉ（ｉ＝０〜ｋ、ｋ＝３１）と、これらのＥＯＲ回路の出力値を保持するための複数ビットの記憶領域３５−ｉ（ｉ＝０〜ｋ）をもつレジスタ３５とからなる。
ＥＯＲ回路３２−ｉの第１入力には、制御部７０からの制御信号Ｓ０で制御されるセレクタ３３−ｉを介して、Ａ−ＲＥＧ２０１の第１ビットの値ａｉとＡＮＤ回路３１−ｉの出力値の何れかが選択的に供給される。最初のＥＯＲ回路３２−０を除いて、ＥＯＲ回路３２−ｉ（ｉ＝１〜ｋ）には、レジスタ３５に保持された前列前行の行列値ｍ（ｉ−１，ｊ−１）が第２入力として供給される。最初のＥＯＲ回路３２−０の第２入力には、制御部７０からの制御信号Ｓ２で制御されるセレクタ３７を介して、固定値“０”またはレジスタ３５の最終ビット記憶領域３５−ｋに保持された前列最終行の行列値ｍ（３１，ｊ−１）が供給される。
セレクタ３３−０から出力される部分行列第１行目の行列値は、制御部７０からの制御信号Ｓ３で指定される所定のタイミングで、ラッチ回路３４に保持される。
ＡＮＤ回路３１−ｉには、Ｇ−ＲＥＧ２０２の第ｉビットの値ｇｉが第１入力として供給される。最初のＡＮＤ回路３１−０の第２入力には、セレクタ３６−０を介して、前列最終行の行列値ｍ（３１，ｊ−１）と上記ラッチ回路３４に保持された部分行列第１行目の行列値の何れかが供給される。他のＡＮＤ回路３１−ｉ（ｉ＝１〜ｋ）の第２入力には、セレクタ３６−ｉを介して、セレクタ３３−０の出力値またはラッチ回路３４に保持された部分行列第１行目の行列値の何れかが供給される。セレクタ３６−０〜３６−ｋは第２のセレクタ群を構成しており、制御部７０からの制御信号Ｓ１で制御される。
本実施例では、ＣＲＣ用行列演算とＥＣＣ用行列演算に共用するために、行列値演算部３０が、ＥＯＲ回路３２−ｉの出力ビットを保持するためのシフトレジスタ（ＳＨＩＦＴ）３８−ｉと、シフトレジスタ３８−ｉの出力値とレジスタ領域３５−ｉの出力値の何れかを選択して次行ＥＯＲ回路３２−（ｉ＋１）に供給する第３のセレクタ群３９−ｉ（ｉ＝０〜ｋ）を備えている。第３のセレクタ群は、制御信号Ｓ１で制御される最後のセレクタ３９−ｋを除いて、制御信号Ｓ４に応じてＡポート、Ｂポートの何れかの入力を選択する。
ＣＲＣ用の行列値を生成する場合、制御部７０は、セレクタ３７と第２セレクタ群３６−０〜３６−ｋと第３のセレクタ群３８−０〜３８−ｋが常時Ａポート入力を選択するように、制御信号Ｓ１、Ｓ２、Ｓ４を出力する。また、第１セレクタ群３３−０〜３３−ｋが、行列Ｍの第１列目の行列値演算サイクルではＡポート入力（Ａ−ＲＥＧ出力）、第２列〜第ｋ列（ｋ＝３１）の行列値演算サイクルではＢポート入力（ＡＮＤ回路３１−ｉの出力）を選択するように、制御信号Ｓ０が切替えられる。
従って、第１列目の行列値演算サイクルでは、ＥＯＲ回路３２−ｉ（ｉ＝０〜ｋ）から、Ａ−ＲＥＧ２０１が示す各ビットの値ａ０〜ａ３１が生成される。これらのビット値は、レジスタ３５の各記憶領域３５−０〜３５−ｋに設定された後、ＭＡＴ−ＭＥＭ５０のＣＲＣ用行列領域、図示した例ではＭ（０，０）の第１列目に記憶される。
次の、第２列目の行列値演算サイクルでは、第１行目のセレクタ３３−０から、セレクタ３６−０で選択された記憶領域３５−ｋが示す前サイクル最終行の行列値ａ３１とＧ−ＲＥＧ２０２が示す第１ビットの値ｇ０との間の論理積を示す値（ｍ０、１）が出力され、ＥＯＲ回路３２−０に入力される。上記値ｍ０、１は、第２のセレクタ群３６−ｉ（ｉ＝１〜ｋ）を介して他のＡＮＤ回路３１−ｉにも入力される。従って、第１行目以降のセレクタ３３−ｉからは「ｇｉ・ｍ０、１」を示す値が出力され、ＥＯＲ回路３２−ｉから式（１４）が示す行列値が出力される。
第２列目〜第ｋ列目の各演算サイクルで、上記と同様の演算動作を繰り返すことによって、ＣＲＣ用行列領域Ｍ（０，０）に式（１４）、（１５）に従った行列値を生成することができる。
一方、ＥＣＣ用の行列値を生成する場合は、第３のレジスタ群３９−ｉ（ｉ＝０〜ｋ）にＢポート入力を選択させた状態で、Ａ−ＲＥＧ２０１の設定パラメータを入れ替えながら、行列Ｍの第１列目の行列値演算サイクルが繰り返される。これらの演算サイクルで、レジスタ３５にａ０〜ａ３１、ａ３２〜ａ６３、…ａ１２８〜ａ１５９の値が次々と生成され、部分行列Ｍ（０，０）、Ｍ（１，０）、…Ｍ（４，０）の第１列目に記憶される。
この時、最初のシフトレジスタ３８−０には、ａ０、ａ３２、ａ６４、ａ９６、ａ１２８のビット値が保持され、次のシフトレジスタ３８−１には、ａ１、ａ３３、ａ６５、ａ９７、ａ１２９のビット値、最後のシフトレジスタ３８−ｋには、ａ３１、ａ６３、ａ９２、ａ１２７、ａ１５９のビット値が保持された状態となる。
第１列目の行列値演算が終了すると、制御信号Ｓ０と制御信号Ｓ２によって、第１セレクタ群３３−ｉとセレクタ３７がそれぞれのＢポート入力を選択するように切替える。この時点では、レジスタ３５の記憶領域３５−ｋには、行列値ｍ３１、ｊ−１としてパラメータ値“ａ１５９”が設定されている。
以下、Ｇ−ＲＥＧ２０２の設定値を入れ替えながら、部分行列Ｍ（０，０）、Ｍ（１，０）、…Ｍ（４，０）の第１列目の行列値演算サイクルを繰り返す。
Ｇ−ＲＥＧ２０２に第１ブロックのパラメータ値ｇ０〜ｇ３１を設定した演算サイクルでは、制御信号Ｓ１の切替えによって、第２セレクタ群３６−ｉと、第２セレクタ群の最後のセレクタ３９−ｋにＡポート入力を選択させ、セレクタ３３−０の出力値“ｇ０・ａ１５９”を他の行のＡＮＤ回路３１−ｉに入力する。また、制御信号Ｓ３で与えるラッチ指令によって、上記セレクタ３３−０の出力値“ｇ０・ａ１５９”をラッチ回路３４に記憶する。この時、ＥＯＲ回路３２−ｊには、シフトレジスタ３８−（ｊ−１）から出力された前列前行のビット値ｍ（０，ｊ−１）が入力されるため、式（１４）、（１５）に従った第２行目の行列値ｍ０，１〜ｍ３１、１が生成され、これらの値が、シフトレジスタ３８−０〜３８−ｋとＭＡＴ−ＭＥＭ５０のＥＣＣ用部分行列Ｍ（０，０）の第２列目に記憶される。
Ｇ−ＲＥＧ２０２に第１ブロック（ｇ３２〜ｇ６３）〜第４ブロック（ｇ１２７〜ｇ１５９）のパラメータ値を設定した状態で行われる各演算サイクルでは、制御信号Ｓ１との切替えによって、第２セレクタ群３６−ｉと、第３セレクタ群の最後のセレクタ３８−ｋにＢポート入力を選択させる。すなわち、部分行列Ｍ（１，０）〜Ｍ（４，０）の行列値に、上記ラッチ回路３４に記憶された“ｇ０・ａ１５９”を反映させる。これによって、式（１４）、（１５）に従った第１行目の行列値（ｍ３２，１〜ｍ６３、１）〜（ｍ１２７，１〜ｍ１５９、１）が次々と生成され、ＭＡＴ−ＭＥＭ５０の部分行列Ｍ（１，０）〜Ｍ（４，０）の第２列目に記憶される。
部分行列Ｍ（０，０）、Ｍ（１，０）、…Ｍ（４，０）の第３列目〜第３２列目の行列値は、上述した第２列目と同様の手順を繰り返すことによって生成でされる。残りの部分行列Ｍ（０，１）、Ｍ（１，１）、…Ｍ（４，４）では、第１列から第３２列までの全ての行列値演算にＧ−ＲＥＧ２０２の設定値を利用し、部分行列Ｍ（０，０）、Ｍ（１，０）、…Ｍ（４，０）の第２列目以降の演算サイクルと同様の手順を繰り返す。
第９図は、第８図に示した行列値演算部３０を制御対象として制御部７０が実行するＣＲＣ行列値生成ルーチン１００の１実施例を示す。
ＣＲＣ行列値生成ルーチン１００では、列を指定するためのパラメータｉを初期値０、最後の列を示すパラメータｊｍａｘの値を「３１」に設定（ステップ１０１）した後、メモリ領域２７１から読み出したｇ’−ＣＲＣの値をＡ−ＲＥＧ２０１とＧ−ＲＥＧ２０２にロードする（ステップ１０２、１０３）。次に、制御信号Ｓ１〜Ｓ４の発生パターンを単一行列モードに設定する。ここで、単一行列モードは、行列値の演算が基本サイズ３２×３２ビットの単一の部分行列で完了することを意味しており、このモードでは、制御信号Ｓ１、Ｓ２、Ｓ４は、第２、第３のセレクタ群３６−ｉ、３９−ｉ（ｉ＝０〜ｋ）とセレクタ３７に常時Ａポート入力を選択させた状態となり、制御信号Ｓ３は、ラッチ信号を全く発生しない状態となる。
先ず、制御信号Ｓ０によって、第１セレクタ群３３−ｉ（ｉ＝０〜ｋ）にＡ−ＲＥＧ２０１の出力（Ａポート入力）を選択させ（１０５）、ＥＯＲ回路３２−ｉ（ｉ＝０〜ｋ）により第ｊ列の行列値を演算する（１０６）。ＥＯＲ回路から出力された第ｊ列の演算結果は、レジスタ３５に保持した後、ＭＡＴ−ＭＥＭ５０に定義されたＣＲＣ用の行列領域に記憶する（１０７）。制御信号Ｓ０の状態を切替えて、第１セレクタ群３３にＧ−ＲＥＧ２０２の出力（Ｂポート入力）を選択させる（１０８）。
次に、パラメータｊの値をインクリメントし（１０９）、ｊの値をｊｍａｘと比較する（１１０）。ｊ＞ｊｍａｘとなっていた場合は、このルーチンを終了し、そうでなければ、パラメータｊが示す次列の行列値をＥＯＲ回路３２−ｉにより演算し（１１１）、第ｊ列の演算結果をＣＲＣ用の行列領域に記憶する（１１２）。この後、ステップ１０９に戻り、ｊ＞ｊｍａｘとなる迄、同様の動作を繰り返す。
ＣＲＣ用の行列Ｍのサイズは、行列値演算部３０が扱う基本サイズとなっているため、上述したように、ｊ＝０〜ｊｍａｘの行列値の演算を繰り返すことによって、積和演算部４０が必要とする全ての行列値を生成できる。
第１０図は、第８図に示した行列値演算部３０を制御対象として制御部７０が実行するＥＣＣ行列値生成ルーチン１２０の１実施例を示す。
ＥＣＣ行列値生成ルーチン１２０では、図７に示した部分行列Ｍ（Ｉ，Ｊ）を特定するためのパラメータＩ、Ｊの値と、部分行列Ｍ（Ｉ，Ｊ）内での列番号を指定するためのパラメータｊの値を初期値０に設定し、パラメータＩとＪの最大値ＩｍａｘとＪｍａｘを４、ｊの最大値ｊｍａｘを３１に設定する（１２１）。
次に、制御信号Ｓ１、Ｓ２、Ｓ３、Ｓ４の発生パターンを部分行列モードに設定する。ここで、部分行列モードは、行列値の演算が複数の部分行列に分割して実行されることを意味しており、このモードでは、制御信号Ｓ１は、第２セレクタ群３６−ｉ（ｉ＝０〜ｋ）とセレクタ３９−ｋが、部分行列Ｍ（０，Ｊ）の演算サイクルではＡポート入力、その他の部分行列Ｍ（Ｉ，Ｊ）（但し、Ｉ＝１〜４）の演算サイクルではＢポート入力を選択するように切替えられ、制御信号Ｓ２は、セレクタ３７が、部分行列Ｍ（Ｉ，０）（但し、Ｉ＝０〜４）の第１列の演算サイクルではＡポート入力、その後はＢポート入力を選択するように切替えられる。
また、制御信号Ｓ３は、部分行列Ｍ（０，Ｊ）の各列の演算サイクルでラッチ信号を発生し、ラッチ回路３４にセレクタ３３−０の出力値を保持させる。ラッチ回路３４の出力値は、部分行列Ｍ（１，Ｊ）〜Ｍ（４，Ｊ）の演算サイクルでは不変となる。制御信号Ｓ４は、第３セレクタ群３９−ｉ（ｉ＝０〜ｋ−１）に常時、Ａポート入力を選択させる。
先ず、制御信号Ｓ０によって、第１セレクタ群３３−ｉ（ｉ＝０〜ｋ）にＡ−ＲＥＧ２０１の出力（Ａポート入力）を選択させ（１２３）、メモリ２７のＥ−ＫＥＹ領域２７３からＡ−ＲＥＧ２０１に暗号鍵の第ＩブロックＫＥＹ（Ｉ）をロードする（１２４）。この時、ＥＯＲ回路３２−ｉ（ｉ＝０〜ｋ）は、ＫＥＹ（Ｉ）が示す３２ビットのパラメータに従って、部分行列Ｍ（Ｉ，Ｊ）の第１列の行列値を演算する（１２５）。この演算結果は、シフトレジスタ３８とレジスタ３５に保持した後、ＭＡＴ−ＭＥＭ５０に定義されたＥＣＣ用部分行列領域Ｍ（Ｉ，Ｊ）の第ｊ列に記憶される（１２６）。
次に、パラメータＩの値をインクリメントし（１２７）、Ｉの値をＩｍａｘと比較する（１２８）。Ｉ＞Ｉｍａｘでなければ、ステップ１２４に戻って、Ｅ−ＫＥＹ領域２７３から暗号鍵の次のブロックＫＥＹ（Ｉ）をＡ−ＲＥＧ２０１にロードし、同様の動作を繰り返す。
Ｉ＞Ｉｍａｘとなった場合は、制御信号Ｓ０の状態を切替えて、第１セレクタ群３３にＧ−ＲＥＧ２０２の出力（Ｂポート入力）を選択させ（１３０）、パラメータＩを初期値０に戻し、パラメータｊの値をインクリメントする（１３３）。
次に、パラメータｊの値をｊｍａｘと比較し（１３４）、ｊ＞ｊｍａｘでなければ、メモリ２７のｇ−ＥＣＣ領域２７２からＡ−ＲＥＧ２０１に多項式ｇ（ｘ）の第Ｉブロックｇ−ＥＣＣ（Ｉ）をロードする（１３５）。これによって、ＥＯＲ回路３２−ｉ（ｉ＝０〜ｋ）で、ｇ−ＥＣＣ（Ｉ）が示す３２ビットのパラメータに従った部分行列Ｍ（Ｉ，Ｊ）の第ｊ列の行列値が演算される（１３６）。演算結果は、レジスタ３５に保持した後、ＭＡＴ−ＭＥＭ５０に定義されたＥＣＣ用部分行列領域Ｍ（Ｉ，Ｊ）の第ｊ列に記憶される（１３７）。
次に、パラメータＩの値をインクリメントし（１３８）、Ｉの値をＩｍａｘと比較する（１３９）。Ｉ＞Ｉｍａｘでなければ、ステップ１３５に戻って、Ｅ−ＫＥＹ領域２７３からｇ（ｘ）の次のブロックｇ−ＥＣＣ（Ｉ）をＡ−ＲＥＧ２０１にロードし、同様の動作を繰り返す。ステップ１３９でＩ＞Ｉｍａｘとなった場合は、ステップ１３３に戻り、パラメータＩを初期値０に戻し、パラメータｊの値をインクリメントして、次列の行列値について上記と同様の手順を繰り返す。
ステップ１３４でｊ＞ｊｍａｘとなった場合、ステップ１４０に進み、パラメータｊとＩの値を初期値０に戻し、パラメータＪの値をインクリメントする。これによって、次列の部分行列Ｍ（Ｉ，Ｊ）が演算対象となる。パラメータＪの値をＪｍａｘと比較し（１４１）、Ｊ＞Ｊｍａｘとなっていた場合は、このルーチンを終了する。Ｊ＞Ｊｍａｘでなければ、ステップ１３５に進む。これによって、部分行列Ｍ（０，Ｊ）〜Ｍ（４，Ｊ）内の第１列から第３２列について、上述した行列値の演算動作が繰り返される。
尚、上記ステップ１３３〜１４１の実行過程で、部分行列Ｍ（０，Ｊ）の各列の演算サイクルで、制御信号Ｓ３で与えるラッチ指令によって、行列Ｍの第１行目の行列値がラッチ回路３４に保持され、この値が後続する部分行列Ｍ（１，Ｊ）〜Ｍ（４，Ｊ）の各演算サイクルでＡＮＤ回路３１−０〜３１−ｋに供給される。また、第８図に示した第１行のＥＯＲ回路３２−０には、レジスク３５の最後の記憶領域３５−ｋから出力される前列最終行の行列値が供給されているため、第６図で説明した部分行列間の境界条件を満たすことができる。
以上、ＥＣＣ暗号化用の行列値生成ルーチンについて説明したが、ブロックＫＥＹ（Ｉ）として、メモリ２７のＤ−ＫＥＹ領域から読み出した復号鍵を適用すれば、ルーチン１２０と同様の制御手順でＥＣＣ復号化用の行列値を生成できる。
第１１図の（Ａ）と（Ｂ）は、積和演算部４０を制御対象として制御部７０が実行する送信データ処理ルーチン２００と受信データ処理ルーチン３００のフローチャートを示す。
送信データ処理ルーチン２００は、バッファメモリ２６のＴｘ−ＢＵＦ領域２６１Ａから読み出した送信データ（送信メッセージ）の暗号化処理（２１０）と、Ｔｘ−ＥＮＣ領域２６２Ａから読み出した暗号化データについてのＣＲＣ生成／送信処理（２３０）とからなる。但し、送信データの暗号化が不要の場合は、Ｔｘ−ＢＵＦ領域２６１Ａから読み出した送信データを処理対象として、ＣＲＣ生成／送信処理（２３０）が実行される。
一方、受信データ処理ルーチン３００は、バッファメモリ２６のＲｘ−ＣＲＣ領域２６３Ｂに蓄積された受信データについてのＣＲＣ生成処理（３１０）と、ＣＲＣチェック（３２０）の結果、誤りなしと判定された受信データを対象とした復号化処理（３３０）とからなる。復号化処理（３３０）では、受信データが暗号化データか否かを判定し、暗号化データでなければ、受信データをそのままＲｘ−ＢＵＦ領域１６１Ｂに転送し、暗号化データの場合には、これを復号化した後、Ｒｘ−ＢＵＦ領域１６１Ｂに転送する。ＣＲＣチェックの結果、誤りが検出された受信データについては、例えば、上位装置であるコアプロセッサ１０へのエラー通知などのエラー処理（３５０）が実行される。
上記送信データ処理ルーチン２００と受信データ処理ルーチン３００は、メッセーシ単位で交互に実行される。
第１２図は、送信データの暗号化処理２１０の１実施例を示すフローチャートである。
制御部７０は、Ｔｘ−ＢＵＦ領域２６１Ａから送信メッセージのヘッダ部を読み出し（２１１）、ヘッダ部が示すデータ長Ｌから、送信データを暗号化データのブロック長、この例では１６０ビット単位で分割した場合のブロック数Ｎｍａｘを計算し、暗号化処理の繰り返し回数を示すパラメータｎの値を初期値１に設定する（２１２）。本実施例では、ヘッダ部は暗号化の対象外とし、Ｔｘ−ＥＮＣ領域２６２Ａに転送する（２１３）。
先ず、部分行列Ｍ（Ｉ，Ｊ）を指定するためのパラメータＩ、Ｊの値を初期値０に設定し（２１４）、Ｔｘ−ＢＵＦ領域２６１Ａから、送信データのｎ番目のデータブロックを３２ビット単位で読み出し、Ｂ−ＲＥＧ２０３に転送する（２１５）。ここでは、Ｂ−ＲＥＧ２０３に読み出された３２ビットのデータブロックをＤ（ｎ）−Ｊで表す。最初に読み出されたデータブロックＤ（ｎ）−０は、第７図におけるデータＤ−０に相当し、その次に読み出されるデータブロックＤ（ｎ）−１は、データＤ−１に相当する。
次に、メモリ５０からＭ−ＲＥＧ５１に暗号化用の部分行列Ｍ（Ｉ，Ｊ）をロード（２１６）し、積和演算部４０を起動すると（２１７）、Ｃ−ＲＥＧ２０４に部分行列Ｍ（Ｉ，Ｊ）とデータＤ（ｎ）−Ｊとの積和演算結果が出力される。部分行列Ｍ（０，０）を使用した最初の積和演算では、第７図に示したＣ０〜Ｃ３１の値が求まる。この値は、ＥＣＣ符号の部分計算値に過ぎないため、Ｃ−ＭＥＭ５２のＥＣＣ−Ｉ領域の既演算値にＥＯＲ加算する（２１８）。Ｃ−ＭＥＭ５２には、部分行列Ｍ（Ｉ，Ｊ）のパラメータＪと対応して、３２ビット長の符号値記憶領域ＥＣＣ−０〜ＥＣＣ−４が用意してあり、各領域の初期値は０となっている。
パラメータＩの値をインクリメントし（２１９）、Ｉ＞４か否かを判定する（２２０）。Ｉの値が４以下であれば、ステップ２１６に戻り、上述した動作を繰り返す。これによって、データＤ−０と部分行列Ｍ（１，０）〜Ｍ（４，０）の積和演算が次々と実行され、演算結果Ｃ３２−Ｃ６３〜Ｃ１２８−Ｃ１５９がＣ−ＭＥＭ５２のＥＣＣ−１〜ＥＣＣ−４の既演算値にＥＯＲ加算される。
パラメータＩをインクリメントした結果、Ｉ＞４となった場合は、Ｉの値を初期値０に戻し、Ｊの値をインクリメントして（２２１）、Ｊ＞４か否かを判定する（２２２）。Ｊの値が４以下の場合は、ステップ２１５に戻って、Ｔｘ−ＢＵＦ領域２６１ＡからＢ−ＲＥＧ２０３に、送信データの次のブロックＤ（ｎ）−Ｊを転送し、ステップ２１５〜２２２の動作を繰り返す。Ｊの値が４を超えるまで、上述した動作を繰り返すことによって、第７図に示したデータＤ−１と部分行列Ｍ（０，１）〜Ｍ（４，１）、データＤ−２と部分行列Ｍ（０，２）〜Ｍ（４，２）、データＤ−３と部分行列Ｍ（０，３）〜Ｍ（４，３）、データＤ−４と部分行列Ｍ（０，４）〜Ｍ（４，４）の積和演算が次々と実行され、各積和演算の結果がＣ−ＭＥＭ５２のＥＣＣ−０〜ＥＣＣ−４に次々とＥＯＲ加算される。
パラメータＪの値がＪ＞４となった時、Ｃ−ＭＥＭ５２の内容（ＥＣＣ−０〜ＥＣＣ−４）は、１６０ビット長送信データについての暗号化結果を示している。従って、Ｃ−ＭＥＭ５２の内容をバッファメモリのＴｘ−ＥＮＣ領域２６２Ａに転送し（２２３）、Ｃ−ＭＥＭ５２のＥＣＣ−０〜ＥＣＣ−４をクリア（２２４）した後、パラメータｎの値をインクリメントする（２２５）。ｎの値を最大値Ｎｍａｘと比較し（２２６）、ｎ＞Ｎｍａｘでなければ、ステップ２１４に戻って、次の１６０ビット長の送信データＤ（ｎ）を対象として、暗号化処理を繰り返す。ｎ＞Ｎｍａｘとなった時点で、１つの送信メッセージの暗号化が完了する。
第１３図は、ＣＲＣ生成／送信処理（２３０）の１実施例を示すフローチャートである。
ＣＲＣ生成／送信処理（２３０）では、Ｔｘ−ＥＮＣ領域２６２Ａから３２ビット単位で暗号化データを読み出して、ＣＲＣを生成する。ここでは、暗号化された送信データを対象として説明するが、送信メッセージを暗号化することなく送出する場合は、Ｔｘ−ＢＵＦ領域２６１ＡのデータをＣＲＣの生成対象とすればよい。
先ず、Ｔｘ−ＥＮＣ領域２６２Ａから送信メッセージのヘッダ部を読み出し、送信部１１に転送する（２３１）。次に、暗号化データの長さＫを３２ビット単位で読み出した場合のデータブロック数Ｎｍａｘを計算し、処理の繰り返し回数を示すパラメータｎの値を初期値“１”に設定する（２３２）。
メモリ５０からＭ−ＲＥＧ５１にＣＲＣ用の行列値Ｍをロード（２３３）した後、Ｔｘ−ＥＮＣ領域２６２Ａから暗号化送信データの最初のデータブロックＤ（ｎ）を読み出し、送信部１１とＢ−ＲＥＧ２０３に転送する（２３４）。この状態で積和演算部４０を起動すると（２３５）、Ｃ−ＲＥＧ２０４にＣＲＣ用行列ＭとデータＤ（ｎ）との積和演算結果Ｃ０〜Ｃ３１が出力される。
ＣＲＣ生成の場合、積和演算部４０の一回の起動でデータブロックＤ（ｎ）に付加すべきＣＲＣ符号が生成できるため、Ｃ−ＲＥＧ２０４の内容を送信部１１に送信し（２３６）、パラメータｎの値をインクリメントして（２３７）、ｎの値をＮｍａｘと比較する（２３８）。ｎがＮｍａｘ以下の場合はステップ２３４に戻って、Ｔｘ−ＥＮＣ領域２６２Ａから次のデータブロックＤ（ｎ）を読み出し、上述した動作を繰り返し、ｎ＞Ｎｍａｘとなった時、１メッセージ分のＣＲＣ生成処理を終了する。
第１１図に示した受信データ処理ルーチン３００におけるＣＲＣ生成処理３１０は、第１３図で説明した送信データのＣＲＣ生成ルーチンにおいて、読み出すべきデータブロックの記憶領域をＴｘ−ＥＮＣ領域２６２ＡからＲｘ−ＣＲＣ領域２６３Ｂに変更し、ヘッダとデータブロックとＣＲＣの転送先を送信部１１からバッファメモリのＲｘ−ＥＮＣ領域２６２Ｂ（平文受信データの場合はＴｘ−ＢＵＦ領域２６１Ｂ）に変更すればよい。
また、受信データの復号化処理３３０は、Ｒｘ−ＥＮＣ領域２６２Ｂから読み出したデータブロックをメモリ５０からＭ−ＲＥＧ５１にロードした復号化用の部分行列で積和演算処理すればよいため、基本的には、第１２図で説明した送信データ暗号化ルーチンと同様の手順となる。
以上の実施例では行列値演算部３０で生成したＣＲＣ用、ＥＣＣ用の行列をメモリ（ＭＡＴ−ＭＥＭ）５０に格納しておき、ＣＲＣ生成とＥＣＣ暗号化／復号化処理を行う時、積和演算部４０が必要とする行列の値をＭＡＴ−ＭＥＭ５０からＭ−ＲＥＧ５１に適宜ロードするようにしたが、Ｍ−ＲＥＧ５１をＣＲＣ用、ＥＣＣ暗号化用、復号化用の専用レジスタとして用意しておき、行列値演算部３０で生成した行列値をこれらの専用レジスタに直接ロードするようにしてもよい。この場合、積和演算部４０に接続すべきＭ−ＲＥＧ５１を切替えることによって、ＣＲＣ生成とＥＣＣ暗号化／復号化処理を高速に行うことが可能になる。
また、実施例では、行列値演算部で生成する行列の基本サイズを３２×３２としたが、これを８×８、または１６×１６のように小型化した場合、ＣＲＣ用の行列も部分行列モードで生成することになる。この場合、ＣＲＣ行列値生成ルーチン１００に、第１０図で説明したＥＣＣ行列値生成ルーチン１２０と同様の制御手法を採用すればよい。
本発明によれば、予め用意した行列値を利用することによって、送受信データの誤り検出に必要なＣＲＣ符号を高速に生成できる。また、ＣＲＣ用の行列を生成する行列値演算部を利用して、ＥＣＣ暗号化用および復号化用の行列値を迅速に生成できる。従って、安全性を高めるために暗号鍵を適宜変更したい場合に、外部から暗号鍵データを与えて、制御部７０にＥＣＣ行列生成ルーチンを実行させることにより、暗号鍵に応じた新たな行列値を容易に生成することが可能となる。
【産業上の利用可能性】  本発明によれば、誤り検出符号生成と暗号化処理にハードウェア（行列値演算部と積和演算部）を共用できるため、コンパクトなパケット通信装置を提供できる。また、暗号化／復号化処理に必要な行列値をパケット通信装置内で生成できるため、暗号鍵変更が容易であり、送受信データの安全性を向上できる。
【図１】
2004001701.tif 000021
【図２】
2004001701.tif 000022
【図３】
2004001701.tif 000023
【図４】
2004001701.tif 000024
【図５】
2004001701.tif 000025
【図６】
2004001701.tif 000026
【図７】
2004001701.tif 000027
【図８】
2004001701.tif 000028
【図９】
2004001701.tif 000029
【図１０】
2004001701.tif 000030
【図１１】
2004001701.tif 000031
【図１２】
2004001701.tif 000032
【図１３】
2004001701.tif 000033
【国際調査報告】
2004001701.tif 000034
2004001701.tif 000035
2004001701.tif 000036
2004001701.tif 000037