dysfzhoulong 发表于 2013-1-15 02:34:49

对称加密

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.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.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);}}
页: [1]
查看完整版本: 对称加密