加密后,再解密,得到的结果,跟加密前的不一样,请大家帮忙看是错在哪里???
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }        //初始置换表IP   
        int[] IP_Table = new int[64]{  57,49,41,33,25,17,9,1,   
                                 59,51,43,35,27,19,11,3,   
                                 61,53,45,37,29,21,13,5,   
                                 63,55,47,39,31,23,15,7,   
                                 56,48,40,32,24,16,8,0,   
                                 58,50,42,34,26,18,10,2,   
                                 60,52,44,36,28,20,12,4,   
                                 62,54,46,38,30,22,14,6}; 
        //逆初始置换表IP^-1   
        int[] PI_Table =new int[64]{39,7,47,15,55,23,63,31,   
           38,6,46,14,54,22,62,30,   
           37,5,45,13,53,21,61,29,   
           36,4,44,12,52,20,60,28,   
           35,3,43,11,51,19,59,27,   
           34,2,42,10,50,18,58,26,   
           33,1,41,9,49,17,57,25,   
           32,0,40,8,48,16,56,24}; 
        //扩充置换表E   
        int[] E_Table = new int[48]{31,0,1,2,3,4,   
                  3,4,5,6,7,8,   
                  7,8,9,10,11,12,   
                  11,12,13,14,15,16,   
                  15,16,17,18,19,20,   
                  19,20,21,22,23,24,   
                  23,24,25,26,27,28,   
                  27,28,29,30,31, 0}; 
        //置换函数P   
        int[] P_Table = new int[32]{15,6,19,20,28,11,27,16,   
                  0,14,22,25,4,17,30,9,   
                  1,7,23,13,31,26,2,8,   
                  18,12,29,5,21,10,3,24};
        //S盒
        int[, ,] S = new int[8, 4, 16]  
            {//S1
            {{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},   
              {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},   
                {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},   
                {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},   
                //S2   
              {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},   
              {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},   
              {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},   
              {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}},   
              //S3   
              {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},   
              {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},   
                {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},   
              {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},   
              //S4   
              {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},   
              {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},   
              {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},   
              {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},   
              //S5   
              {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},   
              {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},   
              {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},   
              {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},   
              //S6   
              {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},   
              {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},   
              {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},   
              {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},   
              //S7   
              {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},   
              {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},   
              {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},   
              {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},   
              //S8   
              {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},   
              {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},   
              {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},   
              {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}};
        //置换选择1   
        int[] PC1_Table = new int[56]{56,48,40,32,24,16,8,   
              0,57,49,41,33,25,17,   
              9,1,58,50,42,34,26,   
              18,10,2,59,51,43,35,   
              62,54,46,38,30,22,14,   
              6,61,53,45,37,29,21,   
              13,5,60,52,44,36,28,   
              20,12,4,27,19,11,3};
        //置换选择2   
        int[] PC2_Table = new int[48]{13,16,10,23,0,4,2,27,   
              14,5,20,9,22,18,11,3,   
              25,7,15,6,26,19,12,1,   
              40,51,30,36,46,54,29,39,   
              50,44,32,46,43,48,38,55,   
              33,52,45,41,49,35,28,31};
        //对左移次数的规定   
        int[] move_Table = new int[16] { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };        
        //产生子密钥函数
        private int[,] miyao()
        {
            int tem;
            int[] zuoyi = new int[56];
            int[] bit = new int[64];
            int[] temp = new int[56];
            int[] temp1 = new int[28];
            int[] temp2 = new int[28];
            int[,] zimiyao=new int[16,48];
            int[] miyao = new int[8];
            //读取字符串,转为字节
            for (int i = 0; i < textBox1.Text.ToString().Trim().Length; i++)
            {
                miyao[i] = Convert.ToInt32(textBox1.Text.ToString().Substring(i, 1));
            }
            //转为二进制
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    //bit[i * 8 + j] = (miyao[i] >> j) & 1;
                    bit[i * 8 + j] = (miyao[i] >> j) & 0x01;
                }
            }
            //密钥置换PC1
            for(int i = 0; i < 56; i++)
            {
                temp[i] = bit[PC1_Table[i]];
            }
            //产生子密钥
            for (int j = 0; j < 16; j++)
            {
                //分左、右组
                for (int i = 0; i < 28; i++)
                {
                    temp1[i] = temp[i];
                    temp2[i] = temp[i + 28];
                }
                //左移
                for (int k = 0; k < move_Table[j]; k++)
                {
                    for (int i = 0; i < 27; i++)
                    {
                        tem = temp1[i];
                        temp1[i] = temp1[i + 1];
                        temp1[i + 1] = tem;
                        tem = temp2[i];
                        temp2[i] = temp2[i + 1];
                        temp2[i + 1] = tem;
                    }
                }
                //合并为一起
                for (int i = 0; i < 28; i++)
                {
                    temp[i] = temp1[i];
                    temp[i + 28] = temp2[i];
                }
                //密钥置换PC2
                for (int i = 0; i < 48; i++)
                {
                    zimiyao[j,i] = temp[PC2_Table[i]];
                }
            }
            return zimiyao;
        }
        //加密
        private void button1_Click(object sender, EventArgs e)
        {
            char[,] zifuchuan = new char[100, 8];
            zifuchuan = jiajiemi(textBox2.Text.ToString());
            //输出到textBox3.Text
            foreach (char c in zifuchuan)
            {
                textBox3.Text += c.ToString();
            }
        }
        //解密
        private void button2_Click(object sender, EventArgs e)
        {
            textBox5.Text = string.Empty;
            textBox6.Text = string.Empty;
            char[,] zifuchuan = new char[100, 8];
            zifuchuan = jiajiemi(textBox3.Text.ToString());
            //输出到textBox3.Text
            foreach (char c in zifuchuan)
            {
                textBox4.Text += c.ToString();
            }
        }
    }

