安全XOR加密尝试

时间:2016-01-21 00:40:24

标签: c# security encryption xor

这是我的第一篇文章,如果我的格式错误,我感到非常抱歉。

我正在尝试编写一个程序,以安全的方式通过XOR加密所有类型的文件。我知道XOR不是最安全的加密方法,但我想尝试一下。 所以请看看我的方法并告诉我它是否完全废话:) 密码是由用户选择的字符串。 在开始时,我只使用密码对文件进行了异或,如果正确猜到部分密码,则可以轻松解密。

这是我的程序:

  1. TmpFile =文件XOR(密码的散列与pw.length.toString结合)//以确保密码元素的顺序正确
  2. TmpFile = TmpFile XOR(由密码的每个字节组成的XOR字节)//确保要解码的密码具有完全正确的字符。
  3. TmpFile = TmpFile XOR initial_password
  4. 使用自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;
            }
    
        }
    }
    

2 个答案:

答案 0 :(得分:3)

  1. string.GetHashCode没有明确定义的返回值。因此,重启过程后,您甚至可能无法解密文件。
  2. 您的密钥由32位值加密码长度组成。在一台计算机上以秒为单位强制执行。
  3. 一旦文件长于哈希键,键就开始重复,你得到一个多次键盘。因此,即使我们忽略了蛮力攻击,它仍然很容易打破。它基本上是基于xor的vigenere变体。
  4. 忽略xor-ed奇偶校验字节,对于消息中的每个字节都是相同的,密钥流字节是ASCII数字,因此每个密钥字节最多具有3.3比特的熵。将其与英文文本中每个字母的大约1.5位熵相比较,可以看出即使没有密钥流重复,它也很弱。
  5. =&GT;这是有缺陷和不安全的

答案 1 :(得分:1)

如果您只是尝试加密文件作为加密中的学习练习,则可以忽略此答案,但如果您正在寻找保护文件数据的真实解决方案,请继续阅读。< / p>

如果您正在寻找保持文件数据安全的真实解决方案,我真的建议您使用.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);
        }
    }
}

很难确定这是您所需要的,因为可能需要考虑其他因素,例如您是否需要在不同客户端/服务器之间传递文件等,以及您需要多少数据? #39;在每个文件中重新加密。

同样,如果你正在寻找使用C#的真实世界的加密技术,我不能强调你应该寻求内置的.NET加密,而不是试图推出自己的加密 - 特别是如果你没有对这个主题进行任何正式的培训。如果您对保护生产中的数据感兴趣,我建议您了解.NET框架加密的Microsoft文档:

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