Java XpowYmodN函数,DiffieHellman

时间:2013-07-05 10:29:42

标签: java function math diffie-hellman

我需要Diffie Hellman协议来创建一个函数XpowYmodN。我在网上找到了以下功能:

    public long XpowYmodN(long x, long y, long N) {
    long result = 1;
    final long oneShift63 = ((long) 1) << 63;

    for (int i = 0; i < 64; y <<= 1, i++) {
        result = result * result % N;
        if ((y & oneShift63) != 0)
            result = result * x % N;
    }
    return result;
}

对于这个例子:XpowYmodN(29,83,53)结果是43.根据设备计算的制造商,结果应该是50.有人能指出我在哪里做错了吗? 我已经尝试使用Math.pow(X,Y)%N,对于这个例子,我得到了结果28.我进行了,并想了解如何解决它的一些技巧。谢谢。

3 个答案:

答案 0 :(得分:0)

为什么不使用班级java.math.BigInteger?此类有一个名为modPow()的方法,专为加密使用而设计。

用法是

BigInteger result = BigInteger.valueOf(x).modPow(BigInteger.valueof(y), BigInteger.valueOf(n));

顺便说一下变量a用小写字母命名(在我的例子中是n)。

答案 1 :(得分:0)

你的答案是对的。但计算器提供的值不是计算,而是交换密钥。你的答案是指发送者或接收者看到的公共价值

答案 2 :(得分:0)

我在该功能中测试了各种数字,效果很好。然后我创建了一个重复的函数,它使用了基于Uwe Plonus答案的以下代码:

public long XpowYmodN(long x, long y, long N) {
    return BigInteger.valueOf(x).modPow(BigInteger.valueOf(y), BigInteger.valueOf(N)).longValue();
}

我测试了你的数字并获得了43,就像那个功能一样;这样功能似乎完美无缺。发布了29,83,53个数字导致50的人似乎是错误的。 29,83,53的正确答案是43。

这是我使用的完整代码:

public class Main {
    public static long XpowYmodN_(long x, long y, long N) {
        long result = 1;
        final long oneShift63 = ((long) 1) << 63;

        for (int i = 0; i < 64; y <<= 1, i++) {
            result = result * result % N;
            if ((y & oneShift63) != 0)
                result = result * x % N;
        }
        return result;
    }

    public static long XpowYmodN(long x, long y, long N) {
        return BigInteger.valueOf(x).modPow(BigInteger.valueOf(y), BigInteger.valueOf(N)).longValue();
    }

    public static void main(String[] args)
    {
        System.out.println("BEGIN main");


        System.out.println(Main.XpowYmodN_(29,83,53));
        System.out.println(Main.XpowYmodN(29,83,53));
    }
}

给出了输出:

BEGIN main
43
43