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

3 篇文章 0 订阅

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;
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;
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值