今天刚接触DES,有很多问题搞不懂,希望各位高手解答下:
第一:DES的密钥是不是只能是8位?在VS2005中网上查了不少方法可是基本密钥都限死在8位,我的BOSS却提供了一个14位的密钥,另我很头痛,如果可以大于8位,希望热心网友贴出来,学习一下
第二:DES生成的密码是不是固定的!我在VS大于8位的密码才会生成32位的密码,可是BOSS说他那边固定16位的,我又郁闷了,还是请高手解答。
我用的是VS2005的方法!

解决方案 »

  1.   

    没人回答吗?还是大家都在吃饭!补充一下,我要实现的是我这边用C#加密,然后给BOSS,他在用Delphi解密!自己顶下
      

  2.   

    /// <summary>
        /// 进行DES加密。
        /// </summary>
        /// <param name="pToEncrypt">要加密的字符串。</param>
        /// <param name="sKey">密钥,且必须为8位。</param>
        /// <returns>以Base64格式返回的加密字符串。</returns>
        public string Encrypt(string pToEncrypt, string sKey)
        {
            using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
            {
                byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
                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.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    cs.Close();
                }
                string str = Convert.ToBase64String(ms.ToArray());
                ms.Close();
                return str;
            }
        }    /**/
        /// <summary>
        /// 进行DES解密。
        /// </summary>
        /// <param name="pToDecrypt">要解密的以Base64</param>
        /// <param name="sKey">密钥,且必须为8位。</param>
        /// <returns>已解密的字符串。</returns>
        //public string Decrypt(string pToDecrypt, string sKey)
        //{
        //    byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
        //    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        //    {
        //        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;
        //    }
        //}        
      

  3.   

    DES将明文分割成许多64位大小的块,每个块用64位密钥进行加密,密钥由56位数据位和8位奇偶校验位组成 
    http://topic.csdn.net/u/20090501/18/d448ae36-41d6-4dd3-9969-30617f06841d.html
      

  4.   

    楼上的言外之意就是DES加密的密钥只能是8位了?还是说在C#里面只能是8位!
      

  5.   

    额,能具体点吗?或者把方法直接贴出来,我BOSS就是用的14位的,想半天没想明白!
      

  6.   

    昨天在BS中用DS给三个文件加密,然后在CS中解密;
    如果明天你还米的更好的答案,我再给你
      

  7.   

    好的!你明天回公司的时候发我研究下!邮箱[email protected],先谢谢了!
      

  8.   

    有没有好心的网友解释下为什么?今天试了网上绝大部分提供的DES函数,可是运算的结果却始终与BOSS的对不上号,顺便问下,DES的偏移量是不是和密钥是一样的?
      

  9.   


    拿你 Boss 的 Delphi 版解密算法过来,转成 C# 版的就是
      

  10.   


    用的是不是3DES加密,和DES有所区别,最小密钥长度是14位
      

  11.   

    BOSS只会弄delphi,我弄了半天,有点眉目了!原来是DES模式的问题,应该为ECB模式,可是又来个问题,明文在加密时会自动补足8位,别入明文为123456,那么它加密是会成为123456#2#2,最后的密文又和delphi有区别,我是彻底崩溃了!
      

  12.   

    我弄了半天,有点眉目了!原来是DES模式的问题,应该为ECB模式,可是又来个问题,明文在加密时会自动补足8位,别入明文为123456,那么它加密是会成为123456#2#2,最后的密文又和delphi有区别,我是彻底崩溃了!
      

  13.   

    总之C#生成的密文与delphi还是不一样,举个列子:明文为123456生成密文后拿到BOSS哪里翻译后却成了123456**
    后面会出现两个特殊字符,补足八位,哪位高手提示下怎么在C#里加密时关闭或者处理掉这些特殊字符!~非常感谢大家的帮助
      

  14.   


    你的BOSS用的是3DES的ECB模式delphi的代码
    http://topic.csdn.net/t/20050913/14/4266426.htmlC#的代码
    http://liuzongan.javaeye.com/blog/443069
      

  15.   

    他用的什么方式我不知道,我也看到一些3DES加密的方法!可是密钥必须为16位或者24位,问题来了,他提供的密钥是12位,我在DES TOOL上实验过,仅用DES加密数据和他提供的一致,所以他并没有采用3DES!我崩溃,BOSS是个忙人整天见不到人,总是那么一句话:“我不懂C#,你自己搞吧”
      

  16.   

    终于经过一番波折,搞定,说起来很简单,主要是DES模式和空位填充的问题,做完后感觉花了这么长的时间有点不值,也说明本人学习方法有待提高,说下我怎么实现的吧!
    给以后的初学者一点提示:
    delphi的DES模式一般默认为ECB模式,而C#你不声明模式的话,它会是CBC模式,这就是为什么C#默认会有个IV偏移量的问题,而ECB中是没有IV这一说的,其次了解DES算法的人都知道,当明文不是8的整数倍时会自动补足,问题来了,在C#中默认缺几位补缺位数值,如缺3位,那么后面是#3#3#3代替,delphi中却是以0补齐8位,所以要定义补齐的方式;两句话花了我一天时间
    加密代码:
    public string Encrypt(string pToEncrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();        byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
            des.Key = Encoding.UTF8.GetBytes(sKey.Substring(0, 8));
                des.Mode = CipherMode.ECB;//***模式选择
                des.Padding = PaddingMode.Zeros;//***补齐方式0
                //des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0,8));
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), 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);
                    }
                    //ret.ToString();
                    return ret.ToString();
            
        }
      

  17.   

    我是新手   现在也遇到这样的问题》》》   不过我不会delphi
        我想问   如果我密码大于8位    我可不可以  吧文件加密两遍(这样就可以使用16位了)解密的时候也解两遍
              想请教楼主  及各位大虾    我这样做可不可以!!!