-
Notifications
You must be signed in to change notification settings - Fork 0
/
Server.java
130 lines (107 loc) · 3.57 KB
/
Server.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
* @author Greeshma Reddy
*
*/
public class Server {
ServerSocket serverSocket=null;
String serverIP;
int serverPort;
public Server(String serverIP, int serverPort)
{
this.serverIP = serverIP;
this.serverPort = serverPort;
}
public static void main(String[] args)
{
Scanner s= new Scanner(System.in);
System.out.println("enter server IP");
String serverIP=s.next();
System.out.println("Enter the port you want to use for server");
int serverport=s.nextInt();
Server server=new Server(serverIP, serverport);
server.serverProcess();
s.close();
}
// serverProcess() is responsible for socket creation and sharing random number, reciving actual file content
public void serverProcess()
{
LinkedHashMap<byte[], byte[]> hm= new LinkedHashMap<byte[], byte[]>();
SecretKeySpec key_AES=null;
PublicKey PUBK=null;
byte[] message=null;
try {
serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(serverIP, serverPort));
System.out.println("Starting server on "+serverSocket.getLocalPort());
ArrayList<byte[]> indices= new ArrayList<byte[]>();
Socket clientSocket=null;
while(true)
{
clientSocket = serverSocket.accept();
ObjectInputStream ois = new ObjectInputStream(clientSocket.getInputStream());
key_AES= (SecretKeySpec) ois.readObject();
System.out.println(key_AES);
PUBK= (PublicKey) ois.readObject();
hm= (LinkedHashMap) ois.readObject();
System.out.println(hm);
Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, PUBK);
for (Map.Entry<byte[],byte[]> entry : hm.entrySet()) {
byte[] Gi=cipher.doFinal(entry.getValue());
aesCipher.init(Cipher.DECRYPT_MODE, key_AES);
byte[] Fi= aesCipher.doFinal(Gi);
if(!Arrays.equals(Fi, entry.getKey()))
{
System.out.println("Fi and Hi not matching...exiting the server");
System.exit(0);
}
indices.add(entry.getKey());
}
for (Map.Entry<byte[],byte[]> entry : hm.entrySet()) {
System.out.println(new String(entry.getKey())+" "+entry.getValue());
}
System.out.println("Received data from Client..");
ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
while(true)
{
int i=(int)ois.readObject();
System.out.println("i value is "+ i);
message= (byte[]) ois.readObject();
if(message!=null)
{
String command= new String(message);
if(command.equalsIgnoreCase("check"))
{
oos.writeObject(hm.get(indices.get(i)));
}
else if(command.equalsIgnoreCase("retrieve"))
{
cipher.init(Cipher.DECRYPT_MODE, PUBK);
aesCipher.init(Cipher.DECRYPT_MODE, key_AES);
byte[] Gi=cipher.doFinal(hm.get(indices.get(i)));
byte[] Fi= aesCipher.doFinal(Gi);
oos.writeObject(Fi);
}
}
}
}
} catch (Exception e) {
System.out.println("Error occured"+ e.getMessage());
e.printStackTrace();
}
}
}