erlang 与 java 之间数据一次一密处理

来源:互联网 发布:天下3男捏脸数据库 编辑:程序博客网 时间:2024/06/10 21:59
  • 加密方式 :AES_CBC_256
  • 加密频率 :一次一密
  • 跨系统     :erlang 与 java


erlang 端加解密:


调用crypto模块

1 、加密 :

      crypto:aes_cbc_256_encrypt(Key, IVec, pkcs5_padding(Text, 16))

      Key(私钥):根据数字证书动态取值,也可以约定不变,32bytes

      Ivec(初始向量): 一般为16 bytes全0

     %% pkcs5_padding方法,处理要加密的数据,为16bytes的倍数

     pkcs5_padding(PlainText, BlockSize) when is_binary(PlainText) ->
           Rem = size(PlainText) rem BlockSize,
           Padding = lists:duplicate(BlockSize - Rem, BlockSize - Rem),
           Binary = list_to_binary(Padding),
          <<PlainText/binary, Binary/binary>>;
     pkcs5_padding(PlainText, BlockSize) when is_list(PlainText) ->
          Rem = length(PlainText) rem BlockSize,
          Padding = lists:duplicate(BlockSize - Rem, BlockSize - Rem),
          PlainText ++ Padding.

    

2 、解密 :
          crypto:aes_cbc_256_encrypt(Key, IVec, pkcs5_padding(Text, 16))


java 端加解密:

1、解密

  读取erlang端的数据:

package test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import org.apache.commons.codec.binary.Base64;public class HttpTest {protected static  String host = new String("192.168.18.88:4002");protected static String encoding = "UTF-8";public HttpTest(){}public static String sendPost(String url, String param) {        PrintWriter out = null;        BufferedReader in = null;        StringBuffer result = new StringBuffer("");        try {            URL realUrl = new URL(url);            // 打开和URL之间的连接            URLConnection conn = realUrl.openConnection();            // 设置通用的请求属性            conn.setRequestProperty("accept", "*/*");            conn.setRequestProperty("connection", "Keep-Alive");            conn.setRequestProperty("user-agent",                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            // 发送POST请求必须设置如下两行            conn.setDoOutput(true);            conn.setDoInput(true);                                         // 获取URLConnection对象对应的输出流            out = new PrintWriter(conn.getOutputStream());            // 发送请求参数            out.print(param);            // flush输出流的缓冲            out.flush();            // 定义BufferedReader输入流来读取URL的响应                                    in = new BufferedReader(new InputStreamReader(conn.getInputStream()));            String line;                                                while ((line = in.readLine())!=null) {            result.append(line);            }                       String xml = result.toString();            Base64 base64 = new Base64();            byte [] xmlb = base64.decode(xml);                                    for (int i = 0; i < xmlb.length; i++) {System.out.print(xmlb[i]+",");}            System.out.println("=================xml :"+xml);        } catch (Exception e) {            System.out.println("发送 POST 请求出现异常!"+e);            e.printStackTrace();        }        //使用finally块来关闭输出流、输入流        finally{            try{                if(out!=null){                    out.close();                }                if(in!=null){                    in.close();                }            }            catch(IOException ex){                ex.printStackTrace();            }        }        return "ok";    }    public static void main(String[] args) throws Exception {sendPost("http://"+host+"/service","");}}

解密:

package test;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.FileInputStream;import javax.crypto.*;   import javax.crypto.spec.*;          public class AES   {       public static String asHex(byte buf[])       {           StringBuffer strbuf = new StringBuffer(buf.length * 2);           int i;           for (i = 0; i < buf.length; i++)               {                   if (((int) buf[i] & 0xff) < 0x10)                       strbuf.append("0");                   strbuf.append(Long.toString((int) buf[i] & 0xff, 16));               }           return strbuf.toString();       }              public static void main(String[] args) throws Exception       {                  String message = "测试加密";           System.out.println(" 原文: " + message);           System.out.println(" 原文转换格式显示:" + asHex(message.getBytes()));// string=》byte=》Hex                  // ======生成密码   //        KeyGenerator kgen = KeyGenerator.getInstance("AES");// 获取密匙生成器   //        kgen.init(256);// 生成256位的AES密码生成器      //        SecretKey skey = kgen.generateKey();// 生成密匙   //        byte[] raw = skey.getEncoded();// 编码格式                  //可以根据电子证书中,取加密的Key,或自己定义加密的32位bytes        String Kstring = "BkygAwIBAgECCSEwDQYJKoZIhvcNAQEF";        byte[] keyData = Kstring.getBytes();                SecretKeySpec skeySpec = new SecretKeySpec(keyData, "AES");// 生成一组扩展密钥,并放入一个数组之中                  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");          String IVstring = "0000000000000000";        IvParameterSpec iv = new IvParameterSpec(IVstring.getBytes()); //16个0的bytes               cipher.init(Cipher.ENCRYPT_MODE, skeySpec,iv);// 用ENCRYPT_MODE模式,用skeySpec密码组,生成AES加密方法                // ========加密message            byte[] encrypted = cipher.doFinal(message.getBytes());// 加密message                                                System.out.println("\n 密文转换格式后:" + asHex(encrypted));// 把密文转换成16进制格式                           // =======解密           cipher.init(Cipher.DECRYPT_MODE, skeySpec,iv);           byte[] original = cipher.doFinal(encrypted);// 解密           String originalString = new String(original, "UTF8");// 重新显示明文           System.out.println(" 解密后:" + originalString);           System.out.println(" 解密出的消息转换格式显示:" + asHex(original));// byte型原文       }   }  

http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters

根据回答找到下载新jar包(JDK6)链接地址如下:

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

JDK7 的地址如下:

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

把里面的两个jar包:local_policy.jar 和 US_export_policy.jar 替换掉原来安装目录C:\Program Files\Java\jre6\lib\security 下的两个jar包接可以了




0 0
原创粉丝点击