java实现凯撒加密聊天CS版

java实现凯撒加密聊天CS版
一个小小练习,java语言编写的,Swing图形用户界面,Socket网络编程,与凯撒加密的结合,实现了加密聊天的功能。具体代码如下:

服务器端:
MyServer.java


/**
 * 带有界面的全双工网络通信
 */
package com.nwsuaf.test3;


import javax.swing.*;
import sun.text.resources.BreakIteratorInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;


public class MyServer extends JFrame implements ActionListener{
//界面设计
JPanel jp_faSong=null;
JPanel jp_jieShou=null;
JLabel jl_jiaMi1=null;
JLabel jl_jiaMi2=null;
JLabel jl_mingWen=null;
JLabel jl_miWen=null;
JTextField jtf_miYao1=null;
JTextField jtf_miYao2=null;
JTextField jtf_mingWen=null;
JTextField jtf_miWen=null;
JButton jb_jiaMiFaSong=null;
JButton jb_jieMiShuChu=null;
JTextArea jta_show=null;
JScrollPane jsp_show=null;

//把信息发给客户端的对象
PrintWriter pw=null;

public static void main(String[] args) {
MyServer myServer=new MyServer();
}
public MyServer() {
jp_faSong=new JPanel();
jp_jieShou=new JPanel();
jl_jiaMi1=new JLabel("密钥:");
jl_jiaMi2=new JLabel("密钥:");
jl_mingWen=new JLabel("明文:");
jl_miWen=new JLabel("密文:");
jtf_miYao1=new JTextField(5);
jtf_miYao2=new JTextField(5);
jtf_mingWen=new JTextField(10);
jtf_miWen=new JTextField(10);
jtf_miWen.setEditable(false);

jb_jiaMiFaSong=new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);//加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu=new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);//解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");

jta_show=new JTextArea();
jsp_show=new JScrollPane(jta_show);
//添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);

jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);

this.add(jp_jieShou,"North");
this.add(jsp_show);
this.add(jp_faSong,"South");

this.setTitle("QQ加密聊天-Server端");
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);

try {
//服务器监听
ServerSocket ss=new ServerSocket(9988);
//等待连接
Socket s=ss.accept();
//从客户端接收信息的流
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);

pw=new PrintWriter(s.getOutputStream(),true);

//读取从客户端发来的信息
while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把服务器发送的信息显示到jta_show
jta_show.append("服务器对客户端说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);


// 发送后清空 文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("客户端对服务器说:" + infoMingWen + "\r\n");

// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}
// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);


String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}


if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}


客户端:
MyClient.java
/**
 * 带有界面的全双工网络通信,必须客户端先说话
 */
package com.nwsuaf.test3;


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;


public class MyClient extends JFrame implements ActionListener {
// 界面设计
JPanel jp_faSong = null;
JPanel jp_jieShou = null;
JLabel jl_jiaMi1 = null;
JLabel jl_jiaMi2 = null;
JLabel jl_mingWen = null;
JLabel jl_miWen = null;
JTextField jtf_miYao1 = null;
JTextField jtf_miYao2 = null;
JTextField jtf_mingWen = null;
JTextField jtf_miWen = null;
JButton jb_jiaMiFaSong = null;
JButton jb_jieMiShuChu = null;
JTextArea jta_show = null;
JScrollPane jsp_show = null;


// 传递数据
PrintWriter pw = null;


public static void main(String[] args) {
MyClient myClient = new MyClient();
}


public MyClient() {
jp_faSong = new JPanel();
jp_jieShou = new JPanel();
jl_jiaMi1 = new JLabel("密钥:");
jl_jiaMi2 = new JLabel("密钥:");
jl_mingWen = new JLabel("明文:");
jl_miWen = new JLabel("密文:");
jtf_miYao1 = new JTextField(5);
jtf_miYao2 = new JTextField(5);
jtf_mingWen = new JTextField(10);
jtf_miWen = new JTextField(10);
jtf_miWen.setEditable(false); 


jb_jiaMiFaSong = new JButton("加密发送");
jb_jiaMiFaSong.addActionListener(this);// 加密发送监听器
jb_jiaMiFaSong.setActionCommand("jiaMiFaSong");
jb_jieMiShuChu = new JButton("解密输出");
jb_jieMiShuChu.addActionListener(this);// 解密输出监听器
jb_jieMiShuChu.setActionCommand("jieMiShuChu");


jta_show = new JTextArea();
jsp_show = new JScrollPane(jta_show);
// 添加组件
jp_jieShou.add(jl_jiaMi1);
jp_jieShou.add(jtf_miYao1);
jp_jieShou.add(jl_miWen);
jp_jieShou.add(jtf_miWen);
jp_jieShou.add(jb_jieMiShuChu);


jp_faSong.add(jl_jiaMi2);
jp_faSong.add(jtf_miYao2);
jp_faSong.add(jl_mingWen);
jp_faSong.add(jtf_mingWen);
jp_faSong.add(jb_jiaMiFaSong);


this.add(jp_jieShou, "North");
this.add(jsp_show);
this.add(jp_faSong, "South");


this.setTitle("QQ加密聊天-Client端");
this.setSize(400, 300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// 网络传输
try {
Socket s = new Socket("127.0.0.1", 9988);
// 接收服务器端发来的信息流
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
// 发送想服务器端发送客户端数据的流
pw = new PrintWriter(s.getOutputStream(), true);


while (true) {
// 不停的读服务器端发来的信息
String info = br.readLine();
jtf_miWen.setText(info);
}
} catch (Exception e) {
e.printStackTrace();
}
}


// 事件实现过程
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("jiaMiFaSong")) {
// 加密发送实现过程
String info = jtf_mingWen.getText();
// 把客户端发送的信息显示到jta_show
jta_show.append("客户端对服务器说:" + info + "\r\n");
String infoMiWen = Caesar(info, 1);
pw.println(infoMiWen);


// 发送后清空文本框内容
jtf_mingWen.setText("");
jtf_miYao2.setText("");
} else if (e.getActionCommand().equals("jieMiShuChu")) {
// 解密输出实现过程
String info2 = jtf_miWen.getText();
// 解密算法,返回解密后的值,并追加显示在文本域中
String infoMingWen = Caesar(info2, 0);
jta_show.append("服务器对客户端说:" + infoMingWen + "\r\n");

// 输出后清空文本框内容
jtf_miWen.setText("");
jtf_miYao1.setText("");
} else {
// 程序出错
System.out.println("程序出错!");
}
}


