📄 form1.cs
字号:
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 + -