- 加密方式 :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包接可以了