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包接可以了
- erlang 与 java 之间数据一次一密处理
- [Erlang 0059] Erlang日期与时间处理
- C#与Erlang的一次Socket通信
- Erlang日期与时间处理
- Erlang日期与时间处理
- java从文本文件中一次读入一行数据进行处理
- java从文本文件中一次读入一行数据进行处理
- erlang与c之间的连接
- Java与C之间传递数据
- Java与C之间传递数据
- Java 与 C 之间传递数据
- Java与MySQL之间Blob数据转换
- GPS数据读取与处理(一)
- Erlang数据库-(一)Erlang与Mysql的连接
- erlang:now()与os:timestamp()-Erlang源码学习一
- JQuery与一般处理程序之间传递JSON数据
- Java多个线程之间处理共享数据的方式
- Java多个线程之间处理共享数据的方式
- 原始套接字收发MAC数据包完整历程--发送Codes & 接收Codes
- 黑马程序员——正则表达式
- Python 链接MysqlDB
- R语言缺失值处理
- spring4+mybaits3整合—项目Demo
- erlang 与 java 之间数据一次一密处理
- OpenGL深度学习资源收藏
- android studio 修改主题设置
- android-support-v7-appcompat编译时提示android:actionModeShareDrawable属性不存在
- ellipse android 环境搭建
- wikioi1296营业额统计题解
- db2创建用户及授权的研究
- 前端 经验
- android 权限大全