// flag=0代表解密,flag=1代表加密
private String Caesar(String s, int flag) {
String skey = null;
if (flag == 1) {
skey = jtf_miYao2.getText();
} else {
skey = jtf_miYao1.getText();
}
int key = Integer.parseInt(skey);


String es = "";
// 取出字符串中的字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}


if (c < 'a') {
c += 26;
}
if (c > 'z') {
c -= 26;
}
} else if (c >= 'A' && c <= 'Z') {
if (flag == 1) {
c += key % 26;// 加密
} else {
c -= key % 26;// 解密
}
if (c < 'A') {
c += 26;
}
if (c > 'Z') {
c -= 26;
}
}else if (c>='0'&&c<='9') {
if (flag == 1) {
c += key % 10;// 加密
} else {
c -= key % 10;// 解密
}
if (c < '0') {
c += 10;
}
if (c > '9') {
c -= 10;
}
}else{
//c=c;
}
es += c;
}
return es;
}
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
先运行safechat包里的greetigserver.class,之后运行greetingclient.class即可。 如遇报错,请参考:https://blog.csdn.net/fengzun_yi/article/details/104497160 实现过程: 1. 采用TCP通信协议完成接收者发送者双方的消息传递。 2. 利用Diffie-Hellman密钥交换协议生成对称加密通信的通信密钥。 3. 为防止中间人攻击,采用RSA非对称加密算法协助DH算法完成密钥交换。具体过程如下: a. 接收者与发送者双方各自利用RSA算法生成自己的公私钥,并生成数字证书,并在一个CA进行认证。 b. 在DH密钥交换阶段,A生成A的DH协商密钥用于发送给B,该密钥与接收方私钥生成最终通信密钥。发送DH密钥时,A先用自己的私钥加密DH协商密钥,再去CA获得一个真实的B的公钥,用B的公钥对加密过的协商密钥再做一次加密,发送给B。(因为是用B的公钥加密过,只有B有B的私钥,所以接收信息只有B自己可以解密查看,又因为是用A的私钥加密过的,只有A有A的私钥,所以只有用A的公钥可以进行解密,所以可以保证协商密钥确实是A发送过来的,而且发送的信息也无法被中间人解密。)B收到信息之后,先用自己的私钥解密,然后去CA获得A的公钥再对消息解密一次,获得A的DH密钥。B发给A的过程同上。 c. 之后双方执行DH生成本地密钥的过程。A利用B发送过来的密钥和A的DH私钥生成通信密钥。B利用A发送过来的密钥和B的DH私钥生成通信密钥。根据DH原理,两者生成的通信密钥是相同的。 4. 利用上一步生成的通信密钥,采用AES对称加密算法进行加密通信。 为了方便起见,并没用对A和B双方进行颁发证书的操作,A的公钥默认B已经从CA获得,B的公钥默认A已经从CA获得。并且采用java控制台交互,仅仅为演示原理及简单效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值