日期:2014-05-18  浏览次数:20862 次

::分享一个DES加密解密工具! 熟悉DES加密的请进!
在网上看到了尹学渊的DES加密解密工具,写的非常好
网址如下
http://www.cnblogs.com/erwin/archive/2009/04/14/1435288.html
但是我不会用C#解密 主要原因还是对DES算法不太了解,我试着用DESCryptoServiceProvider解密,但在尹学渊的《DES加密解密工具》中没有找到默认密钥向量rgbIV,最后解出来的字符串都是错误的。


这个问题已经折磨我半个月了,还请高手帮帮忙啊,如何写C#代码才能解密 尹学渊的那个《DES加密解密》程序?

如果能给个提示,就非常感激了,谢谢!

我使用的方法如下:
先把十六进制转成String,然后进行比较
C# code


        //默认密钥向量
        private byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };
        /// <summary>
        /// DES加密字符串
        /// </summary>
        /// <param name="encryptString">待加密的字符串</param>
        /// <param name="encryptKey">加密密钥,要求为8位</param>
        /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
        public string EncryptDES(string encryptString, string encryptKey)
        {
            try
            {
                byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Convert.ToBase64String(mStream.ToArray());
            }
            catch
            {
                return encryptString;
            }
        }

        /// <summary>
        /// DES解密字符串
        /// </summary>
        /// <param name="decryptString">待解密的字符串</param>
        /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
        /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
        public string DecryptDES(string decryptString, string decryptKey)
        {
            try
            {
                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
                byte[] rgbIV = Keys;
                byte[] inputByteArray = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
                MemoryStream mStream = new MemoryStream();
                CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cStream.Write(inputByteArray, 0, inputByteArray.Length);
                cStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(mStream.ToArray());
            }
            catch
            {
                return decryptString;
            }
        }

/// <summary>
    /// 将十六进制串转换为指定编码的字符串
    /// </summary>
    /// <param name="hex">十六进制串</param>
    /// <param name="encode">要转换成的字符串的编码</param>
    /// <returns>指定编码的字符串</returns>
    public static string ConvertStringFromHex(string hex, Encoding encode)
    {
        string src = string.Empty;
        int len = hex.Length / 2;
        byte[] buffer = new byte[len];
        for (int i = 0; i < len; i++)
        {
            buffer[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        }
        src = encode.GetString(buffer);
        return src;
    }




------解决方案--------------------
加密的时候把要加密的字符串用加盟那个方法,解密的时候把加密后的字符串带入解密方法即可。
------解决方案--------------------
谢谢分享,学习了
------解决方案--------------------
学习,顶起
------解决方案--------------------