2016-01-21 78 views
0

這是我的第一篇文章,如果我對格式進行了錯誤,我非常抱歉。安全XOR加密嘗試

我正試圖編寫一個程序,以安全的方式通過XOR加密各種文件。我知道異或並不是最安全的加密方法,但我想嘗試一下。 所以請看看我的方法,並告訴我,如果它是完全廢話或不:) 密碼是一個字符串,由用戶選擇。 在開始時,我只將該文件與密碼異或,導致密碼的部分被正確猜測時易於解密。

這裏是我的方法:

  1. TMPFILE =文件XOR(密碼與pw.length.toString結合的散列)//確保密碼元素是按照正確的順序
  2. TMPFILE = TmpFile XOR(由密碼的每個字節組成的XOR字節)//確保解碼密碼恰好具有正確的字符。
  3. TMPFILE = TMPFILE XOR initial_password

可否加密文本與自XOR移技術來解密?

感謝您的諮詢! :)

編輯:這裏是代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Security; 
using System.IO; 
using System.Windows; 

namespace EncodeEverything 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.WriteLine("FileEncrypter v01 \n \n"); 


       //get password 
       Console.WriteLine("Enter your Password (encryption key)"); 
       string password = getPassword(); 
       Console.WriteLine(""); 

      while (true) 
      { 

       Console.WriteLine(""); 
       Console.WriteLine("-----------------------"); 
       Console.WriteLine(""); 

       //get file to encrypt 
       Console.WriteLine("File to encrypt/decrypt:"); 

       Console.Write(" "); 
       string path = Console.ReadLine(); 

       //------------------------------- 
       //load, encrypt & save file 
       //------------------------------- 
       try { 
        Byte[] tmpBArr = encrypt(File.ReadAllBytes(path), getCustomHash(password)); 
        File.WriteAllBytes(path, encrypt(tmpBArr, password)); 
        Console.WriteLine(" done."); 
       } 
       catch(System.Exception e) 
       { 
        Console.WriteLine("!! Error while processing. Path correct? !!"); 
       } 

      } 
     } 

     private static string getCustomHash(string word) 
     { 
      string output = ""; 

      output += word.Length.ToString(); 
      output += word.GetHashCode(); 

      return output; 
     } 

     //encrypt bzw decrypt Byte[] 
     public static Byte[] encrypt(byte[] s, string key) 
     { 
      List<Byte> output = new List<byte>(); 
      Byte[] codeword = Encoding.UTF8.GetBytes(key); 

      Byte keybyte =(Byte)(codeword[0]^ codeword[0]); 
      foreach(Byte b in codeword) 
      { 
       keybyte = (Byte)(b^keybyte); 
      } 

      for (int i = 0; i < s.Length; i++) 
      { 
       output.Add((Byte)(s[i]^codeword[i % codeword.Length]^keybyte)); 
      } 

      return output.ToArray(); 
     } 



     public static string getPassword() 
     { 
      Console.Write(" "); 

      string pwd = ""; 
      while (true) 
      { 
       ConsoleKeyInfo i = Console.ReadKey(true); 
       if (i.Key == ConsoleKey.Enter) 
       { 
        break; 
       } 
       else if (i.Key == ConsoleKey.Backspace) 
       { 
        if (pwd.Length > 0) 
        { 
         pwd= pwd.Remove(pwd.Length - 1); 
         Console.Write("\b \b"); 
        } 
       } 
       else 
       { 
        pwd+=(i.KeyChar); 
        Console.Write("*"); 
       } 
      } 
      return pwd; 
     } 

    } 
} 
+0

你可以把一個示例代碼,以便它變得更清楚的問題。 –

+0

您必須進一步指定您的算法!例如,當文件的大小與密碼長度一樣大時,您還沒有提到完成的操作。我假設從頭再次開始(這是使這種不安全的部分)。 XOR本身不一定是不安全的。考慮Vernam Chiffre(也稱爲一次性鍵盤):您使用一個完全隨機的鍵,它與消息的長度和XOR的長度一致。如果您不重複使用經證明是安全的鑰匙! – flammi88

+0

Btw一個簡短的免責聲明:永遠不要爲真實世界的應用程序自己實現加密,這些應用程序必須是安全的......很容易弄錯事情。考慮一次性...如果你沒有正確地擺脫關鍵材料,它可能駐留在主內存中...因爲你不能控制C#中的內存佈局,我認爲這是非常難以確定密鑰的每次出現都已在內存中清零......您可以注意到,退出後您的內存已被釋放。但考慮一下,操作系統在退出後不會清零內存。使用正確的工具可以恢復它! – flammi88

