计算机安全与密码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“计算机安全与密码”实验报告
实验内容:
C/S模式加解密与签名认证
学号:2014112140
姓名:饶舸璇
日期:2016-11-05
一、实验目的:
建立服务器和客户端的连接。然后在客户端将明文加密,签名,并且发送给服务器,在服务器端将获取的字符串分析并解密,然后验证签名。通过本实验,强化DES加密解密和RSA签名认
证的理解,对java语言实现加解密相关知识有更深刻的认识!
二、算法:
代码部分分为三个部分:C/S模式的实现,DES加密解密,RSA签名认证技术。下面依次是三个实现的模块:
Service.class:服务器
package com.ctgu.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import .ServerSocket;
import .Socket;
import com.ctgu.des.Des;
import com.java.rsa.RSA;
import sun.misc.BASE64Decoder;
public class Service {
/**
* 基于TCP协议的Socket通信使用Socket网络编程
*
* @throws Exception
*/
public static void main(String[] args) throws Exception {
try {
// 创建一个服务器端Socket,即ServerSocket,指定绑定的接口
ServerSocket serverSocket = new ServerSocket(8888);
// 调用Accept方法开始监听,等待客户端的连接
System.out.println("服务器即将启动,等待客户端的连接.....");
Socket socket = serverSocket.accept();// 监听客户端
// 获取输入流,并读取客户端的信息
InputStream is = socket.getInputStream();// 字节输入流
InputStreamReader isr = new InputStreamReader(is);// 字节输入流转换为字符输入流
BufferedReader br = new BufferedReader(isr);// 为字符输入流设置缓冲
String info = null;
StringBuffer sub = new StringBuffer();
int j = 0;
while ((info = br.readLine()) != null) {// 循环读取缓冲
sub.append(info + "");
for (int i = 0; i < sub.length(); i++) {
char z = sub.charAt(i);
if (z == ',') {
j = i;
}
}
}
BASE64Decoder base64decoder = new BASE64Decoder();
String DEString = sub.substring(0, j);
byte[] encodeByte = base64decoder.decodeBuffer(DEString);
DEString = new String(Des.decrypt(encodeByte, "12345678"));
System.out.println(DEString);
String RSAString = sub.substring(j + 1);
byte[] encodeByte1 = base64decoder.decodeBuffer(RSAString);
if (!RSA.certification(encodeByte1, DEString))
System.out.println("认证成功!客户端说:" + DEString);
else
System.out.println("认证失败,请重发!");
socket.shutdownInput();
// 关闭资源
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client.Class:客户端
package com.ctgu.socket;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import .Socket;
import .UnknownHostException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import com.ctgu.des.Des;
import com.java.rsa.RSA;
import sun.misc.BASE64Encoder;
@SuppressWarnings("serial")
public class Client extends JFrame {
/**
* 基于TCP编程的Scoket通信之客户端
*/
public JLabel lblNewLabel;
public JLabel label;
public JLabel label_1;
public JTextField textField;
public JTextField textField_1;
public JTextField textField_2;
public JButton btnNewButton;
private JPanel contentPane;
private String text1;
private String text2;
private String text3;
private byte[] result;
private byte[] result1;