2016-09-20 27 views
1

我目前正在学习密码学,这是我迄今为止学到的。如何用存根包裹我的生成器?

一个计算器由一个建造者和一个存根组成。

构建者的作用是加密一个文件,存根包装文件 并使其运行在正在解密的机器的内存缓冲区中。 (请纠正,如果我错了)

我已经创建了我的文件加密器(生成器),说实话我不知道如何创建一个存根。我一直在寻找整个一天,但所有我能看到的是,这些真的是老了控制台应用程序不解释真的什么..

所以我的问题是... 如何换我当前的文件加密与存根..或如何创建一个存根。不确定如何形成这个问题,因为我对存根很陌生。

这是我的文件加密器。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

using System.Windows; 
using Microsoft.Win32; 
using System.Security.Cryptography; 
using System.IO; 

namespace FileEncrypter 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     string key; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      key = generateKey(); 
     } 

     public string generateKey() 
     { 
      DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); 
      return ASCIIEncoding.ASCII.GetString(desCrypto.Key); 
     } 

     private void EncryptBtn_Click(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       OpenFileDialog ofd = new OpenFileDialog(); 
       ofd.ShowDialog(); 

       inputencryptFileTextBox.Text = ofd.FileName; 

       SaveFileDialog sfd = new SaveFileDialog(); 
       sfd.ShowDialog(); 

       outputencryptFileTextBox.Text = sfd.FileName; 

       encrypt(inputencryptFileTextBox.Text, outputencryptFileTextBox.Text, key); 
       MessageBox.Show("File has been encrypted.", "File"); 

      } 
      catch(Exception encEx) 
      { 
       MessageBox.Show(encEx.ToString()); 
      } 

     } 

     private void encrypt(string input, string output, string strhash) 
     { 
      FileStream inFs, outFs; 
      CryptoStream cs; 
      TripleDESCryptoServiceProvider TDC = new TripleDESCryptoServiceProvider(); 
      MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 

      byte[] byteHash, byteTexto; 

      inFs = new FileStream(input, FileMode.Open, FileAccess.Read); 
      outFs = new FileStream(output, FileMode.OpenOrCreate, FileAccess.Write); 

      byteHash = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strhash)); 
      byteTexto = File.ReadAllBytes(input); 

      md5.Clear(); 

      TDC.Key = byteHash; 
      TDC.Mode = CipherMode.ECB; 

      cs = new CryptoStream(outFs, TDC.CreateEncryptor(), CryptoStreamMode.Write); 

      int byteRead; 
      long length, position = 0; 
      length = inFs.Length; 

      while (position < length) 
      { 
       byteRead = inFs.Read(byteTexto, 0, byteTexto.Length); 
       position += byteRead; 

       cs.Write(byteTexto, 0, byteRead); 

      } 

      inFs.Close(); 
      outFs.Close(); 

     } 

     private void DecryptBtn_Click(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       OpenFileDialog ofd = new OpenFileDialog(); 
       ofd.ShowDialog(); 

       inputdecryptFileTextBox.Text = ofd.FileName; 

       SaveFileDialog sfd = new SaveFileDialog(); 
       sfd.ShowDialog(); 

       outputdecryptFileTextBox.Text = sfd.FileName; 

       decrypt(inputdecryptFileTextBox.Text, outputdecryptFileTextBox.Text, key); 
       MessageBox.Show("File has been decrypted.", "File"); 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 



     private void decrypt(string input, string output, string strhash) 
     { 
      FileStream inFs, outFs; 
      CryptoStream cs; 
      TripleDESCryptoServiceProvider TDC = new TripleDESCryptoServiceProvider(); 
      MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 

      byte[] byteHash, byteTexto; 

      inFs = new FileStream(input, FileMode.Open, FileAccess.Read); 
      outFs = new FileStream(output, FileMode.OpenOrCreate, FileAccess.Write); 

      byteHash = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(strhash)); 
      byteTexto = File.ReadAllBytes(input); 

      md5.Clear(); 

      TDC.Key = byteHash; 
      TDC.Mode = CipherMode.ECB; 

      cs = new CryptoStream(outFs, TDC.CreateDecryptor(), CryptoStreamMode.Write); 

      int byteRead; 
      long length, position = 0; 
      length = inFs.Length; 

      while (position < length) 
      { 
       byteRead = inFs.Read(byteTexto, 0, byteTexto.Length); 
       position += byteRead; 

       cs.Write(byteTexto, 0, byteRead); 

      } 

      inFs.Close(); 
      outFs.Close(); 

     } 
    } 
} 

回答

0

存根可以像一个小型项目,加密部分作为资源。当存根被加载时,它将从资源中描述程序集并使用反射来查找“主入口点”。问题是,如何保持私钥....呃...私人..

0

我还没有听说过在这种情况下使用的存根。我只听到它的测试或添加“占位符”API。

我想你所要求的是如何让建设者使用接口,可以包装文件或包装内存流?如果是这样,你的加密方法可以接受一个接口而不是一个字符串。该接口可以提供读取和写入数据的API。在调用encrypt方法时,可以新建接口的文件实现或内存实现,并将其传递到encrypt

由于您正在处理encrypt方法中的接口,因此它将同等对待两个对象。您也可以只接受Stream。然后你可以通过MemoryStreamFileStream