📄 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 + -