黑马程序员技术交流社区

标题: DES加密,可以使用任意长度的密钥 [打印本页]

作者: ♂张耕明    时间: 2012-10-27 20:54
标题: DES加密,可以使用任意长度的密钥
本帖最后由 ♂张耕明 于 2012-10-27 20:56 编辑

DES:数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。

        /// <summary>
        /// 使用DES加密字符串
         /// </summary>
        /// <param name="source">要加密的字符串</param>
        /// <param name="key">加密密匙</param>
        /// <returns>加密后的字符串</returns>
        private static string EncryptByDES(string source, string key)
        {
            byte[] input = Encoding.Default.GetBytes(key);
            byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };
            if (input.Length > 16)
            {
                Console.WriteLine("只能输入8个汉字或者16个字符!");
                return null;
            }
            input.CopyTo(temp, 0);
            DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();//实例化DES加密服务类
              cryptoService.Mode = CipherMode.CBC;//使用的加密模式
              cryptoService.IV = temp.Take(8).ToArray();//定义偏移量
              cryptoService.Key = temp.Skip(8).ToArray();//定义密钥
              ICryptoTransform encryptor = cryptoService.CreateEncryptor();//使用加密服务对象创建一个对流执行加密转换的加密器
              byte[] byteArr = Encoding.Default.GetBytes(source);//把源字符串放到字节数组中
              return Convert.ToBase64String(encryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用加密器加密数据
        }
        /// <summary>
        /// 使用DES解密字符串
         /// </summary>
        /// <param name="source">要解密的字符串</param>
        /// <param name="key">解密密匙</param>
        /// <returns>解密后的字符串</returns>
        private static string DecryptByDES(string source, string key)
        {
            byte[] input = Encoding.Default.GetBytes(key);
            byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };
            if (input.Length > 16)
            {
                Console.WriteLine("错误的密匙");
                return null;
            }
            input.CopyTo(temp, 0);
            DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();
            cryptoService.Mode = CipherMode.CBC;
            cryptoService.IV = temp.Take(8).ToArray();
            cryptoService.Key = temp.Skip(8).ToArray();
            byte[] byteArr = Convert.FromBase64String(source);//把源字符串放到字节数组中
              ICryptoTransform decryptor = cryptoService.CreateDecryptor();//使用加密服务对象创建一个对流执行解密转换的解密器
              return Encoding.Default.GetString(decryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用解密器解密数据,密匙错误会抛异常
        }
3DES:(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

        /// <summary>
        /// 使用DES加密字符串
         /// </summary>
        /// <param name="source">要加密的字符串</param>
        /// <param name="key">加密密匙</param>
        /// <returns>加密后的字符串</returns>
        public static string EncryptBy3DES(string source, string key)
        {
            Regex reg = new Regex(@"[\w\W]{0,8}");
            MatchCollection matchs = reg.Matches(key);
            string result = source;
            foreach (Match match in matchs)
            {
                result = EncryptByDES(result, match.ToString());
            }
            return result;
        }
        /// <summary>
        /// 使用DES解密字符串
         /// </summary>
        /// <param name="source">要解密的字符串</param>
        /// <param name="key">解密密匙</param>
        /// <returns>解密后的字符串</returns>
        public static string DecryptBy3DES(string source, string key)
        {
            Regex reg = new Regex(@"[\w\W]{0,8}");
            MatchCollection matchs = reg.Matches(key);
            string result = source;
            for (int i = matchs.Count - 1; i >= 0; i--)
            {
                result = DecryptByDES(result, matchs.ToString());
            }
            return result;
        }

作者: 许庭洲    时间: 2012-10-28 08:01
1. AES密码是一个非对称密码体制,它的解密要比加密复杂和费时。
2. AES解密优化算法没有增加存储空间的基础上,以列变化为基础进行处理,程序比原始的要小,
3. 而且节约了时间。解密优化方法速度最快,效率最高,但要增加系统的存储空间,因此它的程序也是最大的一个.
作者: 郑鹏    时间: 2012-10-28 15:55
本帖最后由 郑鹏 于 2012-10-28 15:57 编辑

我这里有两个加密的类文件:
这个比较通用:
namespace 加密解密
  {
    class Program
    {
        static void Main(string[] args)
        {
            string s = "hello";
            string miwen = DES.DESEncrypt(s);
            Console.WriteLine(miwen);

            string jiemi = DES.DESDecrypt(miwen);
            Console.WriteLine(jiemi);

            Console.ReadKey();
        }
    }

    public class DES
    {
        /// <summary>
        /// 获取密钥
        /// </summary>
        private static string Key
        {
            get { return @"P@+#wG+Z"; }
        }

        /// <summary>
        /// 获取向量
        /// </summary>
        private static string IV
        {
            get { return @"L%n67}G\Mk@k%:~Y"; }
        }

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="plainStr">明文字符串</param>
        /// <returns>密文</returns>
        public static string DESEncrypt(string plainStr)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(Key);
            byte[] bIV = Encoding.UTF8.GetBytes(IV);
            byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);

            string encrypt = null;
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            try
            {
                using (MemoryStream mStream = new MemoryStream())
                {
                    using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        encrypt = Convert.ToBase64String(mStream.ToArray());
                    }
                }
            }
            catch { }
            des.Clear();

            return encrypt;
        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="encryptStr">密文字符串</param>
        /// <returns>明文</returns>
        public static string DESDecrypt(string encryptStr)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(Key);
            byte[] bIV = Encoding.UTF8.GetBytes(IV);
            byte[] byteArray = Convert.FromBase64String(encryptStr);

            string decrypt = null;
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            try
            {
                using (MemoryStream mStream = new MemoryStream())
                {
                    using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                    {
                        cStream.Write(byteArray, 0, byteArray.Length);
                        cStream.FlushFinalBlock();
                        decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                    }
                }
            }
            catch { }
            des.Clear();

            return decrypt;
        }
    }

}
这个比较简单(新手推荐,但无解密):

#region MD5加密字符串
    /// <summary>
    /// MD5加密字符串
    /// </summary>
    /// <param name="str">待加密字符串</param>
    /// <param name="code">16/32</param>
    /// <returns></returns>
    public static string MD5(string str, int code)
    {
        if (code == 16) //16位MD5加密(取32位加密的9~25字符)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToUpper().Substring(8, 16);
        }
        else//32位加密
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5");
        }
    }
    #endregion

}











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2