我需要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.我进行了,并想了解如何解决它的一些技巧。谢谢。
答案 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