public void RunTask(object state, RunTaskDelegate task, TaskCompletedDelegate onTaskCompleted) { object result = task(state); onTaskCompleted(result); }
private void button1_Click(object sender, EventArgs e) { RunTaskDelegate runTask = new RunTaskDelegate(RunTask); if (textBox1.Text == "") { MessageBox.Show("请选择要操作的文件", "错误", MessageBoxButtons.OK); } else { if ((radioButton1.Checked == false) && (radioButton2.Checked == false) && (radioButton3.Checked == false) && (radioButton4.Checked == false) && (radioButton5.Checked == false)) { MessageBox.Show("请选择加解密模式", "错误", MessageBoxButtons.OK); } else { if (radioButton1.Checked == true) { if (textBox2.Text.Length < 16) { MessageBox.Show("请输入16位密码", "错误", MessageBoxButtons.OK); } else { uint count = 0; uint[] roundKey = new uint[36]; byte[] baseKey = new byte[16]; byte[] plainBlock = new byte[16]; byte[] cipherBlock = new byte[16]; long len; long lenth; start = DateTime.Now.Ticks; baseKey = Encoding.UTF8.GetBytes(textBox2.Text); KeyGenerate(baseKey, roundKey); string fileNamer = textBox1.Text; FileStream fr = new FileStream(fileNamer, FileMode.Open); string fileNamew = doc + "temp.xxx"; if (File.Exists(fileNamew)) { File.Delete(fileNamew); FileStream sw = File.Create(fileNamew); sw.Close(); } if (!File.Exists(fileNamew)) { FileStream sw = File.Create(fileNamew); sw.Close(); } FileStream fw = new FileStream(fileNamew, FileMode.Open); lenth = fr.Length; len = 0; while (true) { fr.Read(cipherBlock, 0, 16); SMS4_DncryptBlock(cipherBlock, roundKey, plainBlock); len += 16; if ((len % 160000) == 0) { runTask(len, lenth); } if (len < lenth) { fw.Write(plainBlock, 0, 16); } else { break; } } if (plainBlock[15] < (byte)16) { for (count = (uint)(16 - plainBlock[15]); count < 15; count++) { if (plainBlock[count] != '\0') { break; } } } if (count == 15) { fw.Write(plainBlock, 0, 16 - plainBlock[15]); } else { fw.Write(plainBlock, 0, 16); } fr.Close(); fw.Close(); File.Delete(textBox1.Text); File.Move(doc + "temp.xxx", textBox1.Text); end = DateTime.Now.Ticks; MessageBox.Show("文件" + name + "已经解密完毕!" + "\n" + "文件大小: " + (lenth / 1024 / 1024).ToString() + "MB " + ((lenth / 1024) % 1024).ToString() + "KB" + "\n" + "用时: " + ((end - start) / 10000000).ToString() + "秒 " + ((end - start) / 10000).ToString() + "毫秒", "加密完成", MessageBoxButtons.OK); } } } } }
private void button3_Click(object sender, EventArgs e) { RunTaskDelegate runTask = new RunTaskDelegate(RunTask); if (textBox1.Text == "") { MessageBox.Show("请选择要操作的文件", "错误", MessageBoxButtons.OK); } else { if ((radioButton1.Checked == false) && (radioButton2.Checked == false) && (radioButton3.Checked == false) && (radioButton4.Checked == false) && (radioButton5.Checked == false)) { MessageBox.Show("请选择加解密模式", "错误", MessageBoxButtons.OK); } else { if (radioButton1.Checked == true) { if (textBox2.Text.Length < 16) { MessageBox.Show("请输入16位密码", "错误", MessageBoxButtons.OK); } else { start = DateTime.Now.Ticks; uint count; uint[] roundKey = new uint[36]; byte[] baseKey = new byte[16]; byte[] plainBlock = new byte[16]; byte[] cipherBlock = new byte[16]; long lenth; long sum = 0; baseKey = Encoding.UTF8.GetBytes(textBox2.Text); KeyGenerate(baseKey, roundKey); string fileNamer = textBox1.Text; FileStream fr = new FileStream(fileNamer, FileMode.Open); lenth = fr.Length; string fileNamew = doc + "temp.xxx"; if (File.Exists(fileNamew)) { File.Delete(fileNamew); FileStream sw = File.Create(fileNamew); sw.Close(); } if (!File.Exists(fileNamew)) { FileStream sw = File.Create(fileNamew); sw.Close(); } FileStream fw = new FileStream(fileNamew, FileMode.Open); while (true) { if ((count = (uint)fr.Read(plainBlock, 0, 16)) == 16) { SMS4_EncryptBlock(plainBlock, roundKey, cipherBlock); fw.Write(cipherBlock, 0, 16); sum += 16; if ((sum % 160000) == 0) { runTask(sum, lenth); } } else { if (count == 0) { break; } Fill(plainBlock, '\0', count); plainBlock[15] = (byte)(16 - count); SMS4_EncryptBlock(plainBlock, roundKey, cipherBlock); fw.Write(cipherBlock, 0, 16); break; } } fr.Close(); fw.Close(); File.Delete(textBox1.Text); File.Move(doc + "temp.xxx", textBox1.Text); end = DateTime.Now.Ticks; MessageBox.Show("文件" + name + "已经加密完毕!" + "\n" + "文件大小: " + (lenth / 1024 / 1024).ToString() + "MB " + ((lenth / 1024) % 1024).ToString() + "KB" + "\n" + "用时: " + ((end - start) / 10000000).ToString() + "秒 " + ((end - start) / 10000).ToString() + "毫秒", "加密完成", MessageBoxButtons.OK); progressBar1.Maximum = 100; progressBar1.Value = 0; } } } } }
public void RunTask(object state, RunTaskDelegate task, TaskCompletedDelegate onTaskCompleted) { _task = task; _onTaskCompleted = onTaskCompleted; _testRunner.RunWorkerAsync(state); }