我正在尝试实现diffie-hellman密钥交换。假设我发现了一个大的素数 p - 如何找到生成器 g ?
受到我必须使用的multiprecision库的限制,只有几个基本操作(+,*, - ,/,pow,modExp,modMult,mod,gcd,isPrime,genRandomPrime,genRandomBits等等)可用。
是否可以查找安全素数 q ,以便gcd(n,q) == 1
应该是生成器的每个 n 数字对吧?
答案 0 :(得分:2)
你基本上回答了你的问题。由于gcd(n,q)==1
是素数,因此不需要测试q
。这意味着任何数字n
,n < q
与q
和gcd(n,q)
不具有共同因素,将始终输出1.
您可以检查 q = 2p + 1 是否为素数。如果是,那么 ord(Zq)= q-1 =(2p + 1)-1 = 2p 。由于 ord(x)|对于 Zq ord(x)= 2 或 ord(x)= p中的每个 x ,ord(Zq) 或 ord(x)= 2p 。因此,您只需要检查从{2,...,q-1}中随机选择的元素 x 是否为2阶。如果不是,那么它是p或2p的顺序,你可以使用它作为一个发电机。
答案 1 :(得分:0)
作为一项规则,不要向程序员询问有关加密的问题。密码学是微妙的,因此难以以无形的方式导致自我欺骗自己的能力。相反,问问密码学家(其中许多人也是程序员)。 Stack Exchange有一个加密板,这个问题已经得到解答。
https://crypto.stackexchange.com/questions/29926/what-diffie-hellman-parameters-should-i-use
我可以对那里的建议嗤之以鼻,但它基本上是合理的。除非你真的想学习相关的数学,否则我会顺从当局;他们在上面的答案中被引用。
关于你问的数学问题,这里有一个小小的介绍。模数为 p 的乘法组的大小为 p-1 。 (请参阅Fermat's Little Theorem。)order of any element必须划分 p-1 。最有利的情况是 p-1 = 2q ,其中 q 也是素数。
答案 2 :(得分:0)
如果您完全关心自己的安全问题,那么您已经得到了不要自行提供加密的仪式警告,所以这里是如何找到一个安全素数q的生成器。闭合范围[2,q - 2]中的数字g是一个生成器当且仅当g ^((q-1)/ 2)!= 1 mod q时,您应该使用标准算法进行模幂运算。选择g的随机值,直到通过测试。