Java diffie-hellman加密公钥给出了错误的值

Java diffie-hellman加密公钥给出了错误的值,java,encryption,Java,Encryption,因此,我试图使客户机-服务器区分hellman加密。 我使用这个:serverPublicKey=(int)Math.pow(generator,serverPrivateKey)%prime生成服务器的公钥,如下:clientPublicKey=(int)Math.pow(generator,clientPrivateKey)%prime生成客户端的公钥 当我将服务器的公钥发送到客户端时,一切正常。通常给出一个2位整数(ex34)。 但当我每次将客户机的公钥发送到服务器时,我会将这样的大数字作

因此,我试图使客户机-服务器区分hellman加密。 我使用这个:
serverPublicKey=(int)Math.pow(generator,serverPrivateKey)%prime
生成服务器的公钥,如下:
clientPublicKey=(int)Math.pow(generator,clientPrivateKey)%prime
生成客户端的公钥

当我将服务器的公钥发送到客户端时,一切正常。通常给出一个2位整数(ex34)。 但当我每次将客户机的公钥发送到服务器时,我会将这样的大数字作为:167772160

这是我的密码

服务器端

int clientPublicKey;
int serverPrivateKey;
int serverPublicKey;
int prime = rand.nextInt(100); 
int generator = rand.nextInt(20);
//sending generator and prime to client
IntToClient.writeInt(prime);//1
IntToClient.writeInt(generator);//2
System.out.println("sent to client Prime :"+prime);
System.out.println("sent to client Generator :"+generator);
System.out.println("Server's private key: ");
serverPrivateKey = sc.nextInt();
//server's public key
serverPublicKey = (int)Math.pow(generator,serverPrivateKey)%prime;
System.out.println("Server sends in public --> "+ serverPublicKey);
IntToClient.writeInt(serverPublicKey);//3
clientPublicKey = IntFromClient.readInt();//4
System.out.println("Client sent public key --> "+ clientPublicKey);
int prime;
int generator;
int clientPrivateKey;
int clientPublicKey;
int serverPublicKey;

//get random prime and generator from server
prime = IntFromServer.readInt();//1
generator = IntFromServer.readInt();//2
System.out.println("Prime :"+prime);
System.out.println("Generator :"+generator);

//read server's public key
serverPublicKey = IntFromServer.readInt();//3
System.out.println("Server sent public key --> "+ serverPublicKey);

//clients private key
System.out.println("Client's private key: ");
clientPrivateKey = sc.nextInt();
//client's public key
clientPublicKey = (int)Math.pow(generator,clientPrivateKey)%prime;

System.out.println("Client sends in public --> "+ clientPublicKey);
IntToServer.writeInt(clientPublicKey);//4`
客户端

int clientPublicKey;
int serverPrivateKey;
int serverPublicKey;
int prime = rand.nextInt(100); 
int generator = rand.nextInt(20);
//sending generator and prime to client
IntToClient.writeInt(prime);//1
IntToClient.writeInt(generator);//2
System.out.println("sent to client Prime :"+prime);
System.out.println("sent to client Generator :"+generator);
System.out.println("Server's private key: ");
serverPrivateKey = sc.nextInt();
//server's public key
serverPublicKey = (int)Math.pow(generator,serverPrivateKey)%prime;
System.out.println("Server sends in public --> "+ serverPublicKey);
IntToClient.writeInt(serverPublicKey);//3
clientPublicKey = IntFromClient.readInt();//4
System.out.println("Client sent public key --> "+ clientPublicKey);
int prime;
int generator;
int clientPrivateKey;
int clientPublicKey;
int serverPublicKey;

//get random prime and generator from server
prime = IntFromServer.readInt();//1
generator = IntFromServer.readInt();//2
System.out.println("Prime :"+prime);
System.out.println("Generator :"+generator);

//read server's public key
serverPublicKey = IntFromServer.readInt();//3
System.out.println("Server sent public key --> "+ serverPublicKey);

//clients private key
System.out.println("Client's private key: ");
clientPrivateKey = sc.nextInt();
//client's public key
clientPublicKey = (int)Math.pow(generator,clientPrivateKey)%prime;

System.out.println("Client sends in public --> "+ clientPublicKey);
IntToServer.writeInt(clientPublicKey);//4`
因此,当我运行它时,我会从服务器上得到它

发送到客户机主:44
已发送到客户端生成器:3
服务器的私钥:
45
服务器以公共方式发送-->23
客户端发送的公钥-->167772160

这是来自客户的

Prime:44
发电机:3
服务器已发送公钥-->23
客户端的私钥:
87

如果通过管道(套接字?名称管道?串行端口?)发送值,则客户端以公共方式发送-->23

。。。服务器读取的值不是发送的值:

ClientFromClient.readInt();

。。。那么很明显你的管道没有很好的实现。显示的所有加密计算都是无用的,不需要解决此问题。

如果通过管道发送值(Socket?NamedPipe?SerialPort?):

。。。服务器读取的值不是发送的值:

ClientFromClient.readInt();

。。。那么很明显你的管道没有很好的实现。显示的所有加密计算都是无用的,不需要解决此问题。

即使这些较小的数字仍然太大,如果不特别小心,也无法处理
Math.pow()
不应在任何地方使用。它将操作数转换为
double
,并返回
double
结果。但是,
double
对于正值只有52位精度,345已经是72位整数了

相反,你可以用简单的方法,也可以用困难的方法。简单的方法是在学习练习中专门使用课堂及其方法。特别是,您希望用于所有模幂运算


还有一条更难的路。对于这么小的整数,可以实现自己的模幂运算mod P(P是模,是
int
小于215.5)方法。通过使用该算法并在每次乘法后减少mod P,可以确保不会有中间值溢出
int

,即使这些较小的数字仍然太大,不需要特别小心就无法处理

Math.pow()
不应在任何地方使用。它将操作数转换为
double
,并返回
double
结果。但是,
double
对于正值只有52位精度,345已经是72位整数了

相反,你可以用简单的方法,也可以用困难的方法。简单的方法是在学习练习中专门使用课堂及其方法。特别是,您希望用于所有模幂运算


还有一条更难的路。对于这么小的整数,可以实现自己的模幂运算mod P(P是模,是
int
小于215.5)方法。通过使用该算法并在每次乘法后减少mod P,您可以确保不会有中间值溢出
int

,但它在第一次尝试时就起作用了。那么这里发生了什么。我很困惑。@JamesReinstateMonicaPolk-Ups,我的错误,谢谢。但第一次尝试就成功了。那么这里发生了什么。我糊涂了。@JamesReinstateMonicaPolk-Ups,我错了,谢谢。我用的是插座。但是我仍然感到困惑,因为当我的服务器类将vale发送给clienti use socket时,它在第一次尝试时就起作用了。但我仍然感到困惑,因为当我的服务器类将vale发送给客户端时,它在第一次尝试时就起作用了。offtopic Monica怎么了?(我看到马腾有着相同的名字就够了)@gusto2:点击页面顶部的链接。#话题之外莫妮卡怎么了?(我看到马腾有着相同的名字就够了)@gusto2:点击页面顶部的链接。