public void RunTask(object state, RunTaskDelegate task, TaskCompletedDelegate onTaskCompleted)
 {
     object result = task(state);
     onTaskCompleted(result);
 }
Exemple #2
0
        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);
                        }
                    }
                }
            }
        }
Exemple #3
0
        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);
 }