标签:证明 为什么 加解密 例子 aes image 运行结果截图 构建 而且
这是这学期最后一次实验了,也是学到了很多东西,希望自己可以可以善始善终,加油! 让我们开始这一篇博客吧!
课程:《程序设计与数据结构》
班级: 1723
姓名: 王文彬
学号:20172329
实验教师:王志强
实验日期:2018年6月11日
必修/选修: 必修
1、网络编程与安全-1
2、网络编程与安全-2
3、网络编程与安全-3
4、网络编程与安全-4
5、网络编程与安全-5
1、网络编程与安全-1
结果:
2、网络编程与安全-2
一、客户端
first:通过这样一段代码,将建立与服务器的连接
//1.建立客户端Socket连接,指定服务器位置和端口
Socket socket = new Socket("127.0.0.1",8880);
//2.得到socket读写流
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
//输入流
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
second:通过一系列中缀表达式转为后缀表达式
//3.利用流按照一定的操作,对socket进行读写操作
Scanner scan = new Scanner(System.in);
System.out.println("我输入的中缀表达式为: ");
String a =scan.nextLine();
Calculate p =new Calculate();
String temp = "";
for (int x = 0; x < p.parse(p.zb(a)).size(); ++x) {
temp = temp + p.parse(p.zb(a)).get(x);
}
String info1 = temp;
String info = new String(info1.getBytes("GBK"),"utf-8");
outputStreamWriter.write(info);
outputStreamWriter.flush();
socket.shutdownOutput();
third:接受到服务器的信息
//接收服务器的响应
String reply = null;
while (!((reply = bufferedReader.readLine()) ==null)){
System.out.println("接收服务器的信息为:" + reply);
}
二、服务器
first:这一步将建立一个服务器,并且准备接受来自客户端的信息
//1.建立一个服务器Socket(ServerSocket)绑定指定端口
ServerSocket serverSocket=new ServerSocket(8880);
//2.使用accept()方法阻止等待监听,获得新连接
Socket socket=serverSocket.accept();
//3.获得输入流
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
//获得输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
//4.读取用户输入信息
String info=null;
while(!((info = bufferedReader.readLine()) ==null)){
System.out.println("我是服务器,用户信息为:" + info);
second:接下来开始对于接受到的信息进行处理,也就是要开始对于接收到的后缀表达式要开始计算,并且将计算出的答案传给客户端
//给客户一个响应
Calculate a = new Calculate();
String str=info;
String[] temp = str.split(" ");
List<String> ls= Arrays.asList(temp);
String reply=String.valueOf(a.suanshu(ls));
printWriter.write(reply);
printWriter.flush();}
结果:
3、网络编程与安全-3
客户端:
first:利用这两个类进行生成密钥
public class Skey_DES{
public static void main(String args[])
throws Exception{
KeyGenerator kg=KeyGenerator.getInstance("DESede");
kg.init(168);
SecretKey k=kg.generateKey( );
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
}
}
public class Skey_kb{
public static void main(String args[]) throws Exception{
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
byte[ ] kb=k.getEncoded( );
FileOutputStream f2=new FileOutputStream("keykb1.dat");
f2.write(kb);
// 打印密钥编码中的内容
for(int i=0;i<kb.length;i++){
System.out.print(kb[i]+",");
}
}
}
second:进行加密
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
byte ptext[]=s.getBytes("UTF8");
for(int i=0;i<ptext.length;i++){
System.out.print(ptext[i]+",");
}
System.out.println("");
byte ctext[]=cp.doFinal(ptext);
String a="";
for(int i=0;i<ctext.length;i++){
a+=ctext[i] +",";
// System.out.print(a);
}
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
return a;
服务器:
third:进行解密
FileInputStream f2=new FileInputStream("keykb1.dat");
int num2=f2.available();
byte[ ] keykb=new byte[num2];
f2.read(keykb);
SecretKeySpec 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");
结果:
4、网络编程与安全-4
first:进行新密钥的生成,进行从"Bpub.dat","Apri.dat"读取文档,从而生成共享信息,然后进行加密
客户端:
FileInputStream f1=new FileInputStream("Bpub.dat");
ObjectInputStream b1=new ObjectInputStream(f1);
PublicKey pbk=(PublicKey)b1.readObject( );
//读取自己的DH私钥
FileInputStream f3=new FileInputStream("Apri.dat");
ObjectInputStream b2=new ObjectInputStream(f3);
PrivateKey prk=(PrivateKey)b2.readObject();
// 执行密钥协定
KeyAgreement ka=KeyAgreement.getInstance("DH");
ka.init(prk);
ka.doPhase(pbk,true);
//生成共享信息
byte[ ] sb=ka.generateSecret();
SecretKeySpec k = new SecretKeySpec(sb, 0,24,"DESede");
Cipher cp=Cipher.getInstance("DESede");
cp.init(Cipher.ENCRYPT_MODE, k);
byte ptext[]=s.getBytes("UTF8");
byte ctext[]=cp.doFinal(ptext);
String a="";
for(int i=0;i<ctext.length;i++){
a+=ctext[i] +",";
// System.out.print(a);
}
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
return a;
second:进行解密
服务器:
FileInputStream f1=new FileInputStream("Apub.dat");
ObjectInputStream b1=new ObjectInputStream(f1);
PublicKey pbk=(PublicKey)b1.readObject( );
//读取自己的DH私钥
FileInputStream f2=new FileInputStream("Bpri.dat");
ObjectInputStream b2=new ObjectInputStream(f2);
PrivateKey prk=(PrivateKey)b2.readObject( );
// 执行密钥协定
KeyAgreement ka=KeyAgreement.getInstance("DH");
ka.init(prk);
ka.doPhase(pbk,true);
//生成共享信息
byte[ ] sb=ka.generateSecret();
SecretKeySpec k=new SecretKeySpec(sb,0,24,"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(p);
结果:
5、网络编程与安全-5
first:计算明文的MD5值
public String Diget(String x) throws UnsupportedEncodingException, NoSuchAlgorithmException {
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8"));
byte s[ ]=m.digest( );
String result="";
for (int i=0; i<s.length; i++){
result+=Integer.toHexString((0x000000ff & s[i]) |
0xffffff00).substring(6);
}
return result;
}
second:进行对比,如果一样,则计算,不一样则抛出异常
DigestPass ooo=new DigestPass();
String reply;
if (ww.equals(ooo.Diget(p)))
{
reply= String.valueOf(a.suanshu(ls));
}
else {
reply="返回的MD5值不同";
}
结果:
split
的方法,我们可以利用这个方法把这两个字符串用一个字符进行切分,然后分别保存,比如“String aa =A;B
”,我们用String []bb =aa.split";";
就可以将其分成bb[0]
和bb[1]
这样就把两个东西都传递过去了。其次就是第二种方式,我相信第二种方式不用太过去强调,我认为是个人应该都会的,而且最开始想到的办法肯定也是这一种方法。
问题2解决方案:
String info=null;
String str1="";
while(!((info = bufferedReader.readLine()) ==null)){
System.out.println("我是服务器,用户信息为:" + info);
str1=info;}
String info=null;
while(!((info = bufferedReader.readLine()) ==null)){
System.out.println("我是服务器,用户信息为:" + info);
}
我们需要区分这两个代码的区别,运用第二个会出现报错,出现空指针,因为第二个代码的info是直到它为空才会跳出这个循环,自然会抛出空指针的异常。
SecretKeySpec k =new SecretKeySpec(sb,"DESede");
可以实现,首先我们的目的是想要把那个128的密钥只取24位,因此我们查找了API文档SecretKeySpec k=new SecretKeySpec(sb,0,24,"DESede");
,问题也就可以解决了。这一学期马上就要结束了,很多人现在也都已经开始放飞自我了,端午这三天,自己决定自己的收获还是非常大的,最近的几次编程,我觉得我学习Java的热情又回来了,然后我发现API真是个好东西,就像一本字典一样,而且讲解的都非常详细,希望自己可以坚持下去,自己立的flag,一定要做到!
蓝墨云班课
2016-2017-2 《Java 程序设计》课堂实践项目
Java 密码学算法
JAVA加解密DH算法
3DES自定义密钥问题
JAVA实现DES加密实现详解
多线程方式实现Socket通信
TCP
20172329 2017-2018-2 《程序设计与数据结构》实验五报告
标签:证明 为什么 加解密 例子 aes image 运行结果截图 构建 而且
原文地址:https://www.cnblogs.com/qh45wangwenbin/p/9193738.html