2017-08-04 49 views
0

有人可以帮助我找出我的非常简单的程序中的问题吗?生成一个DES密钥并通过Java中的套接字传递它

当在服务器上输出消息时,我想看到通过网络发送的相同消息,但我没有收到消息。

这里是我的客户端代码:

package encryption; 

import java.io.*; 
import java.net.*; 
import java.security.*; 
import java.util.*; 
import javax.crypto.*; 

public class CipherClient 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String message = "The quick brown fox jumps over the lazy dog."; 
     String host = "localhost"; 
     int port = 7999; 
     Socket s = new Socket(host, port); 

     // -Generate a DES key. 
     KeyGenerator generator = KeyGenerator.getInstance("DES"); 
     generator.init(new SecureRandom()); 
     Key key = generator.generateKey(); 

     // -Store it in a file. 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx")); 
     out.writeObject(key); 
     out.close(); 

     // -Use the key to encrypt the message above and send it over socket s to the server. 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     CipherOutputStream cipherOut = new CipherOutputStream(s.getOutputStream(), cipher); 
     System.out.println(message.getBytes().length); 
     cipherOut.write(message.getBytes()); 
    } 
} 

这里是我的服务器代码:

package encryption; 

import java.io.*; 
import java.net.*; 
import java.security.*; 
import javax.crypto.*; 

public class CipherServer 
{ 
    public static void main(String[] args) throws Exception 
    { 
     int port = 7999; 
     ServerSocket server = new ServerSocket(port); 
     Socket s = server.accept(); 

     // -Read the key from the file generated by the client. 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx")); 
     Key key = (Key)in.readObject(); 
     System.out.println(key.getClass().getName()); 
     in.close(); 

     // -Use the key to decrypt the incoming message from socket s.  
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, key); 
     CipherInputStream cipherIn = new CipherInputStream(s.getInputStream(), cipher); 
     byte[] stringInBytes = new byte[44]; 
     cipherIn.read(stringInBytes); 
     String string = new String(stringInBytes); 

     // -Print out the decrypt String to see if it matches the orignal message. 
     System.out.println(string); 
    } 
} 
在服务器端

控制台输出:

javax.crypto.spec.SecretKeySpec 
}#ùÂ?°ô0íÿ| r|XÌ\?ñwŽ³{Í@nŠ? 

控制台客户端输出:

44 

这里是我的客户的新代码:

package encryption; 

import java.io.*; 
import java.net.*; 
import java.security.*; 
import javax.crypto.*; 

public class CipherClient 
{ 
    public static void main(String[] args) throws Exception 
    { 
     // -Generate a DES key. 
     KeyGenerator generator = KeyGenerator.getInstance("DES"); 
     generator.init(new SecureRandom()); 
     Key key = generator.generateKey(); 

     // -Store it in a file. 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx")); 
     out.writeObject(key); 
     out.close(); 

     // -Connect to a server. 
     String message = "The quick brown fox jumps over the lazy dog."; 
     String host = "localhost"; 
     int port = 7999; 
     Socket s = new Socket(host, port); 

     // -Use the key to encrypt the message above and send it over socket s to the server. 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     byte[] encVal = cipher.doFinal(message.getBytes()); 
     DataOutputStream dOut = new DataOutputStream(s.getOutputStream()); 
     dOut.writeInt(encVal.length); // write length of the message 
     dOut.write(encVal);   // write the message 
    } 
} 

这里是我的服务器的新代码:

package encryption; 

import java.io.*; 
import java.net.*; 
import java.security.*; 
import javax.crypto.*; 

public class CipherServer 
{ 
    public static void main(String[] args) throws Exception 
    { 
     int port = 7999; 
     ServerSocket server = new ServerSocket(port); 
     Socket s = server.accept(); 

     // -Read the key from the file generated by the client. 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx")); 
     Key key = (Key)in.readObject(); 
     in.close(); 

     // -Use the key to decrypt the incoming message from socket s.  
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, key); 

     DataInputStream dIn = new DataInputStream(s.getInputStream()); 
     int length = dIn.readInt();     // read length of incoming message 
     if(length>0) 
     { 
      byte[] messageInBytes = new byte[length]; 
      dIn.readFully(messageInBytes, 0, messageInBytes.length); // read the message 

      // -Print out the decrypt String to see if it matches the orignal message. 
      System.out.println(new String(cipher.doFinal(messageInBytes))); 
     } 
    } 
} 

这里是我在服务器端得到一个错误:

Exception in thread "main" java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.io.DataInputStream.readInt(Unknown Source) 
    at encryption.CipherServer.main(CipherServer.java:26) 

客户端没有错误。

+0

'我想看看这是通过网络发送相同的消息,但我没有得到one.'所以你没有看到任何东西?没有堆栈跟踪,没有消息?你尝试过没有使用你的钥匙? – Nathan

+0

@Nathan,已更新。 – ohidano

+0

@Nathan,我仍然无法弄清楚问题所在。请帮帮我。 – ohidano

回答

1

我认为您的客户端和服务器之间存在一个“种族”,用于从您的密钥文件进行写入和读取。至少它在我运行你的代码时为我做了。

尝试在创建套接字之前将密钥生成和写入密钥文件。这样,当你的客户端创建它的套接字时,服务器接受它,当它进入文件时,它会得到一个有效的文件。

它适用于我,除了写入文件位之外,与代码几乎没有区别。

客户端:

public class CipherClient 
{ 
    public static void main(String[] args) throws Exception 
    { 
     // -Generate a DES key. 
     KeyGenerator generator = KeyGenerator.getInstance("DES"); 
     generator.init(new SecureRandom()); 
     Key key = generator.generateKey(); 

     // -Store it in a file. 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("KeyFile.xx")); 
     out.writeObject(key); 
     out.close(); 

     String message = "The quick brown fox jumps over the lazy dog."; 
     System.out.println("Message converted from Bytes = " + new String(message.getBytes())); 
     System.out.println("Length = " + message.getBytes().length); 

     String host = "localhost"; 
     int port = 7999; 
     Socket s = new Socket(host, port); 

     // -Use the key to encrypt the message above and send it over socket s to the server. 
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     CipherOutputStream cipherOut = new CipherOutputStream(s.getOutputStream(), cipher); 
     cipherOut.write(message.getBytes()); 
     cipherOut.close(); 
     s.close(); 
    } 
} 

和服务器:

public class CipherServer 
{ 
    public static void main(String[] args) throws Exception 
    { 
     int port = 7999; 
     ServerSocket server = new ServerSocket(port); 
     Socket s = server.accept(); 

     // -Read the key from the file generated by the client. 
     ObjectInputStream in = new ObjectInputStream(new FileInputStream("KeyFile.xx")); 
     Key key = (Key)in.readObject(); 
     in.close(); 

     // -Use the key to decrypt the incoming message from socket s.  
     Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, key); 
     CipherInputStream cipherIn = new CipherInputStream(s.getInputStream(), cipher); 

     byte[] array = new byte[44]; 
     cipherIn.read(array); 
     cipherIn.close(); 
     s.close(); 

     String message = new String(array); 
     System.out.println(message); 
    } 
} 
+0

让我试试看,非常感谢您的关注。 – ohidano

+0

该方法对我无效。 – ohidano

+0

仍然获得相同的输出? – Maaaatt