Esempio n. 1
0
        /// <summary>
        /// DES/3DES加密
        /// </summary>
        /// <param name="reqData"></param>
        /// <param name="encryptKey"></param>
        /// <returns></returns>
        public static byte[] desEncrypt(byte[] reqDataBytes, byte[] encryptKeyBytes)
        {
            int desMode = 0;                //1:3des,2:des

            byte[] encryptDataBytes = null; //加密后的数据


            if (encryptKeyBytes.Length == 8)
            {
                desMode = 2;
            }
            else if (encryptKeyBytes.Length == 16 || encryptKeyBytes.Length == 24)
            {
                desMode = 1;
            }
            //3DES加密
            if (desMode == 1)
            {
                TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
                des.Padding = PaddingMode.None;

                //通过反射赋值,绕开弱密钥检查
                FieldInfo fi = des.GetType().GetField("KeyValue", BindingFlags.Instance | BindingFlags.NonPublic);
                fi.SetValue(des, encryptKeyBytes);
                fi = des.GetType().GetField("KeySizeValue", BindingFlags.Instance | BindingFlags.NonPublic);
                fi.SetValue(des, encryptKeyBytes.Length * 8);

                Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

                MethodInfo       mi        = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform encryptor = (ICryptoTransform)mi.Invoke(des, new object[] { encryptKeyBytes, CipherMode.ECB, null, 0, obj });
                encryptDataBytes = encryptor.TransformFinalBlock(reqDataBytes, 0, reqDataBytes.Length);
            }
            //DES加密
            else if (desMode == 2)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                //des.IV = encryptKeyBytes;
                des.Padding = PaddingMode.None;

                //通过反射赋值,绕开弱密钥检查
                FieldInfo fi = des.GetType().GetField("KeyValue", BindingFlags.Instance | BindingFlags.NonPublic);
                fi.SetValue(des, encryptKeyBytes);
                fi = des.GetType().GetField("KeySizeValue", BindingFlags.Instance | BindingFlags.NonPublic);
                fi.SetValue(des, encryptKeyBytes.Length * 8);

                Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

                MethodInfo       mi        = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform encryptor = (ICryptoTransform)mi.Invoke(des, new object[] { encryptKeyBytes, CipherMode.ECB, null, 0, obj });
                encryptDataBytes = encryptor.TransformFinalBlock(reqDataBytes, 0, reqDataBytes.Length);
            }


            return(encryptDataBytes);
        }
Esempio n. 2
0
        /// <summary>
        /// 3DES加密ECB模式(JAVA封装的DES算法的默认模式),支持弱密钥
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] TripleDESEncodeECB(byte[] key, byte[] data)
        {
            try
            {
                MemoryStream mStream = new MemoryStream();
                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.ECB;
                //tdsp.Padding = PaddingMode.PKCS7;
                //tdsp.Key = key;

                Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

                MethodInfo       mi       = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(tdsp, new object[] { key, CipherMode.ECB, null, 0, obj });

                CryptoStream cStream = new CryptoStream(mStream, desCrypt, CryptoStreamMode.Write);
                cStream.Write(data, 0, data.Length);
                cStream.FlushFinalBlock();
                byte[] ret = mStream.ToArray();
                cStream.Close();
                mStream.Close();
                return(ret);//系统函数是默认24字节,用于3倍长DES算法,目前只用双倍16字节
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return(null);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 3DES解密ECB模式(JAVA封装的DES算法的默认模式),支持弱密钥
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] TripleDESDecodeECB(byte[] key, byte[] data)
        {
            try
            {
                MemoryStream msDecrypt = new MemoryStream(data);
                TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
                tdsp.Mode = CipherMode.CBC;
                //tdsp.Padding = PaddingMode.PKCS7;
                //tdsp.Key = key;
                Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

                MethodInfo       mi       = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(tdsp, new object[] { key, CipherMode.ECB, null, 0, obj });

                CryptoStream csDecrypt = new CryptoStream(msDecrypt, desCrypt, CryptoStreamMode.Read);

                byte[] fromEncrypt = new byte[data.Length];
                csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
                return(fromEncrypt);
            }
            catch (CryptographicException e)
            {
                Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
                return(null);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 3DES解密
        /// </summary>
        /// <returns>解密串</returns>
        /// <param name="encryptedStr"></param>
        /// <param name="key"></param>
        public static string Decrypt3DES(string encryptedStr, string key)
        {
            if (string.IsNullOrEmpty(encryptedStr))
            {
                return(encryptedStr);
            }
            try
            {
                var des = new TripleDESCryptoServiceProvider();

                des.Mode    = CipherMode.ECB;
                des.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
                Type             t          = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object           obj        = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);
                MethodInfo       mi         = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform DESDecrypt =
                    (ICryptoTransform)
                    mi.Invoke(des, new object[] { Encoding.ASCII.GetBytes(key), CipherMode.ECB, null, 0, obj });
                var    new_string = encryptedStr;//FromUrlEnCodeString(a_strString);
                byte[] Buffer     = Convert.FromBase64String(new_string);
                return(Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)));
            }
            catch (System.Exception)
            {
                return(string.Empty);
            }
        }
