(57)【要約】【課題】この発明の課題は、ナップザック暗号方式あるいは積和暗号方式を拡張して、別解攻撃に対し安全な、新規の公開鍵暗号化装置等を提供することにある。【解決手段】ナップザック暗号方式あるいは積和暗号方式を拡張して、暗号化において、公開鍵ベクトルa のいかなる成分ak とも平文m は積をとらなくて良いようにすることで、秘密鍵ベクトルs の下位ビットを公開する必要をなくし、公開鍵ベクトルa と乱数ベクトルr の内積に、平文m を独立した項として加算して暗号文C を生成する。【効果】別解攻撃に対して安全であり、かつ、暗号化を高速に行うことができる。【選択図】図１
2018092010.tif 000002
【特許請求の範囲】
【請求項１】
公開鍵を記憶するメモリと乱数発生器とを備えて、
乱数ベクトルr を前記乱数発生器により発生させ、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、内積 a・r  を求める演算器とを備え、
さらに前記内積 a・r と、平文m とを加算する加算器とを備え、
暗号文 C を、C = a・r + m により生成するように構成されている暗号化装置。
【請求項２】
公開鍵を記憶するメモリと乱数発生器とを備えて、
乱数ベクトルr を前記乱数発生器により発生させるステップと、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、演算器により、内積 a・r  を求めるステップと、
さらに前記内積 a・r と、平文m とを、演算器により、加算するステップ、とを実行することにより、
暗号文 C を、C = a・r + m により生成する暗号化方法。
【請求項３】
コンピュータからなる暗号化装置に、
乱数ベクトルr を発生させるステップと、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、内積 a・r  を求めるステップと、
さらに前記内積 a・r と、平文m とを、加算するステップ、とを実行させることにより、
暗号文 C を、C = a・r + m により生成する暗号化プログラム。
【請求項４】
乱数発生器を備えて、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを、前記乱数発生器により発生した乱数をもとに、生成させる秘密鍵生成手段と、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換する剰余乗算器、とを備えた鍵生成装置。
【請求項５】
乱数発生器を備えて、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを、前記乱数発生器により発生した乱数をもとに、生成させる秘密鍵生成ステップと、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換するステップ、とを実行することによる鍵生成方法。
【請求項６】
コンピュータからなる鍵生成装置に、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを生成させる秘密鍵生成ステップと、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換するステップ、とを実行させることにより鍵を生成する鍵生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、公開鍵暗号化装置等に関するものである。
【背景技術】
【０００２】
従来のナップザック暗号は、超増加数列等の特殊な数列をモジュラー乗算して公開鍵である数列としていた。しかしながらこのような公開鍵には元の特殊な数列の影響が残り、完全な乱数列とは言えない。そこで発明者らは、秘密鍵に完全な乱数列を使用するナップザック公開鍵暗号を提案した（特許文献１  特開２０１３ー１５２３８９）。またこの暗号では、0からZ未満、例えば1ビットの平文mを暗号化する。特許文献１での暗号システムの概要を以下に示す。
【０００３】
秘密鍵: ベクトルs; 素数P; 整数e
公開鍵: ベクトルa; b;法Z
鍵生成
Step 1: 公開鍵ベクトル a の次元 n と法 Z を決める。
Step 2: n次元の秘密鍵ベクトル s をランダムに生成する。
Step 3: 次式を満たす素数 P をランダムに生成する。
P > sum(s) > P/2    （sum(s)はベクトル s の成分の和）    (1)
Step 4: 次式を満たす整数 e をランダムに生成する。
e < P                     (2)  
Step 5: 次式により秘密鍵ベクトル s から公開鍵ベクトル a を得る。
a = e s mod P                  (3)
Step 6: 法 Z とn次元の公開鍵ベクトル b を公開する
b = s mod Z                   (4)
【０００４】
暗号化
Step 1: 0〜Z-1 までの数から成る平文を m とする。
Step 2: 2 進乱数ベクトル r ∈ {0,1}n を
m = b・r mod Z  （b・r はベクトル b とベクトル r の内積）  (5)
を満たすようにランダムに生成する。
Step 3: 暗号文 C を
C = a・r                      (6)
により計算する。
【０００５】
復号
中間平文 M を M = s・r で定義する。
Step 1: 次式により中間平文M を計算する。
M = e-1 C mod P                (7)
Step 2: 平文m を次式により計算する。
m = M mod Z                  (8)
M = s・r = e-1 C mod P  が成立し、s ≡ b (mod Z) より、M ≡ b・r (mod Z) が成立する。したがって式(8) が成立する。
【０００６】
別解攻撃 
式(6)での乱数ベクトルの成分は0か1である。0と1に制限されない成分から成り、式(6)を満たす解を別解と呼ぶことにする。長尾と森井は、式(6)の別解から平文mを求める手法（別解攻撃）を発表した。r' を  C = a・r' を満たす別解とすると、r' は成分が整数のn次元ベクトルである。r' が暗号化に用いた2進乱数ベクトル r ∈ {0,1}n と異なっていても、解読条件
M = s・r'                  (9)
を満たす場合には、平文 m を
m = b・r' mod Z                (10)
として求めることができることを、長尾らは発見した（非特許文献２）。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１３ー１５２３８９号公報
【非特許文献】
【０００８】
【非特許文献１】"ナップザック暗号における高密度化手法に関する考察",CSS2013, CSS2013_1C2-4.pdf, Oct. 2013
【発明の概要】
【発明が解決しようとする課題】
【０００９】
発明者は考察を重ねた結果、別解攻撃による解読要因は別解が求まることにあるのではなく、秘密鍵s の下位側ビットから成るベクトルb を公開していることにあることを導いた。即ち、仮に別解が求められても、秘密鍵s の下位側ビットから成るベクトルが与えられていなければ、別解r' から平文m は求めることができない。そこで発明者は、平文m を、公開鍵との積をとることなく、独立した項として加算することにより、秘密鍵s の下位側ビットから成るベクトルを公開しなくても良いように、特許文献１の暗号システムを改良できることを発見した。
【００１０】
この発明の課題は、ナップザック暗号方式あるいは積和暗号方式を拡張して、平文を、公開鍵との積をとることなく、独立した項として加算することにより、別解攻撃に対し安全であり、かつ、高速に暗号化可能な、新規の公開鍵暗号化装置等を提供することにある。
【課題を解決するための手段】
【００１１】
この発明は、公開鍵を記憶するメモリと乱数発生器とを備えて、
乱数ベクトルr を前記乱数発生器により発生させ、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、内積 a・r  を求める演算器とを備え、
さらに前記内積 a・r と、平文m とを加算する加算器とを備え、
暗号文 C を、C = a・r + m により生成するように構成されている暗号化装置にある。
【００１２】
またこの発明は、公開鍵を記憶するメモリと乱数発生器とを備えて、
乱数ベクトルr を前記乱数発生器により発生させるステップと、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、演算器により、内積 a・r  を求めるステップと、
さらに前記内積 a・r と、平文m とを、演算器により、加算するステップ、とを実行することにより、
暗号文 C を、C = a・r + m により生成する暗号化方法にある。
【００１３】
またこの発明は、コンピュータからなる暗号化装置に、
乱数ベクトルr を発生させるステップと、
前記乱数ベクトルr と、公開鍵ベクトルa とにより、内積 a・r  を求めるステップと、
さらに前記内積 a・r と、平文m とを、加算するステップ、とを実行させることにより、
暗号文C を、C = a・r + m により生成する暗号化プログラムにある。
【００１４】
この発明では、乱数ベクトルr として2値ベクトルを使用した場合、C = a・r + m は公開鍵ベクトルa の成分のいくつかと平文m を加算することにより計算することができる。また乱数ベクトルr として正整数ベクトルを使用した場合、整数の積和演算（整数ベクトルの内積）により a・r を求めて、それに平文 m を加算することによりC = a・r + m を計算することができる。これらの暗号化の手順は簡単なため高速に暗号化ができる。
【００１５】
この明細書において、暗号化装置に関する記載はそのまま暗号化方法、暗号化プログラム、及び鍵生成装置、鍵生成方法、鍵生成プログラムにも当てはまり、暗号化方法等に関する記載は暗号化装置等にもそのまま当てはまる。
【００１６】
またこの発明は、乱数発生器を備えて、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを、前記乱数発生器により発生した乱数をもとに、生成させる秘密鍵生成手段と、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換する剰余乗算器、とを備えた鍵生成装置にある。
【００１７】
またこの発明は、乱数発生器を備えて、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを、前記乱数発生器により発生した乱数をもとに、生成させる秘密鍵生成ステップと、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換するステップ、とを実行することによる鍵生成方法にある。
【００１８】
またこの発明は、コンピュータからなる鍵生成装置に、
秘密の整数P と、s mod Z = 0（Zは2以上の整数）を満たす秘密の整数ベクトルs と、d mod Z = 1 を満たす秘密の整数d とを生成させる秘密鍵生成ステップと、
前記整数ベクトルs を a = d-1 s mod P により公開鍵ベクトルa に変換するステップ、とを実行させることにより鍵を生成する鍵生成プログラムにある。
【００１９】
この発明では、秘密鍵の下位ビットが公開されないため、別解攻撃に対して安全である。
【００２０】
この明細書において、鍵生成装置に関する記載はそのまま暗号化方法、暗号化プログラム、及び鍵生成装置、鍵生成方法、鍵生成プログラムにも当てはまり、鍵生成方法等に関する記載は鍵生成装置等にもそのまま当てはまる。
【００２１】
この発明の公開鍵暗号化装置は、
秘密鍵d と、秘密鍵P（dとPは互いに素）と、ベクトルの次元を表す数n と、法Z と、n次元ベクトルを要素とする集合R とに対し、
成分が0以上P未満でn次元の公開鍵ベクトルa を記憶する公開鍵メモリと、
集合R に属するn次元ベクトルr を生成するための乱数発生器と、
0以上Z未満の平文m に対し、
C = a・r + m （ここに a・r はベクトルa とベクトルr との内積を表す）、により暗号文C を生成する演算器とを備えている。
【００２２】
特にR={0,1}nとした場合のこの発明の公開鍵暗号化装置は、
秘密鍵d と、秘密鍵P（dとPは互いに素）と、ベクトルの次元を表す数n と、法Z とに対し、
成分が0以上P未満でn次元の公開鍵ベクトルa を記憶する公開鍵メモリと、
成分が0または1でn次元の乱数ベクトルr を生成するための乱数発生器と、
0以上Z未満の平文m に対し、
C = a・r + m （ここに a・r はベクトルa とベクトル r との内積を表す）、により暗号文C を生成する演算器とを備えている。
この場合には暗号文C の生成は加算のみで行え、乗算は不要であるので、演算器は加算器で構成することができる。
【００２３】
本発明で実施する暗号システムの概要を以下に示す。
秘密鍵: ベクトルs; 整数P; 整数d
公開鍵: ベクトルa; 法Z; 集合R
鍵生成
Step 1: 公開鍵ベクトルa の次元n と法Z とn次元ベクトルを元とする集合R を決める。
Step 2: 次式を満たすn次元の秘密鍵ベクトルsをランダムに生成する。
s mod Z = 0 （右辺の0はn次元の零ベクトル）            (11)
Step 3: 次式を満たす整数 d をランダムに生成する。
d mod Z = 1                                           (12)
Step 4: 次式を満たす整数 P をランダムに生成する。
gcd (d, P) = 1                                          (13)
P > maxr ∈ R(r・s) + (Z-1)d  （r・sはベクトルr とベクトルs の内積）  (14)
Step 5: 次式により秘密鍵ベクトルs から公開鍵ベクトルa を得る。
a = d-1 s mod P  （d-1 はP を法とするd の逆元）            (15)
Step 6: 法Z と集合R を公開する。
【００２４】
暗号化
Step 1: 0〜Z-1 までの整数から成る平文を m とする。
Step 2: n次元ベクトル r ∈ R をランダムに生成する。
Step 3: 暗号文C を
C = a・r + m                                        (16)
により計算する。
【００２５】
復号
Step 1: 次式により中間平文M を計算する。
M = d C mod P                                         (17)
Step 2: 平文 m を次式により計算する。
m = M mod Z                                           (18)
式(14)より M = s・r + d m が成立し、式(11)より M ≡ d m (mod Z) が成立し、さらに式(12)より M ≡ m (mod Z)が成立する。したがって式(18)が成立する。
【００２６】
特にR={0,1}nとし、Z=2とした場合、この発明の暗号の安全性は部分和問題に基づいていると考えられるので、特に重要である。
この場合、この発明における平文m は0または1の値となり、m=0 のときの暗号文Cは C = a・r となり、m=1 のときの暗号文Cは C = a・r + 1 となる。
公開鍵ベクトルa の成分ak は一様乱数と考えられるので、暗号文C と公開鍵ベクトルa から C=a・r を満たす解r ∈ {0,1}n が存在するか否かを判定することは、判定問題としての部分和問題を解くことと同じであるので難しいと考えられる。すなわち、m=0 のときには、C = a・r であるので、この部分和問題には解があり、m=1 のときには、C = a・r + 1 であるので、この部分和問題に解がないことになるが、第三者がこのいずれかを判定することは難しいと考えられる。
一方、正当な受信者は暗号文C から求めた中間平文M が偶数か奇数かにより、m=0 かm=1かを判定することができる。
【００２７】
また本発明の暗号化システムにおいて、さらに整数V を追加して公開しておくことで、
0以上Z未満の平文m に対し、0以上V 未満の整数乱数v を発生させて
C = a・r + Zv + m                                      (19)
により暗号文C を生成することもできる。
【００２８】
この場合の本発明の暗号システムは、
法Z は公開されているので公開鍵ベクトルa にZ を連接したn+1次元の整数を成分とするベクトルa' = [a | Z] を、改めて公開鍵ベクトルと考え、乱数ベクトルr ∈ R と乱数v ∈ {0,1,...,V-1} を連接した乱数ベクトルr' = [r | v] ∈  R'（ここに集合R' は集合R と集合{0,1,...,V-1} の直積であるR'= R × {0,1,...,V-1} ）を、改めて乱数ベクトルと考えれば、
C = a'・r' + m 
により暗号文C を生成することと等価である。したがってこの場合も公開鍵ベクトルa' と乱数ベクトルr' の内積に平文m を加算して暗号化している暗号化システムであるので、本発明の変形例である。
この場合の暗号システムの概要を以下に示す。
【００２９】
秘密鍵: ベクトルs; 整数P; 整数d
公開鍵: ベクトルa; 法Z; 整数V; 集合R
鍵生成
Step 1: 公開鍵ベクトルa の次元n と法Z と整数V とn次元ベクトルを元とする集合R を決める。
Step 2: 次式を満たすn次元の秘密鍵ベクトルsをランダムに生成する。
s mod Z = 0 （右辺の0はn次元の零ベクトル）            (20)
Step 3: 次式を満たす整数 d をランダムに生成する。
d mod Z = 1                                           (21)
Step 4: 次式を満たす整数 P をランダムに生成する。
gcd (d, P) = 1                                          (22)
P > maxr ∈ R(r・s) + (ZV-1)d  （r・sはベクトルr とベクトルs の内積）    (23)
Step 5: 次式により秘密鍵ベクトルs から公開鍵ベクトルa を得る。
a = e s mod P  （e はP を法とするd の逆元）            (24)
Step 6: 法Z と整数V と集合R を公開する
【００３０】
暗号化
Step 1: 0〜Z-1 までの整数から成る平文を m とする。
Step 2: n次元ベクトル r ∈ R をランダムに生成する。
Step 3: 0〜V-1 までの整数v をランダムに生成する。
Step 4: 暗号文C を
C = a・r + Z v + m                                        (25)
により計算する。
【００３１】
復号
Step 1: 次式により中間平文M を計算する。
M = d C mod P                                         (26)
Step 2: 平文 m を次式により計算する。
m = M mod Z                                           (27)
式(23)より M = s・r + d Z v + d m が成立し、式(20)より M ≡ d m (mod Z) が成立し、さらに式(21)より M ≡ m (mod Z)が成立する。したがって式(27)が成立する。
【発明の効果】
【００３２】
別解攻撃に対して安全である。
【図面の簡単な説明】
【００３３】
【図１】図１は暗号通信装置のブロック図である。（実施例１）
【図２】図２は暗号化アルゴリズムを示すフローチャートである。（実施例１）
【図３】図３は復号アルゴリズムを示すフローチャートである。（実施例１）
【図４】図４は鍵生成装置のブロック図である。（実施例１）
【図５】図５は鍵生成アルゴリズムを示すフローチャートである。（実施例１）
【図６】図６は鍵生成アルゴリズムを示すフローチャートである。（実施例１）
【図７】図７は暗号通信での鍵の構造と復号の正当性を示す図である。（実施例１）
【図８】図８は暗号通信装置のブロック図である。（実施例２）
【図９】図９は暗号通信装置のブロック図である。（実施例３）
【図１０】図１０は暗号化アルゴリズムを示すフローチャートである。（実施例３）
【図１１】図１１は復号アルゴリズムを示すフローチャートである。（実施例３）
【図１２】図１２は鍵生成装置のブロック図である。（実施例３）
【図１３】図１３は鍵生成装置のブロック図である。（実施例３）
【図１４】図１４は鍵生成アルゴリズムを示すフローチャートである。（実施例３）
【図１５】図１５は暗号通信装置のブロック図である。（実施例４）
【発明を実施するための形態】
【００３４】
以下に本発明を実施するための最適実施例を示す。この発明の範囲は、特許請求の範囲の記載に基づき、明細書の記載とこの分野での周知技術とを参酌し、当業者の理解に従って定められるべきである。
【００３５】
図１〜図７に実施例１を示し、図８に実施例２を示し、図９〜図１４に実施例３を示し、図１５に実施例４を示す。これらの実施例において同じ符号は同じものを表し、実施例１に関する記載は特に断らない限り、その他の実施例にもそのまま当てはまる。
【実施例１】
【００３６】
図１の実施例１は、ナップザック型の公開鍵暗号であって、整数を成分とする公開鍵ベクトルa と、0または1を成分とする乱数ベクトルr と、0または1を成分とする平文m に対し、暗号文 C を、C = a・r + m により計算する場合の実施例である。暗号化に加算しか使用しないため、高速に暗号化することができ、低コストで実装することができる。
【００３７】
図１において、２は暗号通信装置で、暗号化装置４と復号装置６及び通信インターフェース８とから成る。公開鍵メモリ１０は、通信インターフェース８を介して、n個の数 ak から成る公開鍵 {ak} を受信して記憶し、乱数発生器１２は１ビットのn個の乱数列 {rk} を発生する。
なお乱数 {rk} を、複数ビットの乱数として発生させて、そのうちの特定のビット（例えば最下位ビット）を取り出して発生しても良い。
【００３８】
１８は内積演算器で、公開鍵ベクトルa と乱数ベクトルb の内積
a・r=Σnk=1 ak rk
を計算するための演算器である。
暗号文C は 
C = a・r + m
として求められる。なお {rk} が１ビットの乱数列である場合、積和演算ではなく単なる加算となる。
【００３９】
内積演算器１８の実装方法は任意であるが、図１の実施例１では内積が加算のみで計算できる特徴を生かして、加算器を用いて実装している。
【００４０】
加算器１４は rk = 1 のときに ak をラッチ回路１６の出力と加算した結果を出力し、ラッチ回路１６はその出力を記憶する。これを k=1〜n について実行することにより、ラッチ回路１６の出力は Σnk=1 ak rk となる。
【００４１】
暗号化装置４は、入力された１ビットの平文m と、前記内積演算器１８の出力とを、加算器１５により加算した結果を暗号文C として出力する。出力された暗号文C を通信インターフェース８を介し、通信相手の暗号通信装置２へ送信する。なお複数ビットの平文を送信する場合、平文１ビット毎に暗号文C を発生させ、複数個の暗号文C の列を送信する。
【００４２】
鍵メモリ２０は秘密鍵d と秘密鍵P を記憶し、暗号文メモリ２２は通信インターフェース８を介して入力された暗号文C を記憶する。暗号文メモリ２２に記憶した暗号文C を、鍵メモリ２０に記憶した秘密鍵d と乗算器２４で乗算し、剰余演算器２６で秘密鍵P に対する剰余
M = d C mod P
を求める。剰余M を中間平文と呼ぶ。
【００４３】
復号装置６は、剰余乗算器２６の出力である剰余Mに対し、平文m をM の2 を法とする剰余、
m = M mod 2
として出力する。なお2 を法とする剰余は最下位ビット(LSB)であるから、実施例１では、単に剰余M の最下位ビット(LSB)を、LSB選択回路２８で、選択して出力している。
【００４４】
図２に暗号化アルゴリズムを示す。ステップ１で１ビットの平文m を入力し、ステップ２で各１ビットの乱数の列 {rk} を発生させ、ステップ３で内積a・r = Σnk=1 ak rk を求め、ステップ４で C = a・r + m を求めて送信する。
【００４５】
図３に復号アルゴリズムを示す。ステップ１１で暗号文C を受信し、ステップ１２で M = d C mod P に従って中間平文M を求め、ステップ１３で m = M mod 2に従って M の最下位ビット(LSB)を平文m として出力する。
【００４６】
図４に鍵生成装置を示す。鍵生成装置１００は、秘密鍵P と、秘密鍵d と、公開鍵 {ak} とを出力する。素数発生器１０１で素数P を生成し、出力する。乱数発生器１０２で乱数を発生し、LSB変更回路１０４で最下位ビット(LSB)を1に変更することにより、
d mod 2 = 1
を満たす秘密鍵d を生成し、出力する。逆数演算器１０６で秘密鍵d の法P における逆元 d-1 を求める。乱数発生器１０２で乱数を発生し、LSB変更回路１０３で最下位ビット(LSB)を0に変更することにより、
sk mod 2 = 0
を満たすn 個の秘密の偶数列 {sk} を生成し、乗算器１０７で各 sk に逆元 d-1 を掛け、さらに剰余演算器１０８で法P による剰余を求めたものを、公開鍵 ak として出力する。
【００４７】
図５に鍵生成アルゴリズムを示す。
ステップ２１で素数P を生成し、出力する。
ステップ２２で奇数d を生成し、出力する。
ステップ２３〜ステップ２８までで、k=1〜n について以下のステップ２５〜ステップ２７を行う。
ステップ２５で偶数 sk を生成し、
ステップ２６で公開鍵 ak を求め、
ステップ２７で公開鍵 ak を出力する。
【００４８】
復号の正当性を保証するためには取りうる中間平文M の最大値よりも大きい素数P を生成する必要がある。取りうる中間平文の最大値は生成する秘密鍵の大きさを決めれば、あらかじめ見積もることができるので、図４の素数生成器１０１や図５のステップ２１において適切な大きさの素数を生成することができる。
例えばn次元の乱数ベクトルr を r ∈ {0,1}n として選ぶ場合、中間平文の最大値Mmax は、
Mmax = Σnk=1 sk + d
である。例えば秘密鍵sk と秘密鍵d のビット長をt ビットと設定した場合、Mmax のビット長L は t + log2 n よりも小さいので、 t + 1 + ceil( log2 n ) ビットのサイズの素数を生成すれば良いことがわかる（ここに ceil(x) はx を切り上げた整数値）。なおn次元の乱数ベクトルr の重みを制限する方式も考えることができるが、その場合にはより小さいサイズの素数を使用することができる。
【００４９】
鍵生成の別の実施例として、秘密鍵sk と秘密鍵d を生成してから
P > Σnk=1 sk + d
を満たす素数を生成することもできる。図６にこの場合の鍵生成アルゴリズムを示す。
ステップ３１で和S を0 に初期化する。
ステップ３２〜ステップ３６までで、k=1〜n について以下のステップ３４〜ステップ３５を行う。
ステップ３４で偶数 sk を生成し、
ステップ３５で和S に sk を加算する。
ステップ３７で奇数d を生成し、出力する。
ステップ３８で和S に奇数d を加算した値よりも大きい素数を生成し、出力する。
ステップ３９〜ステップ４３までで、k=1〜n について以下のステップ４１〜ステップ４２を行う。
ステップ４１で公開鍵 ak を求め、
ステップ４２で公開鍵 ak を出力する。
【００５０】
図７に鍵の構造と復号の正当性を示す。
秘密鍵 {sk} と秘密鍵d のサイズは同程度の大きさとするが、秘密鍵d のサイズを秘密鍵 {sk} のサイズより小さくすることもできる。秘密鍵 {sk} と秘密鍵d を生成する。
P > Σnk=1 sk + d
を満たすように、素数P を生成する。
平文m を１ビットの数ではなく、0以上Z未満の整数とする場合、Mmax が大きくなるので
P > Σnk=1 sk + (Z-1)d
を満たすように、素数P を生成する。
乱数 {rk} を１ビットの数ではなく、0以上T未満の整数とする場合、Mmax が大きくなるので
P > (T-1)Σnk=1 sk + d
を満たすように、素数P を生成する。
様々な変形例が考えられるが、いずれの場合においても
P > Mmax
を満たすように、素数P を生成すれば正当に復号できることが保証される。
【実施例２】
【００５１】
図８の実施例２は、ナップザック型の公開鍵暗号であって、整数を成分とする公開鍵ベクトルa と、0または1を成分とする乱数ベクトルr と、0以上V未満の乱数v と、0または1を成分とする平文m に対し、暗号文 C を、C = a・r + 2v + m により計算する場合の実施例である。暗号化に加算しか使用しないため、高速に暗号化することができ、低コストで実装することができる。また乱数v を用いることによる安全性の向上が期待される。実施例２は、vは乱数であり、2は公開鍵の一部と考えることができるので、乱数ベクトルr に乱数v を連接したn+1次元の乱数ベクトルをr' とし、公開鍵ベクトルa に2 を連接したn+1次元の公開鍵ベクトルをa' と考えれば、暗号文 C は、C = a'・r' + m により求められるので、本発明の変形例である。
【００５２】
図８において、４０は暗号通信装置で、暗号化装置４１と復号装置６及び通信インターフェース８とから成る。乱数発生器１２は、１ビットのn個の乱数列 {rk} の他に、0以上V未満の数v を発生する。乱数v は１ビットシフト回路１１にて２倍にされる。シフト回路ではなく乗算器を用いることもできるが、２倍であるのでシフト回路で行うことが好ましい。また乱数を２倍することはランダムな偶数を発生していることと同等であるので、１ビットシフト回路１１の代わりに、最下位ビット(LSB)変更回路を用いてLSBを0にする構成も考えられる。その他の符号は図１と同じである。
【実施例３】
【００５３】
図９の実施例３は、積和型の公開鍵暗号であって、整数を成分とする公開鍵ベクトルa と、整数を成分とする乱数ベクトルr と、0以上Z未満を成分とする平文m に対し、暗号文 C を、C = a・r + m により計算する場合の実施例である。
【００５４】
図９において、５０は暗号通信装置で、暗号化装置５１と復号装置５２及び通信インターフェース８とから成る。
【００５５】
内積演算器１８は公開鍵ベクトルa と乱数ベクトルb の内積
a・r=Σnk=1 ak rk 
を計算するための演算器である。
暗号文C は
C = a・r + m
として求められる。
【００５６】
乗算器１９は、乱数発生器１２で発生した整数乱数列 {rk} と、公開鍵メモリ１０に記憶した公開鍵 {ak} との積を求める。加算器１４は積 ak rk をラッチ回路１６の出力と加算した結果を出力し、ラッチ回路１６はその出力を記憶する。これを k=1〜n について実行することにより、ラッチ回路１６の出力は Σnk=1 ak rk となる。
【００５７】
暗号化装置５１は、入力された0以上Z未満の平文m と、前記内積演算器１８の出力とを、加算器１５により加算した結果を暗号文C として出力する。出力された暗号文C を通信インターフェース８を介し、通信相手の暗号通信装置２へ送信する。
【００５８】
鍵メモリ２０は秘密鍵dとP及びZ を記憶し、暗号文メモリ２２は通信インターフェース８を介して入力された暗号文C を記憶する。
復号装置５２は、暗号文メモリ２２に記憶した暗号文C を、鍵メモリ２０に記憶した秘密鍵d と乗算器２４で乗算し、剰余演算器２６で秘密鍵P に対する剰余
M = d C mod P
を求める。剰余M を中間平文と呼ぶ。
【００５９】
復号装置５２は、剰余乗算器２７の出力である剰余M のZ を法とする剰余を平文m として出力する。
m = M mod Z
なおZ が2z の場合には、Z を法とする剰余はM の下位zビットであるから、単に剰余M の下位zビットを選択して出力すれば良い。
【００６０】
図１０に暗号化アルゴリズムを示す。ステップ５１で0以上Z未満の平文m を入力し、ステップ５２で各整数乱数の列 {rk} を発生させ、ステップ５３で内積a・r=Σnk=1 ak rk を求め、ステップ５４で C = a・r + m を求めて送信する。
【００６１】
図１１に復号アルゴリズムを示す。ステップ６１で暗号文C を受信し、ステップ６２で M = d C mod P で中間平文M を求め、ステップ６３で m = M mod Z で平文m を求め出力する。
【００６２】
図１２に鍵生成装置１１０を示す。鍵生成装置１１０は以下のように動作する。
素数発生器１０１で素数P を生成し、出力する。
乱数発生器１０２で乱数d を発生する。検査器１１４は、乱数d が
d mod Z = 1
を満たすかどうか検査し、満たさない場合には出力せずに乱数発生器に再度乱数d の生成を要求する信号を返し、満たす場合にはd を秘密鍵として出力する。
乱数発生器１０２で乱数列 {sk} を発生する。検査器１１３は、乱数 sk が
sk mod Z = 0
を満たすかどうか検査し、満たさない場合には出力せずに乱数発生器に再度乱数sk の生成を要求する信号を返し、満たす場合にはsk を秘密鍵として出力する。
逆数演算器１０６で秘密鍵d の法P における逆元 d-1 を求める。乗算器１０７で各 sk に逆元 d-1 を掛け、さらに剰余演算器１０８で法P による剰余を求めたものを、公開鍵 ak として出力する。
【００６３】
実施例３の積和型の公開鍵暗号においても、実施例２のように、公開鍵Z と0以上V未満の乱数v の積を加える方式を考えることができる。この場合、vは乱数であり、Zは公開鍵であるので、乱数ベクトルr に乱数v を連接したn+1次元の乱数ベクトルをr' とし、公開鍵ベクトルa に公開鍵Z を連接したn+1次元の公開鍵ベクトルをa' と考えれば、暗号文 C は、C = a'・r' + m により求められるので、本発明の変形例である。
【００６４】
P は、素数であることが好ましいが、d と互いに素である整数としても良い。図１３にその場合の鍵生成装置１２０を示す。鍵生成装置１２０は以下のように動作する。
乱数発生器１０２で整数P を発生し、出力する。
乱数発生器１０２で整数d を発生する。検査器１２４は、整数d が
d mod Z = 1 かつ gcd(d, P) = 1
を満たすかどうか検査し、満たさない場合には出力せずに乱数発生器に再度乱数d の生成を要求する信号を返し、満たす場合にはd を秘密鍵として出力する。
乱数発生器１０２で乱数列 {sk} を発生する。検査器１１３は、乱数 sk が
sk mod Z = 0
を満たすかどうか検査し、満たさない場合には出力せずに乱数発生器に再度乱数sk の生成を要求する信号を返し、満たす場合にはsk を秘密鍵として出力する。逆数演算器１０６で秘密鍵d の法P における逆元 d-1 を求める。乗算器１０７で各 sk に逆元 d-1 を掛け、さらに剰余演算器１０８で法P による剰余を求めたものを、公開鍵 ak として出力する。
法Z=2z の場合には、検査器１２４を用いずに下位ビット変更回路等で、整数d の下位z ビットをz ビットから成る(0,...,0,1)に変更すれば良い。また、検査器１１３を用いずに、下位ビット変更回路等で、sk の下位z ビットを全て0に変更すれば良い。
【００６５】
図１４に実施例３’の鍵生成アルゴリズムを示す。
ステップ７１で整数P を生成し、出力する。
ステップ７２で整数d を生成する。
ステップ７３で整数d が gcd(d,P) = 1 かつ d mod Z = 1 を満たすか検査し、満たさない場合はステップ７２へ戻り、満たす場合は次のステップへ進む。
ステップ７４で整数d を出力する。
ステップ７５〜ステップ８１までで k=1〜n について以下を行う。
ステップ７７で整数 sk を生成し、
ステップ７８で整数 sk が sk mod Z = 0 を満たすか検査し、満たさない場合はステップ７７へ戻り、満たす場合は次のステップへ進む。
ステップ７９で公開鍵 ak を求め、
ステップ８０で公開鍵 ak を出力する。
【００６６】
復号の正当性を保証するためには取りうる中間平文M の最大値よりも大きい素数P を生成する必要がある。
例えば0以上Z未満の平文m に対し、n次元の乱数rk を0以上T未満の数として選ぶ場合、中間平文の最大値Mmax は、
Mmax = (T-1) Σnk=1 sk + (Z-1)d
である。Mmax のビット長L はあらかじめ計算しておくことができるので、L+1 ビットのサイズの素数を生成すれば良いことがわかる。
【実施例４】
【００６７】
図１５の実施例４は、ナップザック型の公開鍵暗号であって、整数を成分とする公開鍵ベクトルa と、0または1を成分とする乱数ベクトルr と、0以上Z未満を成分とする平文m に対し、暗号文 C を、C = a・r + m により計算する場合の実施例である。
【００６８】
図１５において、６０は暗号通信装置で、暗号化装置４と復号装置５２及び通信インターフェース８とから成る。暗号化装置４は実施例１における図１の暗号化装置４と同じであるが、入力する平文が実施例１では0または1であったのに対し、実施例４では0以上Z未満の整数である点のみが異なる。復号装置５２は実施例２における図９の復号装置５２と同じである。
【符号の説明】
【００６９】
２，４０，５０，６０          公開鍵暗号通信装置
４，４１，５１                暗号化装置
６，５２                      復号装置
８                            通信インターフェース
１０                          公開鍵メモリ
１１                          １ビットシフト回路
１２                          乱数発生器
１４，１５                    加算器
１６                          ラッチ回路
１８                          内積演算器
１９                          乗算器
２０                          鍵メモリ
２２                          暗号文メモリ
２４                          乗算器
２６                          剰余演算器
２７                          剰余演算器
２８                          LSB選択回路
１００，１１０，１２０        鍵生成装置
１０１                        素数発生器
１０２                        乱数発生器
１０３                        LSB変更回路
１０４                        LSB変更回路
１０５                        検査器
１０６                        逆数演算器
１０７                        乗算器
１０８                        剰余演算器
１１３                        検査器
１１４                        検査器
１２４                        検査器
【図１】
2018092010.tif 000003
【図２】
2018092010.tif 000004
【図３】
2018092010.tif 000005
【図４】
2018092010.tif 000006
【図５】
2018092010.tif 000007
【図６】
2018092010.tif 000008
【図７】
2018092010.tif 000009
【図８】
2018092010.tif 000010
【図９】
2018092010.tif 000011
【図１０】
2018092010.tif 000012
【図１１】
2018092010.tif 000013
【図１２】
2018092010.tif 000014
【図１３】
2018092010.tif 000015
【図１４】
2018092010.tif 000016
【図１５】
2018092010.tif 000017