C#-DES加解密

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Threading;

namespace DES加密
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        //加密
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            progressBar1.Visible = true;
            if (mima1.Text != mima2.Text)
            {
                MessageBox.Show("两次输入的密码不一致");
            }
            else if (mima1.Text.Length < 6 || mima1.Text.Length > 8)
            {
                MessageBox.Show("密码输入的长度不符合要求(6-8位)");
            }
            else
            {
                Thread tt = new Thread(star);
                tt.IsBackground = true;
                kg = 1;
                myKey = mima1.Text;
                noww = 1;
                myInFileName = shuru.Text;
                myOutFileName = shuchu.Text + '\' + mingzi.Text + "." + houzhui.Text;
                tt.Start();
               
            }
        }
        //解密
        private void button2_Click(object sender, EventArgs e)
        {
            progressBar1.Visible = true;
            label1.Visible = true;
            if (mima1.Text != mima2.Text)
            {
                MessageBox.Show("两次输入的密码不一致");
            }
            else if (mima1.Text.Length < 6 || mima1.Text.Length > 8)
            {
                MessageBox.Show("密码输入的长度不符合要求(6-8位)");
            }
            else
            {
                Thread tt = new Thread(star);
                tt.IsBackground = true;
                kg = 2;
                myKey = mima1.Text;
                noww = 1;
                myInFileName = shuru.Text;
                myOutFileName = shuchu.Text + '\' + mingzi.Text + "." + houzhui.Text;
                tt.Start();
            }
        }
        //加密解密函数
        int kg ,noww = 0;//0没事干,1正在执行,2失败,3成功
        string myInFileName, myOutFileName ,myKey ;
        int pp = 0;
        string ll = "0";
        public void star()
        {           
            try
            {
                //设定秘钥初始值和偏移量
                byte[] myDESIV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
                byte[] myDESKey = { };

                //根据密码长度设置秘钥
                if (myKey.Length == 6)
                    myDESKey = new byte[] { (byte)myKey[0], (byte)myKey[1], (byte)myKey[2], (byte)myKey[3], (byte)myKey[4], (byte)myKey[5], 0x07, 0x08 };
                if (myKey.Length == 7)
                    myDESKey = new byte[] { (byte)myKey[0], (byte)myKey[1], (byte)myKey[2], (byte)myKey[3], (byte)myKey[4], (byte)myKey[5], (byte)myKey[6], 0x08 };
                if (myKey.Length == 8)
                    myDESKey = new byte[] { (byte)myKey[0], (byte)myKey[1], (byte)myKey[2], (byte)myKey[3], (byte)myKey[4], (byte)myKey[5], (byte)myKey[6], (byte)myKey[7] };

                //创建输入输出文件流
                FileStream myInFileStream = new FileStream(myInFileName, FileMode.Open, FileAccess.Read);
                FileStream myOutFileStream = new FileStream(myOutFileName, FileMode.OpenOrCreate, FileAccess.Write);
                myOutFileStream.SetLength(0);//这个暂时不清楚

                //每次的中间流
                byte[] tmp = new byte[100];

                //已经传输的长度
                long nowLength = 0;

                //总长度,也是输入的文件流的长度
                long allLength = myInFileStream.Length;

                //创建DES对象
                DES myDES = new DESCryptoServiceProvider();

                CryptoStream myCryptoStream;
                if (kg == 1)//加密流
                    myCryptoStream = new CryptoStream(myOutFileStream, myDES.CreateEncryptor(myDESKey, myDESIV), CryptoStreamMode.Write);
                else//解密流
                    myCryptoStream = new CryptoStream(myOutFileStream, myDES.CreateDecryptor(myDESKey, myDESIV), CryptoStreamMode.Write);

                //从输入文件中读取流,然后加入到输出文件流,中间用中间流传输
                double nowjd = 0;
                double gg = 0;
                pp = 0;
                ll = "0";
                while (nowLength < allLength)
                {
                    //每次写入加密(解密)文件数据的大小
                    int length = myInFileStream.Read(tmp, 0, 100);
                    myCryptoStream.Write(tmp, 0, length);
                    nowLength += length;
                    nowjd = (double)nowLength / (double)allLength;
                    if (nowjd - gg >= 0.01)
                    {             
                        gg = nowjd;
                        pp = int.Parse((nowLength * 100 / allLength).ToString());
                        ll = (nowjd * 100).ToString(); 
                    }
     
               }

                int mk = 0;
                //关闭流
                try
                {
                    myCryptoStream.Close();
                }
                catch
                {
                    mk = 1;
                }
                try
                {
                    myInFileStream.Close();
                }
                catch
                {
                    mk = 1;
                }
                try
                {
                    myOutFileStream.Close();
                }
                catch
                {
                    mk = 1;
                }

                if (mk == 1) noww = 2;

                //更新100%
                nowjd = 100;
                //label1.Text = nowjd.ToString();
                //label1.Refresh();

                noww = 3;
            }
            catch
            {
                noww = 2;
            }

        }

        private void label2_Click(object sender, EventArgs e)
        {
            //文件浏览
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                shuru .Text  = openFileDialog1.FileName; 
            }
        }

        private void label3_Click(object sender, EventArgs e)
        {
            //文件夹浏览
            folderBrowserDialog1.SelectedPath = "";
            folderBrowserDialog1.ShowDialog();
            if (folderBrowserDialog1.SelectedPath != "")
                shuchu.Text = folderBrowserDialog1.SelectedPath;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = ll;
            progressBar1.Value = pp;
            label1.Refresh();
            if (noww == 2)
            {
               noww = 0;
               if(kg == 1)
               {
                    try
                    {
                        File.Delete(shuchu.Text + '\' + mingzi.Text + "." + houzhui.Text);
                    }
                    catch { }
                    MessageBox.Show("加密失败");
                    label1.Text = "0";
                    progressBar1.Visible = false ;
                    label1.Visible = false ;
               }
               else 
               {
                   try
                    {  //删除没有价值的失败文件
                             File.Delete(shuchu.Text + '\' + mingzi.Text + "." + houzhui.Text);
                    }
                    catch { }
                    MessageBox.Show("解密失败");
                    label1.Text = "0";
                    label1.Visible = false ;
                    progressBar1.Visible = false ;
               
               }
               
            }
            if(noww == 3)
            {
                noww = 0;
                if(kg == 1)
                 {
                    try
                    {
                        if (checkBox1.Checked)
                            File.Delete(@shuru.Text);
                    }
                    catch { }
                    MessageBox.Show("加密成功");
                    label1.Text = "0";
                    progressBar1.Visible = false ;
                    label1.Visible = false ;
                   }
                   else 
                   {
                       try
                        {
                            if(checkBox2.Checked)
                                 File.Delete(@shuru.Text);
                        }
                        catch { }
                        MessageBox.Show("解密成功");
                        label1.Text = "0";
                        label1.Visible = false ;
                        progressBar1.Visible = false ;
                   
                   }
            }

        }

       

       
        
    }
}

原文地址:https://www.cnblogs.com/csnd/p/12062162.html