您的位置:首页 > 理论基础 > 计算机网络

http协议 使用httpserver组件完成server(服务端)接受post请求数据并使用3DES+base64加解密希望对大家有帮助

2016-06-23 09:13 731 查看

http协议 使用httpserver组件完成server(服务端)接受post请求数据并使用3DES+base64加解密希望对大家有帮助

http协议 使用httpserver组件完成server(服务端)接受post请求数据并使用3DES+base64加解密希望对大重点内容家有帮助

这里写代码片
/**
*刚刚接触3DES+base64加解密传输数据网上收罗了一些代码加上项目经理的指点终于写出了一个server端
/
package com.caitong.httpserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpRequest;
import com.caitong.httpserver.util.Encrypt;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
//http协议 server端
public class HttpServerTest {

//主线程
public static void main(String[] args) {
try {
//允许最大连接数
int maxLog = 10;
//绑定的端口
HttpServer httpServer = HttpServer.create(new InetSocketAddress("192.168.20.205", 8888), maxLog);//"192.168.20.205"这是你要监听的ip地址
//直接返回Hello.....
httpServer.createContext("/demo1", new DemoA());
//显示已经处理的请求数,采用线程池
httpServer.setExecutor(null);
httpServer.start();
System.out.println("HttpServer启动...!");
} catch (Exception e) {
e.printStackTrace();
}
}

//获取请求数据并响应回去(实现HttpHandler类来处理请求过来的数据)
public static class DemoA implements HttpHandler{

private final byte[] keybyte="1A1FBDD13082FF4722F12783".getBytes();//这是3DES解密需要的密钥
public void handle(HttpExchange exchange) throws IOException {//HttpExchange是用来处理请求和相应数据的类
//System.out.println("ddd");
InputStream in = exchange.getRequestBody(); //获得输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
//将BufferedReader转化为字符串
String text = IOUtils.toString(reader);
//转码解密
String tt = Encrypt.DataDecrypt(keybyte, text);//Encrypt是写好的工具类(里面有定义好的base64转码和3DES解密的方法)
exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, tt.getBytes().length);
OutputStream out = exchange.getResponseBody();  //获得输出流
out.write(tt.getBytes());
out.flush();
exchange.close();  //exchange一定要关闭
}

}
}

----------

package com.caitong.httpserver.util;

import java.io.IOException
b398
;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* 加密解密工具类(是3DES+base64工具的集成类)
* @author  Juny965174016
* @version 20160623
*/
public class Encrypt {
private static final Log log = LogFactory.getLog(Encrypt.class);

/***
* 加密密钥
*/
private final byte[] keybyte="1A1FBDD13082FF4722F12783".getBytes(); //keybyte为加密密钥,长度为24字节
/**
* 加密方法提供3des加密,并且base64编码
* @param key 24字节的密钥
* @param str 明文
* @return
*/
public static String DataEncrypt(byte[] key, String str ) {
String encrypt = null;
try {
byte[] ret = ThreeDes.encryptMode(key,str.getBytes("UTF-8"));

encrypt = new String(Base64Util.encode(ret));
} catch (Exception e) {
System.out.print(e);
encrypt = str;
}
return encrypt;
}
/***
* 解密方法,先转码base64,再给3des解密
* @param key 24字节的密钥
* @param str 密文
* @return
*/
public static String DataDecrypt(byte[] key,String str ) {
String decrypt = null;
try {
byte[] ret = ThreeDes.decryptMode( key,Base64Util.decode(str));
decrypt = new String(ret, "UTF-8");
} catch (Exception e) {
System.out.print(e);
decrypt = str;
}
return decrypt;
}
}

----------

package com.caitong.httpserver.util;

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

/**
*3DES工具
* 字符串 DESede(3DES) 加密
* @author Juny965174016
* @version 20160623
*/
public class ThreeDes {
private static final String Algorithm = "DESede"; // 定义 加密算法,可用
// keybyte为加密密钥,长度为24字节
// src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte, byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
// 加密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}

// keybyte为加密密钥,长度为24字节
// src为加密后的缓冲区
public static byte[] decryptMode(byte[] keybyte, byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
// 解密
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
}

----------

package com.caitong.httpserver.util;
/**
*base64工具
* base64编码工具类
* @author Juny965174016
* @version 20160623
*/
public class Base64Util {

/**
*  将 s 进行 BASE64 编码
* @param s
* @return
*/
public static String encode(byte[] s) {
if (s == null)
return null;
return (new sun.misc.BASE64Encoder()).encode(s);
}
/**
*  将 s 进行 BASE64 编码
* @param s
* @return
*/
public static String encode(String s) {

if (s == null)
return null;
return encode(s.getBytes());
}

/**将 BASE64 编码的字符串 s 进行解码
*
* @param s
* @return
*/
public static byte[] decode(String s) {
if (s == null)
return null;
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return b;
} catch (Exception e) {
return null;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: