$q$を素数としたとき、$p = 2q+1$の形の素数$p$を安全な素数と呼ぶ。また、このときの$q$はソフィー・ジェルマン素数と呼ばれ、ソフィー・ジェルマン素数を2倍して1足したものが安全な素数とも捉えることができる。安全な素数$p$の例は次のとおりである。

  • $p = 11$
  • $p = 135728639839542407318776502800931503492104605845322965830111393922436809124602997959278273856461569499595665522973329934548503037592618518164927514109598729179730341137328510048768146457442979840571712184521242292450622518599052485219966895732861593247724960432944023125777547552628035788917970523206394005119$

素数$p$が$p = 2q+1$を満たすとき、$p$を法とする有限体$\Z_{p}^*$の位数は$p-1 = 2q$である。つまり、位数が大きな素数因子$q$をもつため(離散対数問題が難しくなる)、$p$は安全であると言われる。

$1024$bitの安全な素数$p$を生成するpythonスクリプトは次のとおりである。生成には、gensafeprimeモジュールを使っている。

import gensafeprime
from Crypto.Util.number import isPrime

p = gensafeprime.generate(1024)
q = (p - 1) // 2
print("p = ", p)
print("q = ", q)
print("isPrime p: ", isPrime(p))
print("isPrime q: ", isPrime(q))