您的位置:首页 > 编程语言 > Java开发

Java使用ExecutorService线程池通过Socket传输AES加密,并在客户端用ServerSocket解密

2011-07-28 17:23 447 查看
发送端
import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.Socket;import java.net.UnknownHostException;import java.security.InvalidKeyException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;public class SocketExample {public void ThreadPoolService(int threadNumber, List<MyEntity> list,int commandType)throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException,IllegalBlockSizeException, BadPaddingException,UnsupportedEncodingException {ExecutorService es = Executors.newFixedThreadPool(threadNumber);Iterator<MyEntity> iterator = list.iterator();while (iterator.hasNext()) {// 获取密匙生成器KeyGenerator kg = KeyGenerator.getInstance("AES");//获得一个key安全种子对象SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(("1234567890123456").getBytes());// 初始化// DES算法必须是56位// DESede算法可以是112位或168位// AES算法可以是128、192、256位kg.init(128,secureRandom);SecretKey key = kg.generateKey();Cipher cipher = Cipher.getInstance("AES"); // 创建密码器cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化MyEntity me = iterator.next();byte[] ctext = cipher.doFinal(me.getData().getBytes()); // 加密String md5 = getMD5(me.getData());es.submit(new MyThread(commandType,me.getIp(), me.getPort(), ctext,md5));}}/*** 获得md5值得方法,网络流传产品* */public String getMD5(String source) {String dest = null;try {MessageDigest md5 = MessageDigest.getInstance("MD5");char[] charArray = source.toCharArray();byte[] byteArray = new byte[charArray.length];for (int i = 0; i < charArray.length; i++)byteArray[i] = (byte) charArray[i];byte[] md5Bytes = md5.digest(byteArray);StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++) {int val = ((int) md5Bytes[i]) & 0xff;if (val < 16)hexValue.append("0");hexValue.append(Integer.toHexString(val));}dest = hexValue.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return dest;}public static void main(String[] args) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {List<MyEntity> list = new ArrayList<MyEntity>();list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));list.add(new MyEntity(1, "127.0.0.1", 8821,"1234567890123456","这是一个加密解密socket通信和多线程线程池的实验"));System.out.println("开始");SocketExample c = new SocketExample();c.ThreadPoolService(12, list, 2);}}class MyThread implements Runnable {private int commandType;private String ip;private int port;private byte[] data;private String md5;MyThread(int commandType,String ip, int port, byte[] data,String md5){this.commandType = commandType;this.ip = ip;this.port = port;this.data = data;this.md5 = md5;}@Overridepublic void run() {Socket socket = null;DataOutputStream writer = null;try {socket = new Socket(ip, port);writer = new DataOutputStream(socket.getOutputStream());writer.writeInt(commandType);writer.flush();//输出完毕后flush一下视为这一段结束writer.writeUTF(md5);writer.flush();writer.write(data);writer.flush();BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String msg = null;while ((msg = reader.readLine()) != null) {if (msg.equals("OK")) {break;}}reader.close();writer.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
接收端
import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.IOException;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;public class MultiThreadServerExample {private int port = 8821;private ServerSocket serverSocket;private ExecutorService executorService;// 线程池private final int POOL_SIZE = 50;// 单个CPU线程池大小public MultiThreadServerExample(){try {serverSocket = new ServerSocket(port);executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);System.out.println("线程开始");} catch (IOException e) {e.printStackTrace();}}public void service() {while (true) {Socket socket = null;try {// 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接socket = serverSocket.accept();executorService.execute(new MyHandler(socket));} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args){new MultiThreadServerExample().service();}}class MyHandler implements Runnable {private Socket socket;public MyHandler(Socket socket) {this.socket = socket;}public void run() {try {//DataInputStream类很好用,建议使用DataInputStream reader = new DataInputStream(socket.getInputStream());//读取intint commandType = reader.readInt();System.out.println("commandType:" + commandType);//读取StringString msg = reader.readUTF();System.out.println("msg:" + msg);//读取byte数组byte[] b = new byte[reader.available()];for(int i = 0;i < b.length;i++){b[i] = (byte)reader.read();}KeyGenerator kg = KeyGenerator.getInstance("AES");//获得一个key安全种子对象SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(("1234567890123456").getBytes());// 初始化// DES算法必须是56位// DESede算法可以是112位或168位// AES算法可以是128、192、256位kg.init(128,secureRandom);SecretKey key = kg.generateKey();Cipher cipher = Cipher.getInstance("AES"); //创建密码器cipher.init(Cipher.DECRYPT_MODE, key); //初始化byte [] ptext = cipher.doFinal(b); //解密String str = new String(ptext, "utf-8"); //重新显示明文System.out.println("data:" + str);PrintWriter writer = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()));//向客户端返回okwriter.println("OK");writer.flush();//输入流要晚一点关,自己的感觉是它关了socket就关了,输出流就不再起作用reader.close();writer.close();} catch (IOException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} finally {try {if (socket != null)socket.close();} catch (IOException e) {e.printStackTrace();}}}}
最后的结果查看的相关博文:关于socket传输的http://www.blogjava.net/sterning/archive/2007/10/13/152508.html关于AES加密的http://www.tianjiaguo.com/tech/java-aes%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: