
一、实习目的
1.理解对称加密算法的原理,熟悉常用的对称加密算法:DES、TripleDES、Blowfish;
2.以DES加密算法为例,掌握分组加密算法加、解密过程的实现。
二、实习要求
1.实习前认真预习第5章有关内容;
2.熟悉java中的java.security.*和java.crypto.*中的相关类;
3.按要求认真撰写实习报告。
三、实习内容
1.[基本要求]
以DES/DESede为例,利用java中的相关类实现对指定字符串的加、解密。
2.[实现提示]
(1) 可以利用java中的KeyGenerator类创建对称秘钥,利用工厂类KeyGenerator的静态方法getInstance()获得KeyGenerator()类对象;
(2) 方法getInstance()的参数为字符串类型,指定加密算法的名称如:Blowfish、DES、DESede、HmacMD5或HmacSHA1等;
(3) 利用工厂类Cipher的对象可以创建密码器。同样的,getInstance()的参数为字符串类型,指定加密算法的名称。
实验截图:
以DES加密为例,客户端:
客户端解密:
实习代码:
服务器MyServer类:
package Caesar_Modification;
import java.awt.EventQueue;
import java.awt.TextArea;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.swing.JFrame;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import sun.misc.BASEDecoder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
public class MyServer {
private JFrame frame;
private static ServerSocket server_text;
private static Socket you_text;
private static ServerSocket server_key;
private static Socket you_key;
private static TextArea SDealWith_Before;
private static TextArea SDealWith_After;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyServer window = new MyServer();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public MyServer() throws IOException {
initialize();
}
private void initialize() throws IOException {
frame = new JFrame();
frame.getContentPane().setBackground(Color.LIGHT_GRAY);
frame.setTitle("服务器端");
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
final TextArea SDealWith_After = new TextArea();
SDealWith_After.setBounds(227, 103, 150, 115);
frame.getContentPane().add(SDealWith_After);
JLabel lblNewLabel = new JLabel("接收到的秘钥");
lblNewLabel.setBounds(227, 10, 93, 15);
frame.getContentPane().add(lblNewLabel);
JLabel label_1 = new JLabel("处理后");
label_1.setBounds(227, 78, 54, 15);
frame.getContentPane().add(label_1);
JButton button_1 = new JButton("清除");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SDealWith_After.setText("");
SDealWith_Before.setText("");
}
});
button_1.setBounds(269, 228, 93, 23);
frame.getContentPane().add(button_1);
final TextArea Pri_KeyS = new TextArea();
Pri_KeyS.setBounds(227, 27, 150, 43);
frame.getContentPane().add(Pri_KeyS);
final TextArea SDealWith_Before = new TextArea();
SDealWith_Before.setBounds(10, 103, 156, 115);
frame.getContentPane().add(SDealWith_Before);
JButton btnNewButton_1 = new JButton("开启秘钥通道");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
server_key = new ServerSocket(5679);
you_key = server_key.accept();
Pri_KeyS.setText("秘钥已传送。");
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton_1.setBounds(10, 6, 150, 23);
frame.getContentPane().add(btnNewButton_1);
JButton btnNewButton = new JButton("解密");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
InputStream in = you_text.getInputStream();
InputStream is = you_key.getInputStream();
ObjectInputStream b = new ObjectInputStream(is);
Key k1 = (Key)b.readObject();
b.close();
int total_ctext = in.available();
byte[]ctext = new byte[total_ctext];
byte[]ptext = new byte[total_ctext];
Cipher cp = Cipher.getInstance("DES");
cp.init(Cipher.DECRYPT_MODE, k1);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String cstring = br.readLine();
BASEDecoder basedecoder = new BASEDecoder();
ctext = basedecoder.decodeBuffer(cstring);
ptext = cp.doFinal(ctext);
String p = new String(ptext,"UTF8");
SDealWith_Before.setText(cstring);
SDealWith_After.setText(p);
} catch (IOException e2) {
e2.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchPaddingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvalidKeyException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalBlockSizeException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (BadPaddingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
you_text.close();
server_text.close();
server_key.close();
you_key.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton.setBounds(111, 228, 93, 23);
frame.getContentPane().add(btnNewButton);
JButton btnNewButton_2 = new JButton("开启密文通道");
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
server_text = new ServerSocket(5678);
you_text = server_text.accept();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
btnNewButton_2.setBounds(10, 39, 150, 23);
frame.getContentPane().add(btnNewButton_2);
JLabel lbldes = new JLabel("通过DES加密后");
lbldes.setBounds(20, 74, 93, 23);
frame.getContentPane().add(lbldes);
}
}
客户端MyClient类:
package Caesar_Modification;
import java.awt.EventQueue;
import java.awt.TextArea;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import java.security.Key;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.swing.JTextArea;
import sun.misc.BASEEncoder;
public class MyClient {
客户端");
明文");
加密");
初始化Cipher对象
指定UTF8字符集,可以跨平台
加密序列化
清除");
服务器地址");
发送秘钥");
默认秘钥长度为168bit
}
实验总结:
本次实验结合了第一次实验的成果,将秘钥和密文分别使用第一次实验的结果通信,运用JAVA自带的加密方法进行加密。其中,本次实验调试的时间特别长,总是在加解密的时候出现问题,最后发现服务器和客户端所引的自带的加密的包不同造成的,也通过这个了解了更多的知识。
