zoukankan      html  css  js  c++  java
  • 分享2个Java转C#加密解密的算法

    最近老是碰到和其他项目对接,对方项目采用JAVA,对于调用api时通常会 设计到对参数的加密解密。这时候就需要把对方的加密算法用C#实现一遍。

    直接上代码。

    Java

     private static byte[] iv = {1,2,3,4,5,6,7,8};    
        public static String encryptDES(String encryptString, String encryptKey) throws Exception {    
    //      IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);    
            IvParameterSpec zeroIv = new IvParameterSpec(iv);    
            SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes("utf-8"), "DES");    
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");    
            cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);    
            byte[] encryptedData = cipher.doFinal(encryptString.getBytes("utf-8"));    
             
            return Base64_BAK.encode(encryptedData);    
        }    
        public static String decryptDES(String decryptString, String decryptKey) throws Exception {    
            byte[] byteMi = new Base64_BAK().decode(decryptString);    
            IvParameterSpec zeroIv = new IvParameterSpec(iv);    
    //      IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);    
            SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes("utf-8"), "DES");    
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");    
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);    
            byte decryptedData[] = cipher.doFinal(byteMi);    
            String retrdecryptedData = new String(decryptedData,"UTF-8");
            return retrdecryptedData;    
        }   
    

      对字符进行编码的代码

    class Base64_BAK {    
        private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();    
        /**  
         * data[]进行编码  
         * @param data  
         * @return  
         */    
            public static String encode(byte[] data) {    
                int start = 0;    
                int len = data.length;    
                StringBuffer buf = new StringBuffer(data.length * 3 / 2);    
        
                int end = len - 3;    
                int i = start;    
                int n = 0;    
        
                while (i <= end) {    
                    int d = ((((int) data[i]) & 0x0ff) << 16)    
                            | ((((int) data[i + 1]) & 0x0ff) << 8)    
                            | (((int) data[i + 2]) & 0x0ff);    
        
                    buf.append(legalChars[(d >> 18) & 63]);    
                    buf.append(legalChars[(d >> 12) & 63]);    
                    buf.append(legalChars[(d >> 6) & 63]);    
                    buf.append(legalChars[d & 63]);    
        
                    i += 3;    
        
                    if (n++ >= 14) {    
                        n = 0;    
                        buf.append(" ");    
                    }    
                }    
        
                if (i == start + len - 2) {    
                    int d = ((((int) data[i]) & 0x0ff) << 16)    
                            | ((((int) data[i + 1]) & 255) << 8);    
        
                    buf.append(legalChars[(d >> 18) & 63]);    
                    buf.append(legalChars[(d >> 12) & 63]);    
                    buf.append(legalChars[(d >> 6) & 63]);    
                    buf.append("=");    
                } else if (i == start + len - 1) {    
                    int d = (((int) data[i]) & 0x0ff) << 16;    
        
                    buf.append(legalChars[(d >> 18) & 63]);    
                    buf.append(legalChars[(d >> 12) & 63]);    
                    buf.append("==");    
                }    
        
                return buf.toString();    
            }    
        
            private static int decode(char c) {    
                if (c >= 'A' && c <= 'Z')    
                    return ((int) c) - 65;    
                else if (c >= 'a' && c <= 'z')    
                    return ((int) c) - 97 + 26;    
                else if (c >= '0' && c <= '9')    
                    return ((int) c) - 48 + 26 + 26;    
                else    
                    switch (c) {    
                    case '+':    
                        return 62;    
                    case '/':    
                        return 63;    
                    case '=':    
                        return 0;    
                    default:    
                        throw new RuntimeException("unexpected code: " + c);    
                    }    
            }    
        
            /**  
             * Decodes the given Base64 encoded String to a new byte array. The byte  
             * array holding the decoded data is returned.  
             */    
        
            public static byte[] decode(String s) {    
        
                ByteArrayOutputStream bos = new ByteArrayOutputStream();    
                try {    
                    decode(s, bos);    
                } catch (IOException e) {    
                    throw new RuntimeException();    
                }    
                byte[] decodedBytes = bos.toByteArray();    
                try {    
                    bos.close();    
                    bos = null;    
                } catch (IOException ex) {    
                    System.err.println("Error while decoding BASE64: " + ex.toString());    
                }    
                return decodedBytes;    
            }    
        
            private static void decode(String s, OutputStream os) throws IOException {    
                int i = 0;    
        
                int len = s.length();    
        
                while (true) {    
                    while (i < len && s.charAt(i) <= ' ')    
                        i++;    
        
                    if (i == len)    
                        break;    
        
                    int tri = (decode(s.charAt(i)) << 18)    
                            + (decode(s.charAt(i + 1)) << 12)    
                            + (decode(s.charAt(i + 2)) << 6)    
                            + (decode(s.charAt(i + 3)));    
        
                    os.write((tri >> 16) & 255);    
                    if (s.charAt(i + 2) == '=')    
                        break;    
                    os.write((tri >> 8) & 255);    
                    if (s.charAt(i + 3) == '=')    
                        break;    
                    os.write(tri & 255);    
        
                    i += 4;    
                }    
        }
    

      对应的C#加密和解密算法如下

       static String encode(byte[] data)
            {
                int start = 0;
                int len = data.Length;
                StringBuilder buf = new StringBuilder(data.Length * 3 / 2);
                var legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray();
                int end = len - 3;
                int i = start;
                int n = 0;
    
                while (i <= end)
                {
                    int d = ((((int)data[i]) & 0x0ff) << 16)
                            | ((((int)data[i + 1]) & 0x0ff) << 8)
                            | (((int)data[i + 2]) & 0x0ff);
    
                    buf.Append(legalChars[(d >> 18) & 63]);
                    buf.Append(legalChars[(d >> 12) & 63]);
                    buf.Append(legalChars[(d >> 6) & 63]);
                    buf.Append(legalChars[d & 63]);
    
                    i += 3;
    
                    if (n++ >= 14)
                    {
                        n = 0;
                        buf.Append(" ");
                    }
                }
    
                if (i == start + len - 2)
                {
                    int d = ((((int)data[i]) & 0x0ff) << 16)
                            | ((((int)data[i + 1]) & 255) << 8);
    
                    buf.Append(legalChars[(d >> 18) & 63]);
                    buf.Append(legalChars[(d >> 12) & 63]);
                    buf.Append(legalChars[(d >> 6) & 63]);
                    buf.Append("=");
                }
                else if (i == start + len - 1)
                {
                    int d = (((int)data[i]) & 0x0ff) << 16;
    
                    buf.Append(legalChars[(d >> 18) & 63]);
                    buf.Append(legalChars[(d >> 12) & 63]);
                    buf.Append("==");
                }
    
                return buf.ToString();
            }
            private static string Encrypt(string str, string sKey, byte[] iv)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.Default.GetBytes(str);
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);// 密匙
                //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
                des.IV = iv;// 初始化向量
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                var retB = encode(ms.ToArray());
                return retB;
            }
    
            private static string Decrypt(string pToDecrypt, string sKey,byte[] iv)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
                //byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };
                des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                des.IV = iv;
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                // 如果两次密匙不一样,这一步可能会引发异常
                cs.FlushFinalBlock();
    
                return System.Text.Encoding.Default.GetString(ms.ToArray());
            }
    

      Java加密解密算法

      public static String decryptDES(String decryptString, String decryptKey) throws Exception {
            String afterDecryptString = null;
            byte[] byteMi = new Base64().decode(decryptString);
            try {
                SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
                Cipher cipher = Cipher.getInstance("DES");
                cipher.init(2, key);
                byte[] decryptData = cipher.doFinal(byteMi);
                afterDecryptString = new String(decryptData, "UTF-8");
            } catch (Exception e) {
                log.error("decryptDES error", e);
                throw e;
            }
            return afterDecryptString;
        }
    

      C#代码

      public static string Decrypt(string pToDecrypt, string sKey)
            {
               
                //var inputByteArray = ASCIIEncoding.ASCII.GetBytes(pToDecrypt);
                byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
               
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) {
                    //des.Padding =PaddingMode.PKCS7;
                    des.Mode = CipherMode.ECB;
                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
                    System.IO.MemoryStream ms = new System.IO.MemoryStream();
                    using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(inputByteArray, 0, inputByteArray.Length);
                        cs.FlushFinalBlock();
                        cs.Close();
                    }
                    string str = Encoding.UTF8.GetString(ms.ToArray());
                    ms.Close();
                    return str;
                }
            }
    

      

  • 相关阅读:
    济群法师:《大乘百法明门论》讲记·视频·音频·MP3
    dict.cn海词:划词助手划遍天下网
    求解:nunit如何测试ConfigurationManager呢?
    spring.net快速入门
    好书推荐:《数学与知识的探求》
    《货币战争》的一点感想
    买了《精通spring 2.0》
    《spring 2.0技术手册》的技术写作方式值得学习!
    关于Erlang语言
    rss阅读器最重要的几项功能
  • 原文地址:https://www.cnblogs.com/Playfunny/p/11428934.html
Copyright © 2011-2022 走看看