对称加密


public class Key {
// 主函数
public static void main(String args[]) throws Exception {
productKey();
}
/**
* 生成共享密钥
*
* @throws Exception
*/
public static void productKey() throws Exception {
// 1.得到密钥生成器,DESede一种加密算法
javax.crypto.KeyGenerator kg = javax.crypto.KeyGenerator
.getInstance("DESede");
// 2.指定密钥的长度
kg.init(168);
// 3.得到相应的密钥
SecretKey k = kg.generateKey();
// 4.将密钥写入相应的文件
java.io.FileOutputStream fos = new java.io.FileOutputStream("key.txt");
byte[] date = k.getEncoded();
fos.write(date);
fos.flush();// 强制输出
Journal.showINF("密钥文件已生成");
}
}

// 发送加密信息
public class Server extends Thread{
// 主函数
public static void main(String args[]) throws Exception {
java.net.ServerSocket server = new java.net.ServerSocket(2012);
Journal.showINF("服务器创建成功!");
while (true) {
java.net.Socket socket = server.accept();
Journal.showINF("客户端连接上了");
proccess(socket);
}
}
/**
* 利用服务器端的Socket发送消息
*
* @param socket
* @throws IOException
*/
public static void proccess(Socket socket) throws Exception {
// 得到原始输出流对象
java.io.OutputStream os = socket.getOutputStream();
// 得到加密输出流对象
OutputStream secOut=getSecOut(os);
//发给客户端
int count=0;
while(count<10){
count++;
String msg="发送的第"+count+"份加密文件\r\n";
secOut.write(msg.getBytes());
Journal.showINF("服务器发 "+msg.getBytes());
Thread.sleep(1000);
}
Journal.showERR("断开了");
}
/**
* 对原始输出流进行加密处理
*
* @param out
* @return
* @throws Exception
*/
public static OutputStream getSecOut(OutputStream out) throws Exception {
// 读取加密文件
java.io.FileInputStream fis = new java.io.FileInputStream("Key.txt");
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();
// 利用密钥数据、加密形式,得到指定的密钥
javax.crypto.spec.SecretKeySpec secretKey = new javax.crypto.spec.SecretKeySpec(
data, "DESede");
// 得到加密器
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("DESede");
// 利用密钥,进行加密器的初始化
cipher.init(cipher.ENCRYPT_MODE, secretKey);
//利用加密器对原始输出流进行加密
javax.crypto.CipherOutputStream cos = new javax.crypto.CipherOutputStream(
out, cipher);
return cos;
}
}

//接收加密信息
public class Client {
// 主函数
public static void main(String args[]) throws Exception {
java.net.Socket socket = new java.net.Socket("127.0.0.1", 2012);
Journal.showINF("客户机连接成功!");
// 得到原始输入流对象
java.io.InputStream is = socket.getInputStream();
// 得到加密输出流对象
InputStream secInt = getSecInt(is);
// 读取服务器发来的消息
int count = 0;
String msg="";
while (count < 10) {
count++;
int i = secInt.read();
while (i != 13) {
char c = (char) i;
msg+=c;
i = secInt.read();
}
msg=new String(msg.getBytes("ISO-8859-1"),"GBK").trim();
Journal.showINF("解密消息是 "+msg);
msg="";
}
}
/**
* 对原始输入流进行加密处理
*
* @param ins
* @return
* @throws Exception
*/
public static InputStream getSecInt(InputStream ins) throws Exception {
// 读取加密文件
java.io.FileInputStream fis = new java.io.FileInputStream("Key.txt");
byte[] data = new byte[fis.available()];
fis.read(data);
fis.close();
// 利用密钥数据、加密形式,得到指定的密钥
javax.crypto.spec.SecretKeySpec secretKey = new javax.crypto.spec.SecretKeySpec(
data, "DESede");
// 得到加密器
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("DESede");
// 利用密钥,进行加密器的初始化
cipher.init(cipher.DECRYPT_MODE, secretKey);
// 利用加密器对原始输入流进行加密,得到解密输入流
javax.crypto.CipherInputStream cos = new javax.crypto.CipherInputStream(
ins, cipher);
return cos;
}
}

public class Journal {
private static int INFOR = 0;// 一般信息的计数器
private static int ERROR = 0;// 严重错误信息的计数器
/**
* 一般信息的打印
*
* @param msg
* 要打印的信息
*/
public static void showINF(String msg) {
java.util.Date date = new java.util.Date();
String s = java.text.DateFormat.getInstance().format(date);
INFOR++;
System.out.println(INFOR + " " + s + " : " + msg);
}
/**
* 一般信息的打印
*
* @param msg
* 要打印的信息
*/
public static void showERR(String msg) {
java.util.Date date = new java.util.Date();
String s = java.text.DateFormat.getInstance().format(date);
ERROR++;
System.err.println(ERROR + " " + s + " : " + msg);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值