Esempio n. 5
0
        //3DES(DESede>Jave)24位KEY

        /// <summary>
        /// 3DES加密
        /// base64小细节,当使用get请求时,base64生成字符中有“+”号,
        /// 注意需要转换“%2B”,否则会被替换成空格。POST不存在
        /// while (str.IndexOf('+') != -1) {
        ///  str = str.Replace("+","%2B");
        //  }
        /// </summary>
        public static string Encrypt3DES(string content, string key)
        {
            if (string.IsNullOrEmpty(content))
            {
                return(content);
            }
            try
            {
                Encoding encoding = Encoding.GetEncoding("UTF-8");
                var      des      = new TripleDESCryptoServiceProvider();

                des.Mode = CipherMode.ECB;
                Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
                object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

                MethodInfo       mi       = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
                ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { Encoding.ASCII.GetBytes(key), CipherMode.ECB, null, 0, obj });
                byte[]           Buffer   = encoding.GetBytes(content);

                return(HttpUtility.UrlEncode(Convert.ToBase64String(desCrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))));
                //return ToUrlEnCodeString(Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)));
            }
            catch (System.Exception)
            {
                return(string.Empty);
            }
        }
Esempio n. 6
0
        public static string TripleDES_DecryptData(byte[] indata, byte[] tdesKey, byte[] iv, CipherMode cm, PaddingMode pm)
        {
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

            byte[] outdata = new byte[tdes.FeedbackSize];
            byte[] resdata = new byte[((indata.Length % 8) == 0) ? indata.Length : ((indata.Length / 8) + 1) * 8];
            tdes.Mode    = cm;
            tdes.Padding = pm;
            ICryptoTransform ct = null;

            if (System.Security.Cryptography.TripleDES.IsWeakKey(tdesKey))
            {
                MethodInfo mi  = tdes.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
                object[]   par = { tdesKey, tdes.Mode, iv, tdes.FeedbackSize, 1 };
                ct = (ICryptoTransform)mi.Invoke(tdes, par);
            }
            else
            {
                ct = tdes.CreateDecryptor(tdesKey, iv);
            }
            int i = 0, o = 0;

            while ((i + tdes.BlockSize / 8) < indata.Length)
            {
                ct.TransformBlock(indata, i, tdes.BlockSize / 8, outdata, 0);
                Array.Copy(outdata, 0, resdata, o, tdes.BlockSize / 8);
                i += tdes.BlockSize / 8;
                o += tdes.BlockSize / 8;
            }
            byte[] temp = ct.TransformFinalBlock(indata, i, indata.Length - i);
            Array.Copy(temp, 0, resdata, o, temp.Length);
            tdes.Clear();
            return(Utils.Bin2AHex(resdata));
        }
        public static ICryptoTransform CreateWeakEncryptor(this TripleDESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv)
        {
            MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

            object[] Par   = { key, cryptoProvider.Mode, iv, cryptoProvider.FeedbackSize, 1 };
            var      trans = mi.Invoke(cryptoProvider, Par) as ICryptoTransform;

            return(trans);
        }
Esempio n. 8
0
        /// <summary>
        /// 3DES-ECB解密,可与其他语言通用
        /// </summary>
        /// <param name="pToDecrypt">16进制待解密数据</param>
        /// <param name="sKey">16进制密钥 8字节?</param>
        /// <returns></returns>
        public static string Des3DecodeECBByAllKey(string pToDecrypt, string sKey)
        {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

            des.Mode    = CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            byte[] inputByteArray = HexStringToByteArray(pToDecrypt);
            byte[] inputKey       = HexStringToByteArray(sKey);

            Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
            object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

            MethodInfo[] methods = des.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
            int          count   = methods.Length;
            MethodInfo   mi      = des.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

            Object[]         param      = { inputKey, CipherMode.ECB, null, des.FeedbackSize, obj };
            ICryptoTransform DESEncrypt = mi.Invoke(des, param) as ICryptoTransform;

            //加密得到密文的byte[]形式
            byte[] byteResult = DESEncrypt.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);

            return(ByteArrayToHexString((byteResult)).Replace(" ", ""));
        }
