2016-01-21 74 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