⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 DES加密软件 自己写的 还不错的 密码学
💻 CS
📖 第 1 页 / 共 2 页
字号:
                shortmi2 <<= (8 - n1) * 8;
                shortmi2 += shortmi1 >> n1 * 8;
                shortco2 = des(shortmi2);
                shortmi1 <<= (8 - n1) * 8;
                shortmi1 >>= (8 - n1) * 8;
                shortmi1 |= shortco2 << n1 * 8;
                shortco1 = des(shortmi1);
                writer.Write(shortco1);
                writer.Seek(n1 - 8, SeekOrigin.Current);
                writer.Write(shortco2);
                writer.Seek(-(8 + n1), SeekOrigin.Current);
                writer.Write(shortco1);


                writer.Close();
                //maindes();

                DateTime time2 = new DateTime();
                time2 = System.DateTime.Now;
                label9.Text = time2.ToString("T");
                // int time3 = DateTime.Compare(time2, time);
                long diff = (time2.Hour - time.Hour) * 3600000 + (time2.Minute - time.Minute) * 60000 +
                    (time2.Second - time.Second) * 1000 + time2.Millisecond - time.Millisecond+1;
                long v = fileLength * 1000 / (diff*1024);
                label11.Text = v.ToString() + "K/S";
                label13.Text = fileLength2.ToString() + "K";
                MessageBox.Show("文件解密完成", "信息:");

                //reset();
            }
        }

        //处理输入输出加密
        private void maindes()
        {
            //byte[] buffer = new byte[100];
            FileStream inFile = new FileStream(inFileName, FileMode.Open, FileAccess.Read, FileShare.Read);
            BinaryReader reader = new BinaryReader(inFile);
            FileStream outFile = new FileStream(outFileName, FileMode.Create);
            BinaryWriter writer = new BinaryWriter(outFile);
            //reader.Read(buffer, 0, 1);
            long fileLength = inFile.Length;
            long fileLength2 = fileLength / 1024;
            long fileLength3 = fileLength2 / 1024;
            long n = fileLength / 8;               
            MessageBox.Show("文件长度" + fileLength.ToString() + "字节(约"
             + fileLength2.ToString() + "k," + fileLength3.ToString() + "M)", "文件信息:");

            DateTime time = new DateTime();
            time = System.DateTime.Now;
            label7.Text = time.ToString("T");

            for (int i = 0; i < n; i++)
            {
                mi = reader.ReadUInt64();
                co = des(mi);
                writer.Write(co);
                progressBar1.Value = Convert.ToInt16(i * 100 / n); //进度条

            }

            //短块处理
            UInt64 shortmi=0,shortco;
            int n1=Convert.ToInt16(fileLength-n*8);   //短块长度 字节为单位
            if (n1 > 0)
            {
                byte[] buffer = new byte[7];
                reader.Read(buffer, 0, n1);
                for (int i = n1 - 1; i >= 0; i--)
                {
                    shortmi <<= 8;
                    shortmi += Convert.ToUInt64(buffer[i]);
                }
                shortmi <<= (8 - n1) * 8;
                shortmi += co >> n1 * 8;
               //temp1 = shortmi;
                shortco = des(shortmi);
                writer.Seek(n1 - 8, SeekOrigin.Current);
                writer.Write(shortco);

            }

                writer.Close();

            DateTime time2 = new DateTime();
            time2 = System.DateTime.Now;
            label9.Text = time2.ToString("T");
            // int time3 = DateTime.Compare(time2, time);
            long diff = (time2.Hour - time.Hour) * 3600000 + (time2.Minute - time.Minute) * 60000 + 
                (time2.Second - time.Second)*1000+time2.Millisecond-time.Millisecond;
            long v = fileLength*1000 / (diff*1024);
            label11.Text = v.ToString() + "K/S";
            label13.Text = fileLength2.ToString() + "K";
        }

       

        //输入文件路径
        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Title = "输入文件";
            openFileDialog1.InitialDirectory = inFileName;
            openFileDialog1.Filter = "全部文件(*.*)|*.*|文本文档(*.txt)|*.txt";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if (openFileDialog1.FileName != null)
                {

                    inFileName = openFileDialog1.FileName;
                    textBox4.Text = inFileName;
                }
            }
        }

        //输出文件路径
        private void button4_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Title = "输出文件";
            saveFileDialog1.InitialDirectory = outFileName;
            saveFileDialog1.Filter = "全部文件(*.*)|*.*|文本文档(*.txt)|*.txt";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if (saveFileDialog1.FileName != null)
                {
                    outFileName = saveFileDialog1.FileName;
                    textBox5.Text = outFileName;
                }

            }
        }


       

        //产生16个子密码
        private void creatKey(UInt64 key)
        {
            userkey = key;
            changeChoose1();
            for (int i = 1; i <= 16; i++)
            {
                turnLeft(i);                       //循环移位获得从c[i],d[i];
                changChoose2(i);                   //置换选择2,获得key[i];

            }
        }

        //置换选择1
        private void changeChoose1()
        {
            int i;
            UInt64 temp;
            c[0] = d[0] = 0;
            for (i = 0; i < 28; i++)
            {
                c[0] <<= 1;
                temp = (userkey >> (64 - c0[i])) & 1;
                c[0] += temp;
            }
            for (i = 0; i < 28; i++)
            {
                d[0] <<= 1;
                temp = (userkey >> (64 - d0[i]))& 1;
                d[0] += temp;
            }

        }

        //置换选择2
        private void changChoose2(int n)
        {
            int i;
            UInt64 temp;
            key[n] = 0;
            for (i = 0; i < 24; i++)
            {
                key[n] = key[n] << 1;
                temp = (c[n - 1] >> (28 - cd[i])) & 1;
                key[n] += temp;
            }
            for (i = 24; i < 48; i++)
            {
                key[n] = key[n] << 1;
                temp = (d[n - 1] >> (56 - cd[i])) & 1;
                key[n] += temp;
            }

        }

        //循环左移
        private void turnLeft(int n)
        {
            UInt64 temp;
            if (n > 0 && n <= 16)
            {
                temp = c[n - 1] >> (28 - toLeft[n - 1]);
                c[n] = ((c[n - 1] << toLeft[n - 1]) | temp) & 0x000000000fffffff;        
                temp = d[n - 1] >> (28 - toLeft[n - 1]);
                d[n] = ((d[n - 1] << toLeft[n - 1]) | temp) & 0x000000000fffffff;        
            }
        }


       
        

      

        //初始置换IP
        private void changChooseIP(UInt64 m)
        {
            //UInt64 temp=0;
            r[0] = l[0] = 0;
            for (int i = 0; i < 32; i++)
            {
                l[0] <<= 1;
                l[0] += (m >> (64 - ip[i])) & 1;

            }
            for (int i = 32; i < 64; i++)
            {
                r[0] <<= 1;
                r[0] += (m >> (64 - ip[i])) & 1;
            }
        }

        //函数f(Ri,Ki)
        private UInt64 f(UInt64 right, UInt64 keyn)
        { 
            UInt64 temp=0,temp2,temp3=0,result=0;
            for (int i = 0; i < 48; i++)
            {
                temp <<= 1;                                   //temp为选择运算E后的48位中间结果
                temp += (right >> 32 - e[i]) & 1;
            }
            temp2 = temp ^ keyn;

            //s盒变换
            for (int i = 0; i < 8; i++)                        
            {
                temp3 <<= 4;
                temp3+= Convert.ToUInt64(s0[(temp2>>(42-6*i))&0x000000000000003f]);
            }

            //置换运算P
            for (int i = 0; i < 32; i++)
            {
                result <<= 1;
                result += (temp3 >> (32 - p[i])) & 1;

            }
            return result;
        }


        //对64位数据mode加密,返回值位64位密文
        private UInt64 des(UInt64 mode)           
        {
            //初始置换IP
            changChooseIP(mode);

            //16轮加密
            for (int j = 1; j <= 16; j++)
            {
                l[j] = r[j - 1];
                r[j] = l[j - 1] ^ f(r[j - 1], key[j]);
            }
          

            //逆初始置换
            UInt64  code = 0;
            UInt64 temp = (r[16] << 32) | l[16];
           
            for (int j = 0; j < 64; j++)
            {
                code <<= 1;
                code += (temp >> (64 - ip1[j])) & 1;
            }
            return code;
        }

        private void groupBox3_Enter(object sender, EventArgs e)
        {

        }

        private void label10_Click(object sender, EventArgs e)
        {

        }
        
        /*private void reset()
        {
            textBox1.Text = "";
            inFileName = "";
            outFileName = "";
            textBox2.Text = "";
            textBox3.Text = "";
        }*/

        private void button5_Click(object sender, EventArgs e)
        {
            inFileName = "";
            outFileName = "";
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            progressBar1.Value = 0;
            label7.Text = "";
            label9.Text = "";
            label11.Text = "";
            label13.Text = "";
        }


       
    }
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -