Java Des加解密方法(c#加密Java解密)

时间:2023-05-20 15:00:38

  最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录。这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java解密。我在网上找了下很多关于Java DES加解密的信息,大体有两种:一种是有向量的加解密,一种是没有向量只有秘钥的加解密。C#的DES加密是有向量的,所以我必须得用第一种。这时或许你还会遇到一个不是问题的问题:Java DES加解密的向量必须是8位,而C#可能是十六位,但是这是无关紧要的,因为在Java DES加解密的时候你只需要用C#使用向量的前八位就行了。以下是Java DES加解密的源代码(亲自做过验证):

  

public class DESCryption {
// DES加密的私钥,必须是8位长的字符串
private static final byte[] DESkey = { , , , , , , , , , , , , , , , };// 设置密钥、
private static final byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD, (byte) 0xAF};// 设置向量 private static AlgorithmParameterSpec iv = null;// 加密算法的参数接口,IvParameterSpec是它的一个实现
private static Key key = null; public DESCryption(byte[] DESkey,byte[] DESIV) throws Exception {
DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
iv = new IvParameterSpec(DESIV);// 设置向量
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 获得密钥工厂
key = keyFactory.generateSecret(keySpec);// 得到密钥对象 }
//加密方法
public String encode(String data) throws Exception {
Cipher enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 得到加密对象Cipher
enCipher.init(Cipher.ENCRYPT_MODE, key, iv);// 设置工作模式为加密模式,给出密钥和向量
byte[] pasByte = enCipher.doFinal(data.getBytes("utf-8"));
BASE64Encoder base64Encoder = new BASE64Encoder();
return base64Encoder.encode(pasByte);
}
//解密方法
public String decode(String data) throws Exception {
Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
deCipher.init(Cipher.DECRYPT_MODE, key, iv);
BASE64Decoder base64Decoder = new BASE64Decoder();
byte[] pasByte = deCipher.doFinal(base64Decoder.decodeBuffer(data));
return new String(pasByte, "UTF-8");
} //测试
public static void main(String[] args) throws Exception {
DESCryption tools = new DESCryption(DESkey,DESIV);
System.out.println("加密:" + tools.encode("管理员"));
System.out.println("解密:" + tools.decode("T9YwLGYNbN0="));
}
}

  希望以上代码能够解决和我遇到同样问题的童鞋!