回答

1

您可以忽略這個答案,如果你只是想以文件爲加密一個學習的加密,但如果你正在尋找一個真正的解決方案來保護您的文件數據,繼續閱讀。

如果你正在尋找一個真正的解決方案來保持你的文件數據的安全,我真的建議你使用.NET框架內置的文件加密來處理這種事情。

從Microsoft @https://msdn.microsoft.com/en-us/library/system.io.file.encrypt(v=vs.110).aspx

using System; 
using System.IO; 
using System.Security.AccessControl; 

namespace FileSystemExample 
{ 
    class FileExample 
    { 
     public static void Main() 
     { 
      try 
      { 
       string FileName = "test.xml"; 

       Console.WriteLine("Encrypt " + FileName); 

       // Encrypt the file. 
       AddEncryption(FileName); 

       Console.WriteLine("Decrypt " + FileName); 

       // Decrypt the file. 
       RemoveEncryption(FileName); 

       Console.WriteLine("Done"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 

      Console.ReadLine(); 
     } 


     // Encrypt a file. 
     public static void AddEncryption(string FileName) 
     { 

      File.Encrypt(FileName); 

     } 

     // Decrypt a file. 
     public static void RemoveEncryption(string FileName) 
     { 
      File.Decrypt(FileName); 
     } 
    } 
} 

這是很難肯定地說,這是你所需要的,因爲其他的事情可能需要考慮,例如是否需要通過不同的文件客戶端/服務器等,以及您要在每個文件中加密多少數據。如果你正在尋找使用C#的真實世界的加密技術,我不會強調你應該尋找內置的.NET加密技術,而不是試圖推出自己的加密技術 - 尤其是如果你不想採用這種加密技術,在主題上沒有任何正式的培訓。我建議你通過在.NET框架加密微軟的文檔毛孔,如果你有興趣在確保生產數據:

https://msdn.microsoft.com/en-us/library/0ss79b2x(v=vs.110).aspx

這裏是一個很好的演練創建一個示例文件加密Windows窗體應用程序:

https://msdn.microsoft.com/en-us/library/bb397867(v=vs.110).aspx

+0

我不喜歡這個答案,它提出了一個沒有可配置密鑰的加密方式: - /我假設微軟將它與磁盤上的用戶配置文件一起存儲在某處......但從我的角度來看,您也可以使用普通文件操作系統的權限讓系統的其他用戶遠離...你沒有通過使用這些東西得到任何東西,更糟的是我不確定如果真的沒有祕密的方式讓機器的管理員加密文件。 .. – flammi88

+0

@ flammi88這是一個公平的警察。然而,除了「我想加密一些文件」之外,OP對他的要求並不是特別具體。我只是想把它放在那裏,以防他認真地嘗試實現他自己的加密技術以實現真實世界的使用,並指出他使用.NET Framework的內置加密技術的方向。我會更新我的文章以包含其他.NET加密選項。 – Jakotheshadows

+0

使用.net crypto API而不產生安全漏洞幾乎與從頭開始編寫一樣困難。我可以指望我多年來一直看到的安全實現。例如,在選定的密文攻擊下,您的最後一個鏈接不安全。 – CodesInChaos

3
  1. string.GetHashCode沒有一個明確的返回值。因此,重新啓動進程後,您甚至可能無法解密該文件。
  2. 您的密鑰由一個32位值加上密碼的長度組成。在一臺計算機上幾秒鐘內暴力破解。
  3. 一旦文件長於散列鍵,鍵開始重複,你會得到一個多時間墊。所以即使我們忽視了暴力攻擊,它仍然很容易被打破。它基本上是基於xor的vigenere變體。
  4. 忽略消息中每個字節的異或校驗字節,密鑰流字節是ASCII數字,所以每個密鑰字節最多有3.3位熵。將其與英文文本中每個字母的大約1.5位熵相比較,表明它即使沒有密鑰流重複也很弱。

=>它的缺陷和不安全

+0

幾天前,我們有一位用戶不知道代碼,甚至沒有認出與您相當的'xor'中斷加密:[商業軟件產品中使用的加密](http://crypto.stackexchange。 COM /問題/ 31836 /加密使用的-IN-A-商業軟件產品) – CodesInChaos