安全异或加密尝试
Secure XOR encryption attempt
这是我的第一个 post 如果格式有误,我深表歉意。
我正在尝试编写一个程序,以安全的方式通过 XOR 加密各种文件。我知道 XOR 不是最安全的加密方法,但我想试一试。
所以请看看我的方法并告诉我它是否完全是胡说八道:)
密码是一个字符串,由用户选择。
一开始我只是用密码对文件进行异或运算,如果猜对了部分密码,就可以轻松解密。
这是我的程序:
- TmpFile = File XOR(密码哈希与 pw.length.toString 相结合)//确保密码元素的顺序正确
- TmpFile = TmpFile XOR (XOR byte composed by each byte of password)//确保要解码的密码具有完全正确的字符。
- 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
string.GetHashCode
没有明确定义的 return 值。因此,您甚至可能在重新启动进程后无法解密文件。
- 您的密钥由一个 32 位值加上密码长度组成。 Brute-forced 在单台计算机上以秒为单位。
- 一旦文件长于散列密钥,密钥开始重复,你得到一个 many-time-pad。所以即使我们忽略 brute-force 攻击,它仍然很容易被破解。它本质上是一个基于 xor 的 vigenere 变体。
- 忽略xor-ed奇偶校验字节,它对消息中的每个字节都是相同的,key-stream字节是ASCII数字,所以每个关键字节最多有3.3位的熵。将此与英文文本中每个字母大约 1.5 位的熵进行比较,您会发现它非常弱,即使没有 key-stream 重复。
=> 它有问题且不安全
这是我的第一个 post 如果格式有误,我深表歉意。
我正在尝试编写一个程序,以安全的方式通过 XOR 加密各种文件。我知道 XOR 不是最安全的加密方法,但我想试一试。 所以请看看我的方法并告诉我它是否完全是胡说八道:) 密码是一个字符串,由用户选择。 一开始我只是用密码对文件进行异或运算,如果猜对了部分密码,就可以轻松解密。
这是我的程序:
- TmpFile = File XOR(密码哈希与 pw.length.toString 相结合)//确保密码元素的顺序正确
- TmpFile = TmpFile XOR (XOR byte composed by each byte of password)//确保要解码的密码具有完全正确的字符。
- 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
string.GetHashCode
没有明确定义的 return 值。因此,您甚至可能在重新启动进程后无法解密文件。- 您的密钥由一个 32 位值加上密码长度组成。 Brute-forced 在单台计算机上以秒为单位。
- 一旦文件长于散列密钥,密钥开始重复,你得到一个 many-time-pad。所以即使我们忽略 brute-force 攻击,它仍然很容易被破解。它本质上是一个基于 xor 的 vigenere 变体。
- 忽略xor-ed奇偶校验字节,它对消息中的每个字节都是相同的,key-stream字节是ASCII数字,所以每个关键字节最多有3.3位的熵。将此与英文文本中每个字母大约 1.5 位的熵进行比较,您会发现它非常弱,即使没有 key-stream 重复。
=> 它有问题且不安全