【问题标题】:Diffie-Hellman -- Primitive root mod n -- cryptography questionDiffie-Hellman -- Primitive root mod n -- 密码学问题
【发布时间】:2010-05-14 16:46:57
【问题描述】:

在下面的 sn-p 中,请从第一个“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;

}

【问题讨论】:

  • 这显然是功课。我的问题是:为什么人们甚至不倾向于将问题的文本更改为看起来与典型的家庭作业问题有些不同? “最后解释一下 modPow 方法。”.. 这让我哈哈大笑。

标签: vector root primitive diffie-hellman


【解决方案1】:
  • 将向量视为布尔值列表,每个数字 0 到 m 对应一个布尔值。当你这样看时,很明显每个值都设置为 0 将其初始化为 false,然后设置为 1 将其设置为 true。

  • 最后一个 for 循环正在测试所有布尔值。如果其中任何一个为 0(表示为假),则该函数返回假。如果全部为真,则该函数返回真。

  • 解释您询问的if 语句需要解释原始根 mod n 是什么,这是函数的全部要点。我认为如果你的目标是理解这个程序,你应该首先理解它实现了什么。如果您阅读上面的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。所以你会在你粘贴的算法中看到这些检查。

奖励链接:This paper 有一些不错的背景,包括如何测试接近末尾的原始根。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-02-11
    • 1970-01-01
    • 2023-03-19
    • 2014-05-13
    相关资源
    最近更新 更多