我正在尝试使用NTL库中提供的逆模数函数,可在此处找到:http://www.shoup.net/ntl/doc/tour.html
目前我正在使用范围内的值填充数组,例如:如果范围是8,则数组Primes [] = {1,2,3,5,7}。然后我用随机生成的整数替换1,在这个例子中我们说50.然后数组变为Primes [] = {50,2,3,5,7}。
然后我们取总产品,即50 * 2 * 3 ... = 10500并称之为x0
然后根据pHat [i] = x0 / Primes [i]创建一个新数组... 即pHat [] = {210,5250,3500,2100,1500}
现在问题在于:
该算法要求pHat中的值与Primes成反模量。 即。
pHat[0] invMod Primes[0] = 210 invMod 50 = undefined
pHat[1] invMod Primes[1] = 5250 invMod 2 = undefined
pHat[2] invMod Primes[2] = 3500 invMod 3 = 2
pHat[3] invMod Primes[3] = 2100 invMod 5 = undefined
pHat[4] invMod Primes[4] = 1500 invMod 7 = 4
整数替换1是随机生成的,它可以是从0到数千位数的任意位数(几乎可以想到任何整数)。 当程序最初开始时,它会询问选择质数的范围(示例中为8),以及选择多少个质数作为安全密钥。在该示例中,仅定义了2个但是如果用户选择3,则程序将失败。在不限制用户可以选择的素数的情况下,任何人都可以看到一种聪明的方法来防止未定义的选择吗?
答案 0 :(得分:0)
因此,首先要理解为什么我们得到未定义,而执行modinv b如果GCD(a,b)不等于1则我们得到未定义,即它们因为你选择的随机数而彼此有一个共同因子,即: 50有一个因子2,5,因此我们得到了未定义。
避免未定义的一种方法是检查您选择的随机数是否不是您考虑的质数的倍数,或者一个简单甚至更好的修复方法是选择质数作为随机数。