[实验指导书]
实验六、Java网络编程综合运用
一、实验目的
1.掌握RMI技术
2.掌握Java中加密、解密等安全技术
3.具备综合应用Java网络编程中各项技术的能力
二、实验内容
1.已知有3台计算机,A、B、C。其中A为客户机,负责向用户提供登陆界面(不一定要图形界面,可采用控制台程序),并将用户名和密码加密以后传递给B;B为中间服务器,负责接收来自A的用户和密码,并利用RMI调用C上的认证方法来确认用户名和密码是否合法,并将认证结果返回给A;C为RMI服务器,负责提供一个用于认证的远程方法。
2.该实验采取分组的形式完成,每组由3名同学组成,分别完成A、B、C三台计算机上的程序,加密算法、网络传输协议、程序间的接口由小组成员协商决定。
三、实验步骤
1.确定加密方式。可采用DES、AES等对称加密算法或MD5等消息摘要算法,这些算法的实现相对较为简单。(如果同学感兴趣也可以在实验完成后采用非对称加密算法来改写本实验代码。)
2.确定A、B之间网络传输协议。可选择采用TCP或UDP协议完成。(如果同学感兴趣也可以在实验完成后采用SSL协议来改写本实验代码。)
3.确定B、C之间的RMI接口。B、C之间可以传递明文,也可以传递密文,具体实验方式自定。注意,为了简单起见,合法的用户名和密码可以以明文(或密文)的形式存储在C主机程序的两个字符串变量当中。
4.小组成员分别在自己的计算机上编写程序代码。
5.在三台计算机上测试该实验模型。
四、代码参考
1.加密算法示例代码。
MD5
import java.security.*;
public class DigestPass {
public static void main(String[] args) throws Exception{
String str="Hello,I sent to you 80 yuan.";
MessageDigest md = Instance("MD5");//常用的有MD5,SHA算法等
md.Bytes("UTF-8"));//传入原始字串
byte[] re = md.digest();//计算消息摘要放入byte数组中
//下面把消息摘要转换为字符串
String result = "";
for(int i=0;i <re.length;i++){
result+= HexString((0x000000ff&re[i])|0xffffff00).substring(6);
}
System.out.println("length:"+re.length);
System.out.println(result);
}
}
AES
pto.*;
pto.spec.*;
public class SimpleAES {
public static String asHex (byte buf[]) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10)
strbuf.append("0");
strbuf.String((int) buf[i] & 0xff, 16));
}
String();
}
public static void main(String[] args) throws Exception {
String message="This is just an example";
// Get the KeyGenerator
byte[] kb={-33,104,24,5,-77,61,-95,18,100,-3,108,-10,-6,-108,119,-98};
SecretKeySpec skey = new SecretKeySpec(kb,"AES");
KeyGenerator kgen = Instance("AES");
kgen.init(128); // 192 and 256 bits may not be available
// Generate the secret key specs.
//SecretKey skey = ateKey();
Cipher cipher = Instance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skey);
/*for (int i=0;i&Encoded().length;i++)
System.out.Encoded()[i]+",");
System.out.println(); */
byte[] encrypted =
cipher.doFinal((args.length == 0 ?
message : args[0]).getBytes());
System.out.println("encrypted string: " + asHex(encrypted));
cipher.init(Cipher.DECRYPT_MODE, skey);
byte[] original =
cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " +
originalString + " " + asHex(original));
}
}
2.RMI程序编写步骤
(1)设置环境变量
(2)编写接口
public interface Calculator i.Remote {
public long add(long a, long b)
i.RemoteException;
public long sub(long a, long b)
i.RemoteException;
public long mul(long a, long b)
i.RemoteException;
public long div(long a, long b)
i.RemoteException;
}
(3)实现接口(服务器程序)
public class CalculatorImpl extends
implements Calculator {
public CalculatorImpl() i.RemoteException { super();
}
public long add(long a, long b)
i.RemoteException {
return a + b;
}
public long sub(long a, long b)
i.RemoteException {
return a - b;
}
public long mul(long a, long b)
i.RemoteException {
return a * b;
}
public long div(long a, long b)
i.RemoteException {java设置环境变量的方法代码
return a / b;
}
}
(4)生成stub类
(5)编写服务程序
i.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
} catch (Exception e) {
System.out.println("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
(6)编写客户程序
i.Naming;
i.RemoteException;
import java.MalformedURLException;
i.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c = (Calculator)
Naming.lookup("rmi://localhost/CalculatorService");
System.out.println( "4-3="+c.sub(4, 3) );
System.out.println( "4+5="+c.add(4, 5) );
System.out.println( "3*6="+c.mul(3, 6) );
System.out.println( "9/3="+c.div(9, 3) );
}
catch (MalformedURLException murle) {
System.out.println();
System.out.println(
"MalformedURLException");
System.out.println(murle);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。