JAVA、C# DES通用加解密

原文:http://www.cnblogs.com/Alex80/p/5261710.html

JAVA用DES加密C#用DES解密的实现,C#用DES加密JAVA用DES解密(保持key一致)
JAVA code:

    //加密
    public static String encrypt(String value,String key) {
        String result = "";
        try {
            value = java.net.URLEncoder.encode(value, "utf-8");
            result = toHexString(encryptTmp(value, key)).toUpperCase();
        } catch (Exception ex) {
            ex.printStackTrace();
            return "";
        }
        return result;
    }

    // 解密
    public static String decrypt(String message, String key) throws Exception {

        byte[] bytesrc = convertHexString(message);
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] retByte = cipher.doFinal(bytesrc);
        return new String(retByte);
    }

    public static byte[] encryptTmp(String message, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        return cipher.doFinal(message.getBytes("UTF-8"));
    }

    public static byte[] convertHexString(String ss) {
        byte digest[] = new byte[ss.length() / 2];
        for (int i = 0; i < digest.length; i++) {
            String byteString = ss.substring(2 * i, 2 * i + 2);
            int byteValue = Integer.parseInt(byteString, 16);
            digest[i] = (byte) byteValue;
        }
        return digest;
    }

    public static String toHexString(byte b[]) {
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            String plainText = Integer.toHexString(0xff & b[i]);
            if (plainText.length() < 2)
                plainText = "0" + plainText;
            hexString.append(plainText);
        }
        return hexString.toString();
    }

C# code:

public static string Encode(string str, string key)  
{  
    try  
    {  
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();  
        provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));  
        provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));  
        byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);  
        MemoryStream stream = new MemoryStream();  
        CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);  
        stream2.Write(bytes, 0, bytes.Length);  
        stream2.FlushFinalBlock();  
        StringBuilder builder = new StringBuilder();  
        foreach (byte num in stream.ToArray())  
        {  
            builder.AppendFormat("{0:X2}", num);  
        }  
        stream.Close();  
        return builder.ToString();  
    }  
    catch (Exception) { return "xxxx"; }  
}

public static string Decode(string str, string key)  
{  
    try  
    {  
        DESCryptoServiceProvider provider = new DESCryptoServiceProvider();  
        provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));  
        provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));  
        byte[] buffer = new byte[str.Length / 2];  
        for (int i = 0; i < (str.Length / 2); i++)  
        {  
            int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);  
            buffer[i] = (byte)num2;  
        }  
        MemoryStream stream = new MemoryStream();  
        CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);  
        stream2.Write(buffer, 0, buffer.Length);  
        stream2.FlushFinalBlock();  
        stream.Close();  
        return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());  
    }  
    catch (Exception) { return ""; }  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值