解决方案 »

  1.   

    接上面
            //加密解密函数
            private char[,] jiajiemi(string str)
            {
                int jiaohuan;
                string str1=string.Empty;
                int[,] zimiyao = new int[16, 48];
                int[] bit = new int[64];
                int[] temp = new int[64];
                int[] temp1 = new int[32];
                int[] temp2 = new int[32];
                int[] temp2e = new int[48];
                int[] temp2e1 = new int[32];
                int[] youhuanzuo = new int[32];
                int[] temppi = new int[64];
                char[,] zifuchuan = new char[100, 8];
                int[] zifu = new int[8];
                char[] zifu1 = new char[8];
                char[] jiami = new char[8];
                zimiyao = miyao();
                for (int j = 0; j < str.Length / 8; j++)
                {
                    //取8个字节
                    for (int i = 0; i < 8; i++)
                    {
                        //zifu[i] = Convert.ToInt32(str.Substring((j * 8 + i), 1));
                        zifu1[i] = Convert.ToChar(str.ToString().Substring((j * 8 + i), 1));
                        zifu[i] = Convert.ToInt32(zifu1[i]);
                    }
                    for (int i = 0; i < 8; i++)
                    {
                        for (int k = 0; k < 8; k++)
                        {
                            bit[i * 8 +  k] = (zifu[i] >> k) & 1;                        
                        }
                    }
                    //初始置换
                    for (int i = 0; i < 64; i++)
                    {
                        temp[i] = bit[IP_Table[i]];
                    }
                    //分左、右组
                    for (int i = 0; i < 32; i++)
                    {
                        temp1[i] = temp[i];
                        temp2[i] = temp[i + 32];
                    }
                    //16次加密
                    for (int k = 0; k < 16; k++)
                    {
                        //右边赋给一个数组(第一次加密结束时,赋给左边)
                        for (int i = 0; i < 32; i++)
                        {
                            youhuanzuo[i] = temp2[i];
                        }
                        //右组进行扩展置换E(32->48bit)
                        for (int i = 0; i < 48; i++)
                        {
                            temp2e[i] = temp2[E_Table[i]];
                        }
                        //右组与第(j+1)个子密钥进行异或操作
                        for (int i = 0; i < 48; i++)
                        {
                            temp2e[i] ^= zimiyao[k, i];
                        }
                        //异或后结果,输入S盒,输出32bit结果
                        for (int i = 0; i < 8; i++)
                        {
                            int g1 = i << 2;
                            int g = i * 6;
                            int line, row, output;
                            //计算在S盒中的行与列   
                            line = (temp2e[g] << 1) + temp2e[g + 5];
                            row = (temp2e[g + 1] << 3) + (temp2e[g + 2] << 2)
                                + (temp2e[g + 3] << 1) + temp2e[g + 4];
                            output = S[i, line, row];
                            //化为2进制   
                            temp2e1[g1] = (output & 0X08) >> 3;
                            temp2e1[g1 + 1] = (output & 0X04) >> 2;
                            temp2e1[g1 + 2] = (output & 0X02) >> 1;
                            temp2e1[g1 + 3] = output & 0x01;
                        }
                        for (int h = 0; h < 31; h++)
                        {
                            for (int i = 0; i < (32 - h - 1); i++)
                            {
                                jiaohuan = temp2e1[i];
                                temp2e1[i] = temp2e1[i + 1];
                                temp2e1[i + 1] = jiaohuan;
                            }
                        }
                        //压缩置换P
                        for (int i = 0; i < 32; i++)
                        {
                            temp2[i] = temp2e1[P_Table[i]];
                        }
                        //左组和右组进行异或操作
                        for (int i = 0; i < 32; i++)
                        {
                            temp2[i] ^= temp1[i];
                        }
                        //R0赋给左边,作为下一轮的L1
                        if (k < 15)
                        {
                            for (int i = 0; i < 32; i++)
                            {
                                temp1[i] = youhuanzuo[i];
                            }
                        }
                    }
                    //左组和右组合并为一起
                    for (int i = 0; i < 32; i++)
                    {
                        temppi[i] = temp1[i];
                        temppi[i + 32] = temp2[i];
                    }
                    //逆初始置换IP2
                    for (int i = 0; i < 64; i++)
                    {
                        temp[i] = temppi[PI_Table[i]];
                    }
                    //转为字节
                    for (int i = 0; i < 8; i++)
                    {
                        for (int k = 0; k < 8; k++)
                        {
                            jiami[i] |= Convert.ToChar(temp[i * 8 + k] << k);
                        }
                    }
                    for (int i = 0; i < 8; i++)
                    {
                        zifuchuan[j, i] = Convert.ToChar(jiami[i]);
                    }
                }
                return zifuchuan;
            }
      

  2.   

    //加密
      public string DesEncrypt(string strText, string strEncrKey) 
      { 
       byte[] byKey=null; 
       byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
       try 
       { 
        byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0,8)); 
        DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
        byte[] inputByteArray =System.Text.Encoding.UTF8.GetBytes(strText); 
        MemoryStream ms = new MemoryStream(); 
        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write) ; 
        cs.Write(inputByteArray, 0, inputByteArray.Length); 
        cs.FlushFinalBlock(); 
        return Convert.ToBase64String(ms.ToArray()); 
       } 
       catch(System.Exception error) 
       { 
        MessageBox.Show(error.Message); 
        return "error:" +error.Message+" "; 
       } 
      } 
    //解密
      public string DesDecrypt(string strText,string sDecrKey) 
      { 
       byte[] byKey = null; 
       byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
       byte[] inputByteArray = new Byte[strText.Length]; 
       try 
       { 
        byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey.Substring(0,8)); 
        DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
        inputByteArray = Convert.FromBase64String(strText); 
        MemoryStream ms = new MemoryStream(); 
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write); 
        cs.Write(inputByteArray, 0, inputByteArray.Length); 
        cs.FlushFinalBlock(); 
        System.Text.Encoding encoding = new System.Text.UTF8Encoding(); 
        return encoding.GetString(ms.ToArray()); 
       } 
       catch(System.Exception error) 
       { 
        MessageBox.Show(error.Message); 
        return "error:"+error.Message+" "; 
       } 
      }
      

  3.   

    DES加密 解密 百度一下 立马知道。
      

  4.   

    调用
     DesEncrypt(this.TextBox1.Text, "00000000-0000-0000-000000");
     DesDecrypt(this.Label1.Text, "00000000-0000-0000-000000");
      

  5.   

    看了你代码,想法挺好。 先不做评论,
    给你我的 仅作参考。
     /// <summary>
            /// 进行DES加密。
            /// </summary>
            /// <param name="pToEncrypt">要加密的字符串。</param>
            /// <param name="sKey">密钥,且必须为8位。</param>
            /// <returns>以Base64格式返回的加密字符串。</returns>
            public string desEncrypt(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;
                }
            }
      

  6.   

    大家都贴代码,我也把我的贴上:    /// <summary>
        /// 加密解密类
        /// </summary>
        public static class DencryptHelper
        {
            private static byte[] _Key = { 0x73, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x72, 0x74 };
            private static byte[] _IV = { 0x73, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x72, 0x74 };        #region 加密字符串
            /// <summary>
            /// 加密字符串
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static string Encrypt(string input)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputByteArray = Encoding.Default.GetBytes(input);
                des.Key = _Key;
                des.IV = _IV;
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                StringBuilder result = new StringBuilder();
                foreach (byte b in ms.ToArray())
                {
                    result.AppendFormat("{0:X2}", b);
                }            return result.ToString();
            }
            #endregion        #region 解密字符串
            /// <summary>
            /// 解密字符串
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
            public static string Decrypt(string input)
            {
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                int len = input.Length / 2;
                byte[] inputByteArray = new byte[len];
                for (int i = 0; i < len; i++)
                {
                    inputByteArray[i] = (byte)Convert.ToInt32(input.Substring(i * 2, 2), 16);
                }
                des.Key = _Key;
                des.IV = _IV;
                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();            return Encoding.Default.GetString(ms.ToArray());
            }
            #endregion        #region 使用散列方式加密 MD5加密        /// <summary>
            /// 使用MD5对字符串进行加密
            /// </summary>
            /// <param name="input">需要加密的字符串</param>
            /// <returns>加密后的字符串</returns>
            public static string MD5Encrypt(string input)
            {
                string result = string.Empty;
                //先将要加密的字符串转换成byte数组
                byte[] inputData = Encoding.Default.GetBytes(input);
                //在通过MD5类加密,并得到加密后的byte[]类型
                byte[] data = MD5.Create().ComputeHash(inputData);
                StringBuilder strBuild = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    //将每个byte数据转换成16进制。"X":表示大写16进制;"X2":表示大写16进制保留2位;"x":表示小写16进制
                    strBuild.Append(data[i].ToString("X2"));
                }
                result = strBuild.ToString();            return result;
            }        /// <summary>
            /// 使用MD5对字符串进行加密
            /// </summary>
            /// <param name="input">需要加密的字符串</param>
            /// <param name="offset">加密前缀字符串</param>
            /// <returns>加密后的字符串</returns>
            public static string MD5Encrypt(string input, string offset)
            {
                string result = string.Empty;
                //先将要加密的字符串转换成byte数组
                byte[] inputData = Encoding.Default.GetBytes(offset + input);
                //在通过MD5类加密,并得到加密后的byte[]类型
                byte[] data = MD5.Create().ComputeHash(inputData);
                StringBuilder strBuild = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    //将每个byte数据转换成16进制。"X":表示大写16进制;"X2":表示大写16进制保留2位;"x":表示小写16进制
                    strBuild.Append(data[i].ToString("X2"));
                }
                result = strBuild.ToString();            return result;
            }        #endregion
        }