有限体の原始元と位数

太郎

DH鍵共有で、p は大きな素数、g は Zp の原始元、とあるけど、Zp の原始元というのは、Zp* の生成元のこと?  

花子

DH鍵共有の話は置いておくとして、Zp の原始元というのは、Zp* の生成元か?という質問の答えはyesです。つまり、mod p の世界で、g, g2, g3, …, gp-1 が全部違っていて、集合として{1,2,3,…,p-1}と同じになるような g のこと。
別の言い方をすると、g, g2 mod p, g3 mod p,…を順番に計算したときに、最初に1になるのが gp-1 mod p であるような g 。

太郎

「位数」がp-1であるもの、だよね。

花子

そうそう、その通り。じゃあ、例えば、p=11 のときは、2は原始元?

太郎

えーっと、2 は1じゃない、22=4 も1じゃない、23=8 も1じゃない、24=16 mod 11 =5 も1じゃない、25=32 mod 11 =10 も1じゃない。。。
あー、もうめんどくさい!  

花子

ちょっとズルを教えてあげようか?

太郎

え?ズル?

花子

実は、1乗と2乗と5乗だけチェックすればいい。位数は必ず p-1 の約数である、という法則があるから。  

太郎

そうなんだ? 今は p-1=10 だから、位数は 1, 2, 5, 10 のどれかだね。あ、じゃあ、2の位数は10だよ。ということは、2は原始元だね。

花子

そういうことになるね。


DH鍵共有の g は何か

太郎

ということは、DH鍵共有では、g は Zp の要素の中で位数が p-1 であるものを選ぶ、と。鍵を共有したい人は p-1 未満の自然数 a をランダムに選んで、ga mod pを計算して、それを送って、・・・

花子

ちょっと待って!
DH鍵共有では、g を原始元にするのは良くない。

太郎

ええ?? だって、教科書には「 Zp の原始元」って書いてあるよ?

花子

それには、少し歴史的な背景があってね。DH鍵共有は、DiffieさんとHellmanさんが発明したのだけど、彼らの論文では確かに g は Zp の原始元と書いてある。でも、残念ながら、それだと安全ではないことが分かっているんだ。  

太郎

そうなんだ。じゃあ、どうするのがいいの?

花子

まず、どうして安全ではないかを説明するよ。

今、a をランダムに選んで ga mod p を送る、と言ったね。ga mod p は誰でも見れてしまうけど、a が何なのか全くわからない、というのが、DH鍵共有の安全性の根拠になってる。

太郎

離散対数問題が難しいから、だよね。

花子

そう。でも、g の位数が p-1 の時には、ga mod p を見た人は、a が奇数なのか偶数なのか、すぐにわかってしまうんだよ。
もう少し具体的に言うと、Zp* の要素のうち、半分は平方根を持っていて、残りの半分には平方根がない。そして、この平方根の有り無しを見分ける簡単な計算式がある。「ルジャンドル記号」って呼ばれている。

太郎

平方根と、a の偶奇にどういう関係があるの?

花子

g が原始元の場合、g は絶対に「平方根がないグループ」に属する。そして、a が奇数なら ga mod p も「平方根がないグループ」に属するし、a が偶数なら ga mod p は「平方根があるグループ」に属する。  

太郎

あー、それならば、たしかに、「ルジャンドル記号」というのを使って、a が偶数か奇数かが分かりそうだね。そうすると「a が全く分からない」というわけにいかなくなるわけか。

花子

そうなんだよ。離散対数問題が解けないからOK!とはいかない。

「平方根がないグループ」と「平方根があるグループ」に二分される元々の原因は、位数 p-1 が2で割り切れる、というところから来ているんだよ。ほら、p は大きな素数だから、必ず奇数でしょう? ということは、p-1 は必ず偶数になる。
だから、実際のDH鍵共有方式では、g は原始元ではなく、「位数が大きな素数」であるものを使っているよ。

太郎

そうすれば、グループ分けはできないの?

花子

g の位数が奇数ならば、g は必ず「平方根があるグループ」に入っている。そうすると、どんな a を選んでも、ga mod p は「平方根があるグループ」の中に入ってしまって、ルジャンドル記号を使っても意味のある情報は得られない、というわけ。  

太郎

なるほどねえ。
でも、なんでわざわざ位数が素数であるものを選ぶのかなあ? 奇数なら何でも良いように見えるけど。

花子

たとえば位数が3で割り切れる場合には、3グループに分けることができるし、数が5で割り切れる場合には、5グループに分けることができる。少数のグループに分けることができると、2グループでなくても安全性を損なう原因になってしまう。その点、位数が素数ならば、そういうグループ分けが全くできないから安全だよ。


おまけ

太郎

そういえば、位数は必ず p-1 の約数である、って言っていたよね。そう都合よく「位数が大きな素数であるg」なんて見つけられるのかなあ。

花子

そこは発想の転換だよ。p を決めてから「p-1 を割り切る大きな素数」を見つけるのは大変。素因数分解をしなければいけないし、そんな大きな素数は存在しないかもしれない。だから、g の位数である素数 q を先に選んでおいて、そこから素数 p を決めるのが普通。例えば、q を決めて、p=2q+1 を計算して、p が上手いこと素数になってくれれば出来上がり!  

太郎

なるほど! それなら、確実に q は p-1 の約数になっているね。

花子

DH鍵共有では、必ずしも p=2q+1 という素数を使う必要はないのだけど、この形の素数 p は safe prime と呼ばれて、いろいろなところで使われている。Safe、つまり安全ということだけど、私も詳しくは知らないから、勉強して何かわかったら教えてね。

太郎

了解!

2022.4.17