一个java的DES加解密类转换成C# (一)

2014-11-24 09:56:24 · 作者: · 浏览: 0

一个java的des加密解密代码如下:


//package com.visionsky.util;  
 
import java.security.*; 
//import java.util.regex.Pattern;  
//import java.util.Hashtable;  
import javax.crypto.*; 
import javax.crypto.spec.*; 
 
import sun.misc.*; 
 
/**
 * des加密解密
 */ 
public class DESPlus { 
    private static String strDefaultKey = "PLFP"; //默认密钥  
 
    private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef};//des 向量  
 
    private static BASE64Encoder enc = new BASE64Encoder();//将byte[]转换成String  
 
    private static BASE64Decoder dec = new BASE64Decoder(); //将String转换成byte[]  
 
    /**
     * 加密字节数组
     *
     * @param arrB
     *            需加密的字节数组
     * @param key
     *            密钥
     * @return 加密后的字节数组
     * @throws Exception
     */ 
    public static byte[] encrypt(byte[] arrB, String key) throws Exception { 
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); 
 
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 
        IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv); 
 
        Cipher encryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
        encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp); 
 
        return encryptCipher.doFinal(arrB); 
    } 
 
    /**
     * 加密字符串
     *
     * @param xml
     *            需加密的字符串
     * @param key
     *            密钥
     * @return 加密后的字符串
     * @throws Exception
     */ 
    public static String encrypt(String xml, String key) throws Exception { 
        //return DESPlus.enc.encode(encrypt(xml.getBytes(), key));  
    return new String(encrypt(xml.getBytes(), key));  
    } 
 
    /**
     * 使用默认公钥加密字符串
     * @param xml 需加密的字符串
     * @return 加密后的字符串
     * @throws Exception
     */ 
    public static String encrypt(String xml) throws Exception { 
        return encrypt(xml, strDefaultKey); 
    } 
 
    /**
     * 解密字节数组
     *
     * @param arrB
     *            需解密的字节数组
     * @param key
     *            密钥
     * @return 解密后的字节数组
     * @throws Exception
     */ 
    public static byte[] decrypt(byte[] arrB, String key) throws Exception { 
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); 
 
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 
        IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv); 
 
        Cipher decryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
        decryptCipher.init(Cipher.DECRYPT_MODE, secretKey, ivp); 
 
        return decryptCipher.doFinal(arrB); 
    } 
 
    /**
     * 解密字符串
     *
     * @param xml
     *            需解密的字符串
     * @param key
     *            密钥
     * @return 解密后的字符串
     * @throws Exception
     */ 
    public static String decrypt(String xml, String key) throws Exception { 
        return new String(decrypt(DESPlus.dec.decodeBuffer(xml), key)); 
    } 
 
    /**
     * 使用默认公钥解密字符串
     * @param xml 需解密的字符串
     * @return 解密后的字符串
     * @throws Exception
     */ 
    public static String decrypt(String xml) throws Exception { 
        return decrypt(xml, strDefaultKey); 
    } 
 
    /**
     * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
     *
     * @param arrBTmp
     *            构成该字符串的字节数组
     * @return 生成的密钥
     * @throws java.lang.Exception
     */ 
    private Key getKey(byte[] arrBTmp) throws Exception { 
        // 创建一个空的8位字节数组(默认值为0)  
        byte[] arrB = new byte[8]; 
 
        // 将原始字节数组转换为8位  
        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { 
            arrB[i] = arrBTmp[i]; 
        } 
 
        // 生成密钥  
        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); 
 
        return key; 
    } 
 
    /**
     * 获取默认密钥
     * @return
     */ 
    public static String getDesKey() { 
        return DESPlus.strDefaultKey; 
    } 
 
    public static void main(String[] args) { 
        try { 
            //测试密匙  
            String key = "BOC_PLFP"; 
            //004交易案例  
            String xml = "< xml version=\"1.0\" encoding=\"UTF-8\" >
00417850COM011109141222222660161
0000000123客户信息不完整,请补充资料。
"; System.out.println("密钥:" + key); System.out.println("加密前的字符串:" + xml); System.out.println("加密前的字符串长度:" + xml.getBytes().length); //加密 xml = DESPlus.encrypt(xml, key); System.out.println("加密后的字符串:" + xml); System.out.println("加密后的字符串长度:" + xml.getBytes().length); //解密 xml = DESPlus.decrypt(xml, key); System.out.println("解密后的字符串:" + xml); System.out.println("解密后的字符串长度:" + xml.getBytes().length); } catch (Exception e) { e.printStackTrace(); } } } //package com.visionsky.util; import java.security.*; //import java.util.regex.Pattern; //import java.util.Hashtable; import javax.crypto.*; import javax.crypto.spec.*; import sun.misc.*; /** * des加密解密 */ public class DESPlus { private static String strDefaultKey = "PLFP"; //默认密钥 private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef};//des 向量 private static BASE64Encoder enc = new BASE64Encoder();//将byte[]转换成String private static BASE64Decoder dec = new BASE64Decoder(); //将String转换成byte[] /** * 加密字节数组 * * @param arrB * 需加密的字节数组 * @param key * 密钥 * @return 加密后的字节数组 * @throws Exception */ public static byte[] encrypt(byte[] arrB, String key) throws Exception { DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv); Cipher encryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp); return encryptCipher.doFinal(arrB); } /** * 加密字符串 * * @param xml * 需加密的字符串 * @param key * 密钥 * @return 加密后的字符串 * @throws Exception */ public static String encrypt(String xml, String key) throws Exception { //return DESPlus.enc.encode(encrypt(xml.getBytes(), key)); return new String(encrypt(xml.getBytes(), key)); } /** * 使用默认公钥加密字符串 * @param xml 需加密的字符串 * @return 加密后的字符串 * @throws Exception */ public static String encrypt(String xml) throws Exception { return encrypt(xml, strDefaultKey); } /** * 解密字节数组 * * @param arrB * 需解密的字节数组 * @param key * 密钥 * @return 解密后的字节数组 * @throws Exception */ public static byte[] decrypt(byte[] arrB, String key) throws Exception { DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey secretKey = keyFactory.generateSecret(desKeySpec); IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv); Cipher decryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); decryptCipher.init(Cipher.DECRYPT_MODE, secretKey, ivp); return decryptCipher.doFinal(arrB); } /** * 解密字符串 * * @param xml * 需解密的字符串 * @param key * 密钥 * @return 解密后的字符串 * @throws Exception */ public static String decrypt(String xml, String key) throws Exception { return new String(decrypt(DESPlus.dec.decodeBuffer(xml), key)); } /** * 使用默认公钥解密字符串 * @param xml 需解密的字符串 * @return 解密后的字符串 * @throws Exception */ public static String decrypt(String xml) throws Exception { return decrypt(xml, strDefaultKey); } /** * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位 * * @param arrBTmp * 构成该字符串的字节数组 * @return 生成的密钥 * @throws java.lang.Exception */ private Key getKey(byte[] arrBTmp) throws Exception { // 创建一个空的8位字节数组(默认值为0) byte[] arrB = new byte[8]; // 将原始字节数组转换为8位 for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { arrB[i] = arrBTmp[i]; } // 生成密钥 Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); return key; } /** * 获取默认密钥 * @return */ public static String getDesKey() { return DESPlus.strDefaultKey; } public static void main(String[] args) { try { //测试密匙 String key = "BOC_PLFP"; //004交易案例 String xml = "< xml version=\"1.0\" encoding=\"UTF-8\" >
00417850COM011109141222222660161
0000000123客户信息不完整,请补充资料。
"; System.out.println("密钥:" + key); System.out.println("加密前的字符串:" + xml); System.out.println("加密前的字符串长度:" + xml.getBytes().length); //加密 xml = DESPlus.encrypt(xml, key); System.out.println("加密后的字符串:" + xml); System.out.println("加密后的字符串长度:" + xml.getBytes().length); //解密 xml = DESPlus.decrypt(xml, key); System.out.println("解密后的字符串:" + xml); System.out.println("解密后的字符串长度:" + xml.getBytes().length); } catch (Exception e) { e.printStackTrace(); } } }

上面运行结果为:

密钥:BOC_PLFP
加密前的字符串:< xml version="1.0" encoding="UTF-8" >

00417850COM011109141222222660161
0000000123客户信息不完整,请补充资料。
加密前的字符串长度:262
加密后的字符串:bE5N44gjyfO3SdUs6/OhVg4I4l725S2vWcKBRxYOAd/eAnyuADKXeNNgVXJMj3aJJzndntv364rh
YW2bF33lmEABMU43HfS8DcXX7+QrcIjp3mrk7uJdiNH