First, the contents of the experiment:
Pair programming. Run TCP code, pair, one-person server, one-person client; Use encryption and decryption code package, compile and run code, one person encryption, one person decryption;
Integrated code, sent over TCP after the encryption.
Second, the code:
Server:
File Name:ComputeTCPServer.java
Import java.net.*;
Import java.io.*;
Import java.security.*;
Import java.security.spec.*;
Import javax.crypto.*;
Import javax.crypto.spec.*;
Import javax.crypto.interfaces.*;
Import java.security.interfaces.*;
Import java.math.*;
public class computetcpserver{
public static void Main (String srgs[]) throws Exception {
ServerSocket sc = null;
Socket Socket=null;
try {
sc= new ServerSocket (4421);//Create a server socket
SYSTEM.OUT.PRINTLN ("Port number:" + sc.getlocalport ());
SYSTEM.OUT.PRINTLN ("Server has started ...");
Socket = Sc.accept (); Waiting for client connections
SYSTEM.OUT.PRINTLN ("Connection already established");
Get a reference to a network input stream object
BufferedReader in = new BufferedReader (New InputStreamReader (Socket.getinputstream ()));
Get a reference to a network output stream object
PrintWriter out=new PrintWriter (New BufferedWriter (OutputStreamWriter ()), true);
String Aline2=in.readline ();
BigInteger c=new BigInteger (aline2);
FileInputStream f=new FileInputStream ("Skey_rsa_priv.dat");
ObjectInputStream b=new ObjectInputStream (f);
Rsaprivatekey prk= (Rsaprivatekey) b.readobject ();
BigInteger d=prk.getprivateexponent ();
BigInteger N=prk.getmodulus ();
System.out.println ("d=" +d);
System.out.println ("n=" +n);
BigInteger M=c.modpow (d,n);
System.out.println ("m=" +m);
Byte[] Keykb=m.tobytearray ();
String Aline3=new string (MT, "UTF8");
String aline3=parsebyte2hexstr (byte buf[]);
String aline=in.readline ();//Read data sent by the client
FileInputStream f2=new FileInputStream ("Keykb1.dat");
int num2=f2.available ();
Byte[] Keykb=new byte[num2];
F2.read (KEYKB);
Byte[] Ctext=parsehexstr2byte (Aline);
Key k=new Secretkeyspec (keykb, "Desede");
Cipher cp=cipher.getinstance ("Desede");
Cp.init (Cipher.decrypt_mode, k);
byte []ptext=cp.dofinal (Ctext);
String P=new string (Ptext, "UTF8");
System.out.println ("received from the client information:" +p); Returns results to the client over a network output stream
/*string Aline2=in.readline ();
BigInteger c=new BigInteger (aline2);
FileInputStream f=new FileInputStream ("Skey_rsa_priv.dat");
ObjectInputStream b=new ObjectInputStream (f);
Rsaprivatekey prk= (Rsaprivatekey) b.readobject ();
BigInteger d=prk.getprivateexponent ();
BigInteger N=prk.getmodulus ();
System.out.println ("d=" +d);
System.out.println ("n=" +n);
BigInteger M=c.modpow (d,n);
System.out.println ("m=" +m);
Byte[] Mt=m.tobytearray ();
String Aline3=new string (MT, "UTF8"); */
String Aline3=in.readline ();
String x=p;
MessageDigest m2=messagedigest.getinstance ("MD5");
M2.update (X.getbytes ());
byte a[]=m2.digest ();
String result= "";
for (int i=0; i<a.length; i++) {
Result+=integer.tohexstring (0X000000FF & A[i]) |
0XFFFFFF00). substring (6);
}
SYSTEM.OUT.PRINTLN (result);
if (aline3.equals (result)) {
System.out.println ("match success");
}
Out.println ("match success");
Out.close ();
In.close ();
Sc.close ();
} catch (Exception e) {
System.out.println (e);
}
}
public static String Parsebyte2hexstr (byte buf[]) {
StringBuffer sb = new StringBuffer ();
for (int i = 0; i < buf.length; i++) {
String hex = integer.tohexstring (Buf[i] & 0xFF);
if (hex.length () = = 1) {
Hex = ' 0 ' + hex;
}
Sb.append (Hex.touppercase ());
}
return sb.tostring ();
}
public static byte[] Parsehexstr2byte (String hexstr) {
if (Hexstr.length () < 1)
return null;
Byte[] result = new Byte[hexstr.length ()/2];
for (int i = 0;i< hexstr.length ()/2; i++) {
int high = Integer.parseint (Hexstr.substring (i*2, i*2+1), 16);
int low = Integer.parseint (Hexstr.substring (i*2+1, i*2+2), 16);
Result[i] = (byte) (high * + low);
}
return result;
}
}
Client:
File Name:ComputeTCPClient.java
Import java.net.*;
Import java.io.*;
Import java.security.*;
Import javax.crypto.*;
Import javax.crypto.spec.*;
Import java.security.spec.*;
Import javax.crypto.interfaces.*;
Import java.security.interfaces.*;
Import java.math.*;
public class Computetcpclient {
public static void Main (String srgs[]) throws exception{
try {
Keygenerator kg=keygenerator.getinstance ("Desede");//Method getinstance () parameter is a string type, specifying the name of the cryptographic algorithm
Kg.init (168); This step typically specifies the length of the key
Secretkey K=kg.generatekey ();//Generate Key
Byte[] ptext2=k.getencoded ();
String Kstr=parsebyte2hexstr (KB);
To create a socket object that connects to a specified port on a specific server
Socket socket = new Socket ("192.168.155.4", 4421);
Socket socket = new Socket ("127.0.0.1", 4421);
Get the network input stream from the server side
BufferedReader in = new BufferedReader (New InputStreamReader (Socket.getinputstream ()));
Obtain a network output stream from the client to the server-side output data
PrintWriter out=new PrintWriter (New BufferedWriter (OutputStreamWriter ()), true);
Create a keyboard input stream so that clients can enter information from the keyboard
BufferedReader stdin = new BufferedReader (new InputStreamReader (system.in));
FileInputStream f3=new FileInputStream ("Skey_rsa_pub.dat");
ObjectInputStream b2=new ObjectInputStream (F3);
Rsapublickey pbk= (Rsapublickey) b2.readobject ();
BigInteger e=pbk.getpublicexponent ();
BigInteger N=pbk.getmodulus ();
System.out.println ("e=" +e);
System.out.println ("n=" +n);
Byte ptext2[]=kstr.getbytes ("UTF8");
BigInteger m=new BigInteger (PTEXT2);
BigInteger C=m.modpow (e,n);
System.out.println ("c=" +c);
String cs=c.tostring ();
OUT.PRINTLN (CS); Transfer over the network to the server
System.out.print ("Please enter data to be sent:");
String S=stdin.readline (); Read the data to be sent from the keyboard
Cipher cp=cipher.getinstance ("Desede");
Cp.init (Cipher.encrypt_mode, k);
Byte ptext[]=s.getbytes ("UTF8");
Byte ctext[]=cp.dofinal (ptext);
String str=parsebyte2hexstr (Ctext);
Out.println (str); Transfer over the network to the server
String x=s;
MessageDigest m2=messagedigest.getinstance ("MD5");
M2.update (X.getbytes ());
byte a[]=m2.digest ();
String result= "";
for (int i=0; i<a.length; i++) {
Result+=integer.tohexstring (0X000000FF & A[i]) |
0XFFFFFF00). substring (6);
}
SYSTEM.OUT.PRINTLN (result);
OUT.PRINTLN (result);
/*s=result;
FileInputStream f3=new FileInputStream ("Skey_rsa_pub.dat");
ObjectInputStream b2=new ObjectInputStream (F3);
Rsapublickey pbk= (Rsapublickey) b2.readobject ();
BigInteger e=pbk.getpublicexponent ();
BigInteger N=pbk.getmodulus ();
System.out.println ("e=" +e);
System.out.println ("n=" +n);
Byte ptext2[]=s.getbytes ("UTF8");
BigInteger m=new BigInteger (PTEXT2);
BigInteger C=m.modpow (e,n);
System.out.println ("c=" +c);
String cs=c.tostring ();
OUT.PRINTLN (CS); Transfer to server via network */
Str=in.readline ();//Read results from the network input stream
SYSTEM.OUT.PRINTLN ("The result received from the server is:" +STR); Results returned by the output server
}
catch (Exception e) {
System.out.println (e);
}
finally{
Stdin.close ();
In.close ();
Out.close ();
Socket.close ();
}
}
public static String Parsebyte2hexstr (byte buf[]) {
StringBuffer sb = new StringBuffer ();
for (int i = 0; i < buf.length; i++) {
String hex = integer.tohexstring (Buf[i] & 0xFF);
if (hex.length () = = 1) {
Hex = ' 0 ' + hex;
}
Sb.append (Hex.touppercase ());
}
return sb.tostring ();
}
public static byte[] Parsehexstr2byte (String hexstr) {
if (Hexstr.length () < 1)
return null;
Byte[] result = new Byte[hexstr.length ()/2];
for (int i = 0;i< hexstr.length ()/2; i++) {
int high = Integer.parseint (Hexstr.substring (i*2, i*2+1), 16);
int low = Integer.parseint (Hexstr.substring (i*2+1, i*2+2), 16);
Result[i] = (byte) (high * + low);
}
return result;
}
}
Third, experiment: (final result)
Iv. problems encountered in the experiment:
1. About IP Address:
The IP address can be viewed from the command line
2. Client and server connection to the socket host understanding is not enough, before the connection failed, and then abandoned the book Getbyname method,
127.0.0.1 native address, can also realize the communication between the two machines.
Steps |
Time-consuming (min) |
Percentage |
Demand analysis |
20 |
15% |
Design |
20 |
15% |
Code implementation |
60 |
46% |
Test |
20 |
15% |
Analysis Summary |
10 |
8% |
Five, the experiment experience:
The code is for better use of the computer and service. Through this course of study, I found that the use of computer more methods,
We also understand the relationship between the realization of network function and the program.
Java Fourth Experiment