Ejemplo 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);
        }
Ejemplo n.º 2
0
        public static ICryptoTransform CreateWeakEncryptor(this DESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv, int mode)
        {
            MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

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

            return(trans);
        }
Ejemplo n.º 3
0
    // Mode = 0 encrypt, 1 decrypt
    public static ICryptoTransform CreateWeakEncryptor(this DESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv, int mode = 0)
    {
        // reflective way of doing what CreateEncryptor() does, bypassing the check for weak keys
        MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

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

        return(trans);
    }
Ejemplo n.º 4
0
        public static ICryptoTransform CreateWeakDesEncryptor(CipherMode mode, byte[] rgbKey, byte[] rgbIV)
        {
            DES des = DES.Create();

            des.Mode = mode;
            DESCryptoServiceProvider sm = des as DESCryptoServiceProvider;
            MethodInfo mi = sm.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

            object[]         Par   = { rgbKey, mode, rgbIV, sm.FeedbackSize, 0 };
            ICryptoTransform trans = mi.Invoke(sm, Par) as ICryptoTransform;

            return(trans);
        }
Ejemplo n.º 5
0
        public static byte[] DESEncrypt(byte[] plaintext, byte[] key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            des.Padding = PaddingMode.None;
            MemoryStream mStream = new MemoryStream();

            FieldInfo fi = des.GetType().GetField("FeedbackSizeValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            var       FeedbackSizeValue = fi.GetValue(des);

            Type   t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
            object cryptoAPITransformMode = 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 = mi.Invoke(des, new object[] { key, CipherMode.ECB, null, FeedbackSizeValue, cryptoAPITransformMode }) as ICryptoTransform;

            CryptoStream cStream = new CryptoStream(mStream, desCrypt, CryptoStreamMode.Write);

            cStream.Write(plaintext, 0, plaintext.Length);
            cStream.FlushFinalBlock();
            return(mStream.ToArray());
        }
Ejemplo n.º 6
0
        /// <summary>
        /// DES字节数组解密,可以使用弱密钥
        /// </summary>
        /// <param name="source"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte[] Decrypt(byte[] source, byte[] key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            des.Padding = PaddingMode.None;

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

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

            return(desCrypt.TransformFinalBlock(source, 0, source.Length));
        }
Ejemplo n.º 7
0
        public static string DesCBCDe(string cipher, string key, string icv = "0000000000000000")
        {
            cipher = ConvertTool.RemoveSpace(cipher);
            key    = ConvertTool.RemoveSpace(key);
            icv    = ConvertTool.RemoveSpace(icv);

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

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            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("-", ""));

            /*          DESCryptoServiceProvider des = new DESCryptoServiceProvider();
             *        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();*/
        }
Ejemplo n.º 8
0
        public static string DES_DecryptData(byte[] indata, byte[] desKey, CipherMode cm, PaddingMode pm)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            byte[] outdata = new byte[des.FeedbackSize];
            byte[] resdata = new byte[((indata.Length % 8) == 0) ? indata.Length : ((indata.Length / 8) + 1) * 8];
            byte[] iv = new byte[des.BlockSize / 8];
            int    i = 0, o = 0;

            for (i = 0; i < des.BlockSize / 8; i++)
            {
                iv[i] = 0;
            }
            des.Mode    = cm;
            des.Padding = pm;
            ICryptoTransform ct = null;

            if (System.Security.Cryptography.DES.IsWeakKey(desKey))
            {
                MethodInfo mi  = des.GetType().GetMethod("_NewDecryptor", BindingFlags.NonPublic | BindingFlags.Instance);
                object[]   par = { desKey, des.Mode, iv, des.FeedbackSize, 0 };
                ct = (ICryptoTransform)mi.Invoke(des, par);
            }
            else
            {
                ct = des.CreateDecryptor(desKey, iv);
            }
            i = 0; o = 0;
            while ((i + des.BlockSize / 8) < indata.Length)
            {
                ct.TransformBlock(indata, i, des.BlockSize / 8, outdata, 0);
                Array.Copy(outdata, 0, resdata, o, des.BlockSize / 8);
                i += des.BlockSize / 8;
                o += des.BlockSize / 8;
            }
            byte[] temp = ct.TransformFinalBlock(indata, i, indata.Length - i);
            Array.Copy(temp, 0, resdata, o, temp.Length);
            des.Clear();
            return(Utils.Bin2AHex(resdata));
        }