Esempio n. 9
0
        public static string TriDesCBCDe(string cipher, string key, string icv = "0000000000000000")
        {
            cipher = ConvertTool.RemoveSpace(cipher);
            key    = ConvertTool.RemoveSpace(key);
            icv    = ConvertTool.RemoveSpace(icv);

            if (key.Length != 32 && key.Length != 48)
            {
                throw new Exception("Invalid Key, Not 16 or 24 bytes");
            }
            if (cipher.Length % 16 != 0 || cipher.Length == 0)
            {
                throw new Exception("Invalid Cipher, Not 8*n bytes");
            }
            if (icv.Length % 16 != 0)
            {
                throw new Exception("Invalid IV, Not 8 bytes");
            }

            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

            des.Padding = PaddingMode.None;

            Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
            object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

            MethodInfo       mi       = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
            ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { ConvertTool.String2Bytes(key), CipherMode.CBC, ConvertTool.String2Bytes(icv), 0, obj });

            byte[] result = desCrypt.TransformFinalBlock(ConvertTool.String2Bytes(cipher), 0, ConvertTool.String2Bytes(cipher).Length);
            return(BitConverter.ToString(result).Replace("-", ""));

            /*            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
             *          byte[] inputByteArray = ConvertTool.String2Bytes(cipher);
             *          des.Key = ConvertTool.String2Bytes(key);
             *          des.IV = ConvertTool.String2Bytes(icv);
             *          des.Mode = CipherMode.CBC;
             *          des.Padding = System.Security.Cryptography.PaddingMode.None;
             *          MemoryStream ms = new MemoryStream();
             *          CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
             *          cs.Write(inputByteArray, 0, inputByteArray.Length);
             *          cs.FlushFinalBlock();
             *          StringBuilder ret = new StringBuilder();
             *          foreach (byte b in ms.ToArray())
             *              ret.AppendFormat("{0:X2}", b);
             *
             *          return ret.ToString();*/
        }
Esempio n. 10
0
        public static String Decrypt(byte[] aData, byte[] aKey)
        {
            TripleDESCryptoServiceProvider pCipher = new TripleDESCryptoServiceProvider();

            pCipher.BlockSize    = 64;
            pCipher.Mode         = CipherMode.ECB;
            pCipher.Padding      = PaddingMode.None;
            pCipher.FeedbackSize = 64;
            pCipher.GenerateIV();
            MethodInfo mi = pCipher.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

            object[]         aObj       = { aKey, pCipher.Mode, pCipher.IV, pCipher.FeedbackSize, 1 };
            ICryptoTransform pTransform = mi.Invoke(pCipher, aObj) as ICryptoTransform;

            byte[] aResult = pTransform.TransformFinalBlock(aData, 0, aData.Length);
            pCipher.Clear();
            return(UTF8Encoding.UTF8.GetString(aResult));
        }
Esempio n. 11
0
        public static string WCPaySignDES3Encode(string data, string key)
        {
            TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();

            //DES.KeySize = 16;
            DES.Mode    = CipherMode.CBC;
            DES.Padding = PaddingMode.Zeros;
            Type       t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
            object     obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);
            MethodInfo mi  = DES.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);

            byte[]           keys     = str2Bcd(key);
            ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(DES, new object[] { keys, CipherMode.CBC, null, 0, obj });

            byte[] Buffer = Encoding.UTF8.GetBytes(data);
            byte[] result = desCrypt.TransformFinalBlock(Buffer, 0, Buffer.Length);

            return(bcd2Str(result));
        }
        public string TripleDesEncrypt(string source, string keystr)
        {
            byte[] data = Encoding.UTF8.GetBytes(source);
            byte[] key  = GetByteKey(keystr);
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

            des.Padding = PaddingMode.PKCS7;

            //Decrypt
            Type   t   = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
            object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);

            MethodInfo       mi       = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
            ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj });

            byte[] result = desCrypt.TransformFinalBlock(data, 0, data.Length);

            return(BitConverter.ToString(result).Replace("-", ""));
        }
Esempio n. 13
0
        /// <summary>
        /// 3DES-ECB加密,可与其他语言通用
        /// </summary>
        /// <param name="pToDecrypt">16进制待解密数据</param>
        /// <param name="sKey">16进制密钥 8字节?</param>
        /// <returns></returns>
        public static string Des3EncodeECBByAllKey(string pToDecrypt, string sKey)
        {
            TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

            tdsp.Mode    = CipherMode.ECB;
            tdsp.Padding = PaddingMode.Zeros;
            byte[] inputByteArray = HexStringToByteArray(pToDecrypt);
            byte[] inputKey       = HexStringToByteArray(sKey);

            MethodInfo mi = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

            Object[]         param      = { inputKey, CipherMode.ECB, null, tdsp.FeedbackSize, 0 };
            ICryptoTransform DESEncrypt = mi.Invoke(tdsp, param) as ICryptoTransform;

            //加密得到密文的byte[]形式
            byte[] byteResult = DESEncrypt.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);

            return(ByteArrayToHexString((byteResult)).Replace(" ", ""));
        }