这是我的第一篇文章,如果我的格式错误,我感到非常抱歉。
我正在尝试编写一个程序,以安全的方式通过XOR加密所有类型的文件。我知道XOR不是最安全的加密方法,但我想尝试一下。 所以请看看我的方法并告诉我它是否完全废话:) 密码是由用户选择的字符串。 在开始时,我只使用密码对文件进行了异或,如果正确猜到部分密码,则可以轻松解密。
这是我的程序:
使用自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 :(得分:3)
string.GetHashCode
没有明确定义的返回值。因此,重启过程后,您甚至可能无法解密文件。=&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