Ejemplo n.º 9
0
        public static byte[] EncryptECBAnyKey(byte[] data, byte[] key, byte[] iv)
        {
            if (key.Length != 8)
            {
                throw new Exception("key长度应为8字节");
            }
            if (iv.Length != 8)
            {
                throw new Exception("iv长度应为8字节");
            }
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            des.Padding = PaddingMode.None;

            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, iv, 0, obj });

            byte[] result = desCrypt.TransformFinalBlock(data, 0, data.Length);
            return(result);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// DES½âÃÜ
        /// </summary>
        /// <param name="decryptString">ÃÜÎÄ</param>
        /// <param name="decryptKey">Ãܳף¨8룩</param>
        /// <returns></returns>
        public static byte[] DESDecrypt(byte[] byteDecrypt, byte[] byteKey)
        {
            if (byteKey.Length != 8)
            {
                throw new Exception("Key length error!");
            }

            byte[] result = new byte[0];
            try
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                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[] { byteKey, CipherMode.ECB, null, 0, obj });
                result = desCrypt.TransformFinalBlock(byteDecrypt, 0, byteDecrypt.Length);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(result);
        }
Ejemplo n.º 11
0
        public int GenerateBlackboxOutputBit(int[] IV, int[] key, int length)
        {
            // public bits := plaintext
            // secret bits := key
            SymmetricAlgorithm p_alg      = new DESCryptoServiceProvider();
            string             secretBits = string.Empty;
            string             publicBits = string.Empty;

            // save public and secret bits as string
            for (int i = 0; i < key.Length; i++)
            {
                secretBits += key[i];
            }
            for (int i = 0; i < IV.Length; i++)
            {
                publicBits += IV[i];
            }

            // convert secret bits to byte array
            int[] arrInt = new int[8];
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (secretBits[(8 * i) + j] == '1')
                    {
                        arrInt[i] += (int)Math.Pow(2, 7 - j);
                    }
                }
            }
            byte[] keyByte = new byte[8];
            for (int i = 0; i < arrInt.Length; i++)
            {
                keyByte[i] = (byte)arrInt[i];
            }

            // convert public bits to byte array
            arrInt = new int[8];
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (publicBits[(8 * i) + j] == '1')
                    {
                        arrInt[i] += (int)Math.Pow(2, 7 - j);
                    }
                }
            }
            byte[] publicByte = new byte[8];
            for (int i = 0; i < arrInt.Length; i++)
            {
                publicByte[i] = (byte)arrInt[i];
            }

            ICryptoTransform p_encryptor;

            p_alg.IV      = new byte[8];
            p_alg.Padding = PaddingMode.Zeros;
            try
            {
                p_alg.Key = keyByte;
            }
            catch
            {
                //dirty hack to allow weak keys:
                FieldInfo field = p_alg.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
                field.SetValue(p_alg, keyByte);
            }
            try
            {
                p_encryptor = p_alg.CreateEncryptor();
            }
            catch
            {
                //dirty hack to allow weak keys:
                MethodInfo mi  = p_alg.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
                object[]   Par = { p_alg.Key, p_alg.Mode, p_alg.IV, p_alg.FeedbackSize, 0 };
                p_encryptor = mi.Invoke(p_alg, Par) as ICryptoTransform;
            }

            Stream inputPublic = new MemoryStream(publicByte);
            // starting encryption
            CryptoStream p_crypto_stream = new CryptoStream(inputPublic, p_encryptor, CryptoStreamMode.Read);

            byte[] buffer = new byte[p_alg.BlockSize / 8];
            p_crypto_stream.Read(buffer, 0, buffer.Length);

            // convert encrypted block to binary string
            string strBytes = string.Empty;

            for (int i = 0; i < buffer.Length; i++)
            {
                for (int j = 7; j >= 0; j--)
                {
                    strBytes += (buffer[i] & 1 << j) > 0 ? 1 : 0;
                }
            }
            p_crypto_stream.Flush();

            // return single output bit
            return(Int32.Parse(strBytes.Substring(length - 1, 1)));
        }