安全异或加密尝试

Secure XOR encryption attempt

这是我的第一个 post 如果格式有误,我深表歉意。

我正在尝试编写一个程序,以安全的方式通过 XOR 加密各种文件。我知道 XOR 不是最安全的加密方法,但我想试一试。 所以请看看我的方法并告诉我它是否完全是胡说八道:) 密码是一个字符串,由用户选择。 一开始我只是用密码对文件进行异或运算,如果猜对了部分密码,就可以轻松解密。

这是我的程序:

  1. TmpFile = File XOR(密码哈希与 pw.length.toString 相结合)//确保密码元素的顺序正确
  2. TmpFile = TmpFile XOR (XOR byte composed by each byte of password)//确保要解码的密码具有完全正确的字符。
  3. TmpFile= TmpFile 异或 initial_password

密文能否用自异或移位技术解密?

感谢您的建议! :)

编辑:这是代码:

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;
        }

    }
}

如果您只是尝试将加密文件作为密码学的学习练习,则可以忽略此答案,但如果您正在寻找 real-world 保护文件数据的解决方案,请继续阅读。

如果您正在寻找 real-world 解决方案来确保您的文件数据安全,我真的建议您使用 .NET 框架中内置的文件加密来处理此类事情。

来自微软@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);
        }
    }
}

很难确定这是你需要的,因为可能还需要考虑其他事情,比如你是否需要在不同的 clients/servers 之间传递文件等,以及您在每个文件中加密了多少数据。

同样,如果您正在使用 C# 寻找 real-world 密码学,我怎么强调您都应该寻找 built-in .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

  1. string.GetHashCode 没有明确定义的 return 值。因此,您甚至可能在重新启动进程后无法解密文件。
  2. 您的密钥由一个 32 位值加上密码长度组成。 Brute-forced 在单台计算机上以秒为单位。
  3. 一旦文件长于散列密钥,密钥开始重复,你得到一个 many-time-pad。所以即使我们忽略 brute-force 攻击,它仍然很容易被破解。它本质上是一个基于 xor 的 vigenere 变体。
  4. 忽略xor-ed奇偶校验字节,它对消息中的每个字节都是相同的,key-stream字节是ASCII数字,所以每个关键字节最多有3.3位的熵。将此与英文文本中每个字母大约 1.5 位的熵进行比较,您会发现它非常弱,即使没有 key-stream 重复。

=> 它有问题且不安全