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

📄 des.cs

📁 des算法
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using DesFunc;

namespace DES_XPC
{
    public partial class DesForm : Form
    {
        public DesForm()
        {
            InitializeComponent();
        }
        
        DesFunc.DesFunc F = new DesFunc.DesFunc(); // 初始化DES函数库
        
        private void button1_Click(object sender, EventArgs e)
        {
            if (kbox.Text == "" || kbox.Text == null)
            {
                MessageBox.Show("请输入加密密钥!","错误!",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            else
            {
                if(textBox1.Text==""||textBox1.Text==null)
                {
                    MessageBox.Show("请选择密文保存路径!", "错误!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    char[] tempmchar = mbox.Text.ToCharArray(); //明文
                    int mod = tempmchar.Length % 8;             //扩展明文为8的倍数,结尾不足8位用空格补出
                    char[] mchar = new char[tempmchar.Length + (8 - mod)];
                    for (int i = 0; i < tempmchar.Length; i++)
                    {
                        mchar[i] = tempmchar[i];
                    }
                    for (int i = tempmchar.Length; i < mchar.Length; i++)
                    {
                        mchar[i] = ' ';
                    }
                    char[] kchar = kbox.Text.ToCharArray();//获得64位密钥
                    char[] cchar = new char[mchar.Length];//初始化密文数组
                    int[][] keys = F.makekey(kchar);//由makekey函数通过64位密钥计算16个48位密钥
                    int div = mchar.Length / 8;//每8个为一组对明文分组
                    if ((mchar.Length % 8) != 0)
                        div += 1;
                    char[][] divmchar = new char[div][];//存放分组明文
                    for (int i = 0; i < div; i++)
                    {
                        divmchar[i] = new char[8];
                        divmchar[i][0] = mchar[i * 8 + 0];
                        divmchar[i][1] = mchar[i * 8 + 1];
                        divmchar[i][2] = mchar[i * 8 + 2];
                        divmchar[i][3] = mchar[i * 8 + 3];
                        divmchar[i][4] = mchar[i * 8 + 4];
                        divmchar[i][5] = mchar[i * 8 + 5];
                        divmchar[i][6] = mchar[i * 8 + 6];
                        divmchar[i][7] = mchar[i * 8 + 7];
                    }

                    int[][] divcint = new int[div][];//获得分组加密后的分组密文2进制形式
                    for (int i = 0; i < div; i++)
                    {
                        divcint[i] = new int[64];
                        divcint[i] = F.DES(keys, divmchar[i]);
                    }
                    int[] cint = new int[div * 64];//合并密文2进制形式
                    for (int i = 0; i < div; i++)
                    {
                        for (int j = 0; j < 64; j++)
                        {
                            cint[i * 64 + j] = divcint[i][j];
                        }
                    }
                    //将2进制密文转化为char密文
                    for (int i = 0; i < cchar.Length; i++)
                    {
                        cchar[i] = (char)(cchar[i] & 0x0000);
                    }
                    for (int i = 0; i < cchar.Length; i++)
                    {
                        if (cint[i * 8 + 0] == 1) cchar[i] = (char)(cchar[i] | 0x80);
                        if (cint[i * 8 + 1] == 1) cchar[i] = (char)(cchar[i] | 0x40);
                        if (cint[i * 8 + 2] == 1) cchar[i] = (char)(cchar[i] | 0x20);
                        if (cint[i * 8 + 3] == 1) cchar[i] = (char)(cchar[i] | 0x10);
                        if (cint[i * 8 + 4] == 1) cchar[i] = (char)(cchar[i] | 0x8);
                        if (cint[i * 8 + 5] == 1) cchar[i] = (char)(cchar[i] | 0x4);
                        if (cint[i * 8 + 6] == 1) cchar[i] = (char)(cchar[i] | 0x2);
                        if (cint[i * 8 + 7] == 1) cchar[i] = (char)(cchar[i] | 0x1);
                    }
            
                    //将加密结果写入文件和显示在cbox
                    //初始序列化
                    FileStream fs = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.Write);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter br = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    //序列化密文到文件
                    br.Serialize(fs, cchar);
                    fs.Close();
                    //显示密文
                    cbox.Text = System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(cchar));
                }
            }
        }    
        private void button2_Click(object sender, EventArgs e)
        {
            if (sourse.Text == "" || sourse.Text == null)
            {
                MessageBox.Show("请选择您需要解密的文本文件!", "错误!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (kbox.Text == "" || kbox.Text == null)
                {
                    MessageBox.Show("请输入解密密钥!", "错误!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                
                else
                {
                    //初始化
                    int[] cint = new int[64];
                    char[] kchar = kbox.Text.ToCharArray();
                    int[] kint = new int[56];

                    //或得16个密钥
                    int[][] keys = F.makekey(kchar);

                    //从文件反序列化或得密文char形式
                    FileStream fs = new FileStream(sourse.Text, FileMode.OpenOrCreate, FileAccess.Read);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    char[] cchar = (char[])bf.Deserialize(fs);
                    char[] mchar = new char[cchar.Length];
                    

                    //每8位一组分组密文
                    int div = cchar.Length / 8;
                    if ((cchar.Length % 8) != 0) div += 1;
                    char[][] divcchar = new char[div][];
                    for (int i = 0; i < div; i++)
                    {
                        divcchar[i] = new char[8];
                        divcchar[i][0] = cchar[i * 8 + 0];
                        divcchar[i][1] = cchar[i * 8 + 1];
                        divcchar[i][2] = cchar[i * 8 + 2];
                        divcchar[i][3] = cchar[i * 8 + 3];
                        divcchar[i][4] = cchar[i * 8 + 4];
                        divcchar[i][5] = cchar[i * 8 + 5];
                        divcchar[i][6] = cchar[i * 8 + 6];
                        divcchar[i][7] = cchar[i * 8 + 7];
                    }

                    //获得分组后明文2进制形式
                    int[][] divmint = new int[div][];
                    for (int i = 0; i < div; i++)
                    {
                        divmint[i] = new int[64];
                        divmint[i] = F.EN_DES(keys, divcchar[i]);
                    }

                    //合并明文2进制形式
                    int[] mint = new int[div * 64];
                    for (int i = 0; i < div; i++)
                    {
                        for (int j = 0; j < 64; j++)
                        {
                            mint[i * 64 + j] = divmint[i][j];
                        }
                    }


                    //由明文2进制形式转化为char形式
                    for (int i = 0; i < mchar.Length; i++)
                    {
                        mchar[i] = (char)(mchar[i] & 0x0000);
                    }
                    for (int i = 0; i < mchar.Length; i++)
                    {
                        if (mint[i * 8 + 0] == 1) mchar[i] = (char)(mchar[i] | 0x80);
                        if (mint[i * 8 + 1] == 1) mchar[i] = (char)(mchar[i] | 0x40);
                        if (mint[i * 8 + 2] == 1) mchar[i] = (char)(mchar[i] | 0x20);
                        if (mint[i * 8 + 3] == 1) mchar[i] = (char)(mchar[i] | 0x10);
                        if (mint[i * 8 + 4] == 1) mchar[i] = (char)(mchar[i] | 0x8);
                        if (mint[i * 8 + 5] == 1) mchar[i] = (char)(mchar[i] | 0x4);
                        if (mint[i * 8 + 6] == 1) mchar[i] = (char)(mchar[i] | 0x2);
                        if (mint[i * 8 + 7] == 1) mchar[i] = (char)(mchar[i] | 0x1);
                    }

                    //显示明文
                    ybox.Text = System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(mchar));
                    fs.Close();
                }
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "打开(Open)";
            ofd.FileName = "";
            ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            ofd.Filter = "文本文件(*.txt)|*.txt";
            ofd.ValidateNames = true;     //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
            ofd.CheckFileExists = true;  //验证路径有效性
            ofd.CheckPathExists = true; //验证文件有效性
            try
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    StreamReader sr = new StreamReader(ofd.FileName, System.Text.Encoding.Default);
                    this.mbox.Text = sr.ReadToEnd();

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "打开(Open)";
            ofd.FileName = "";
            ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            ofd.Filter = "文本文件(*.txt)|*.txt";
            ofd.ValidateNames = true;     //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
            ofd.CheckFileExists = true;  //验证路径有效性
            ofd.CheckPathExists = true; //验证文件有效性
            try
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    StreamReader sr = new StreamReader(ofd.FileName, System.Text.Encoding.Default);
                    this.cbox.Text = sr.ReadToEnd();
                    string fullName = Path.GetFullPath(ofd.FileName);
                    this.sourse.Text = fullName;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }

        }

        private void button7_Click(object sender, EventArgs e)
        {
            SaveFileDialog fileChooser = new SaveFileDialog();
            fileChooser.Filter = "文本文件(*.txt)|*.txt";
            DialogResult result = fileChooser.ShowDialog();
            string fileName;
            fileChooser.CheckFileExists = false;
            if (result == DialogResult.Cancel)
                return;
            fileName = fileChooser.FileName;
            if (fileName == "" || fileName == null)
                MessageBox.Show("无效的文件名", "错误!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            string fullName = Path.GetFullPath(fileChooser.FileName);
            this.textBox1.Text = fullName;
           
        }

        private void reset_Click(object sender, EventArgs e)
        {
            kbox.Text = "";
            mbox.Text = "";
            textBox1.Text = "";
            sourse.Text = "";
            cbox.Text = "";
            ybox.Text = "";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

       

       

        
    }
   
}

⌨️ 快捷键说明

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