天天看點

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() / ];
        for (int i = ; i < digest.length; i++) {
            String byteString = ss.substring( * i,  * i + );
            int byteValue = Integer.parseInt(byteString, );
            digest[i] = (byte) byteValue;
        }
        return digest;
    }

    public static String toHexString(byte b[]) {
        StringBuffer hexString = new StringBuffer();
        for (int i = ; i < b.length; i++) {
            String plainText = Integer.toHexString( & b[i]);
            if (plainText.length() < )
                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(, ));  
        provider.IV = Encoding.ASCII.GetBytes(key.Substring(, ));  
        byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);  
        MemoryStream stream = new MemoryStream();  
        CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);  
        stream2.Write(bytes, , 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(, ));  
        provider.IV = Encoding.ASCII.GetBytes(key.Substring(, ));  
        byte[] buffer = new byte[str.Length / ];  
        for (int i = ; i < (str.Length / ); i++)  
        {  
            int num2 = Convert.ToInt32(str.Substring(i * , ), );  
            buffer[i] = (byte)num2;  
        }  
        MemoryStream stream = new MemoryStream();  
        CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);  
        stream2.Write(buffer, , buffer.Length);  
        stream2.FlushFinalBlock();  
        stream.Close();  
        return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());  
    }  
    catch (Exception) { return ""; }  
}