Diffie-Hellman - 原始根mod n - 密码学问题

时间:2010-05-14 16:46:57

标签: vector root primitive diffie-hellman

在下面的代码片段中,请从第一个“for”循环开始解释发生了什么以及为什么。为什么添加0,为什么在第二个循环中添加1。 bigi下的“if”声明中发生了什么。最后解释一下modPow方法。提前感谢您提供有意义的回复。

public static boolean isPrimitive(BigInteger m, BigInteger n) {

    BigInteger bigi, vectorint;
    Vector<BigInteger> v = new Vector<BigInteger>(m.intValue());
    int i;

    for (i=0;i<m.intValue();i++)
        v.add(new BigInteger("0"));

    for (i=1;i<m.intValue();i++)
    {
        bigi = new BigInteger("" + i);

        if (m.gcd(bigi).intValue() == 1)
            v.setElementAt(new BigInteger("1"), n.modPow(bigi,m).intValue());
    }

    for (i=0;i<m.intValue();i++)
    {
        bigi = new BigInteger("" + i);

        if (m.gcd(bigi).intValue() == 1)
        {
            vectorint = v.elementAt(bigi.intValue());
            if ( vectorint.intValue() == 0)
                i = m.intValue() + 1;
        }
    }

    if (i == m.intValue() + 2)
        return false;
    else
        return true;

}

1 个答案:

答案 0 :(得分:1)

  • 将向量视为布尔值列表,每个数字0到m都有一个布尔值。当您以这种方式查看时,很明显每个值都设置为0以将其初始化为false,然后设置为1以将其设置为true。

  • 最后一个for循环是测试所有布尔值。如果它们中的任何一个为0(表示为false),则该函数返回false。如果全部为真,则该函数返回true。

  • 解释您询问的if语句需要解释原始根模型是什么,这是函数的全部要点。我想如果你的目标是理解这个程序,你应该先了解它的实现。如果您在其上阅读Wikipedia's article,则会在第一段中看到:

  

在模运算中,是一个分支   数论,原始根模数   n是具有该属性的任何数字g   n的任何数字互质   与g(mod n)的幂相等。   也就是说,如果g是原始根(mod)   n),然后对于每个具有的整数a   gcd(a,n)= 1,有一个整数k   这样gk≡a(mod n)。 k被称为   a的索引。也就是说,g是一个   乘法组的生成器   整数模数n。

也许最后一块拼图就是要知道如果两个数字的最大公约数是1,则它们是 coprime 。所以你在你粘贴的算法中看到了这些检查。

奖金链接:This paper有一些很好的背景,包括如何测试最终附近的原始根。