decryptKey = decryptKey.Substring(2, 4) + decryptKey.Substring(4, 4);
                byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
                byte[] rgbIV = publicKeys;
                byte[] decryptBytes = Convert.FromBase64String(decryptString);
                DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, desProvider.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
                cs.Write(decryptBytes, 0, decryptBytes.Length);
                cs.FlushFinalBlock();
                return Encoding.UTF8.GetString(ms.ToArray(), 0, ms.ToArray().Length);
上面是源代码,比如输入“3432432”,加密结果为“73498hfidsui+984^#”,再对这个加密后的字符串解密,出来结果是“3”,后面的都丢失了。
为什么呢????????这个是网上比较标准的DES解密的写法了,为什么会不对呢?解密c#DES

解决方案 »

  1.   

    我用的这种。你可以试试! public class DESCE
        {
            /// <summary>
            /// DES 加密
            /// </summary>
            /// <param name="strValue"></param>
            /// <param name="strKey"></param>
            /// <returns></returns>
            public static string Encryp(string strValue, string strKey)
            {
                string EncrypString;
                byte[] key = ASCIIEncoding.ASCII.GetBytes(strKey.Substring(0, 8));
                byte[] iv = ASCIIEncoding.ASCII.GetBytes(strKey.Insert(0, "w").Substring(0, 8));
                if (strValue != "")
                {
                    try
                    {
                        DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
                        MemoryStream memStream = new MemoryStream();
                        using (memStream)
                        {
                            CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(key, iv), CryptoStreamMode.Write);
                            StreamWriter sWriter = new StreamWriter(crypStream);
                            sWriter.Write(strValue);
                            sWriter.Flush();
                            crypStream.FlushFinalBlock();
                            memStream.Flush();
                            EncrypString = Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
                        }
                    }
                    catch (ArgumentException)
                    {
                        EncrypString = null;
                    }
                    catch (CryptographicException)
                    {
                        EncrypString = null;
                    }
                }
                else
                {
                    EncrypString = "";
                }
                return EncrypString;
            }        /// <summary>
            /// DES解密
            /// </summary>
            /// <param name="EncValue"></param>
            /// <param name="strKey"></param>
            /// <returns></returns>
            public static string Decryp(string EncValue, string strKey)
            {
                string strValue;
                byte[] key = ASCIIEncoding.ASCII.GetBytes(strKey.Substring(0, 8));
                byte[] iv = ASCIIEncoding.ASCII.GetBytes(strKey.Insert(0, "w").Substring(0, 8));
                if (EncValue != "")
                {
                    try
                    {
                        DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
                        byte[] buffer = Convert.FromBase64String(EncValue);
                        MemoryStream memStream = new MemoryStream();
                        using (memStream)
                        {
                            CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(key, iv), CryptoStreamMode.Write);
                            crypStream.Write(buffer, 0, buffer.Length);
                            crypStream.FlushFinalBlock();
                            strValue = ASCIIEncoding.UTF8.GetString(memStream.ToArray());
                        }
                    }
                    catch (ArgumentException)
                    {
                        strValue = null;
                    }
                    catch (CryptographicException)
                    {
                        strValue = null;
                    }
                }
                else
                {
                    strValue = "";
                }
                return strValue;
            }
        }
      

  2.   

    用你的倒是没有问题了,可是我的问题在哪呢?P.S : 我想问一个非常小白的问题,这个byte[] key就是我们说的私钥吧,这个是可以随意定的吗?byte[] iv我自己用的是公钥,这个也是可以随便定的吗?
    我看网上还说这公钥私钥是一对的,好像还要特定生成不怎么的,实在不是很明白,求教一下~
      

  3.   


    用你的倒是没有问题了,可是我的问题在哪呢?P.S : 我想问一个非常小白的问题,这个byte[] key就是我们说的私钥吧,这个是可以随意定的吗?byte[] iv我自己用的是公钥,这个也是可以随便定的吗?
    我看网上还说这公钥私钥是一对的,好像还要特定生成不怎么的,实在不是很明白,求教一下~
      

  4.   


    用你的倒是没有问题了,可是我的问题在哪呢?P.S : 我想问一个非常小白的问题,这个byte[] key就是我们说的私钥吧,这个是可以随意定的吗?byte[] iv我自己用的是公钥,这个也是可以随便定的吗?
    我看网上还说这公钥私钥是一对的,好像还要特定生成不怎么的,实在不是很明白,求教一下~我也是用到这个在网上找的,不过这个钥匙好像可以自己定义,你试一下就好了啊。自己定义一个写进去再用你定时的取出来。我用的时候是自己定义的。
      

  5.   


    用你的倒是没有问题了,可是我的问题在哪呢?P.S : 我想问一个非常小白的问题,这个byte[] key就是我们说的私钥吧,这个是可以随意定的吗?byte[] iv我自己用的是公钥,这个也是可以随便定的吗?
    我看网上还说这公钥私钥是一对的,好像还要特定生成不怎么的,实在不是很明白,求教一下~
    DES没有公钥私钥,只有密钥和初始化向量。
    key是密钥,可以看作是密码,IV是初始化向量,用于影响加密过程中的s-box,两个是独立的,不存在配对的关系,可以随意定义。
    唯一需要注意的就是在DES中这两个参数为长度为8的字节数组,如果长度不正确会导致调用时出现异常,这里一定要进行检测(对输入进行补全或舍弃)
    另外要注意的就是字符串->字节数组转换过程中的编码,建议统一设置为UTF8以保证兼容