当文本文件被读入字符串时,如何XOR字节

本文关键字:如何 XOR 字节 字符串 文本 文件 | 更新日期: 2023-09-27 18:09:41

我需要防止一些孩子修改json文本文件,并把"屁脸"在他们。我当前的代码从文本文件中获取一个字符串,如下所示:

using (StreamReader file = File.OpenText(basePath + "jsontxt"))
{
    string s = file.ReadToEnd();

我可以应用异或到我的jsontxt文件,这足以防止恶意放屁笑话,但在我的wpf c#应用程序,我不确定如何实现字节异或,因为文件被读成一个字符串。

当文本文件被读入字符串时,如何XOR字节

尝试获取字符串作为字节数组,并简单地用一些密钥对每个字节进行异或:

Byte[] byteString;
using (StreamReader file = File.OpenText(basePath + "jsontxt"))
{
   Byte secretByte = 125;
   string s = file.ReadToEnd();
   byteString = Encoding.UTF8.GetBytes(s);
   foreach(Byte b in byteString)
   {
      b ^= secretByte;
   }
}
//here save stream

我认为这个想法有两个问题。

首先,您会发现很难找到一个异或值,当应用该值时,它将始终产生一个可读的字符。在这种情况下,你的文件变成了一个二进制文件,而不是一个文本文件。

第二,假设你能想出一种方法来保证一个可读的文件,这并不会阻止人们修改它。

如果你想加密你的文件,使用真正的加密技术。或者至少将字符串转换为字节数组,对字节进行异或,并将文件写入二进制。要读回它,将文件以二进制形式读入byte[](即File.ReadAllBytes),对字节进行异或,然后将该字节缓冲区转换为字符串。

您应该使用System.IO。微软的流装饰器,用于读取/写入加密流。简单!

要读取加密的文本,这样做就足够了:

static IEnumerable<string> ReadEncryptedTextFile( string path , byte[] key , byte[] iv , Encoding encoding )
{
  string value ;
  using ( Stream s = File.OpenRead(path) )
  using ( SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create() )
  using ( ICryptoTransform transform = algorithm.CreateDecryptor( key , iv ) )
  using ( CryptoStream cs = new CryptoStream( s , transform , CryptoStreamMode.Read ) )
  using ( TextReader sr = new StreamReader(cs,encoding))
  {
      string line ;
      while ( null != ( line = sr.ReadLine() ) )
      {
          yield return line ;
      }
  }
}

写入加密文本,如下所示:

static void WriteEncryptedTextFile ( IEnumerable<string> lines , string path , byte[] key , byte[] iv , Encoding encoding )
{
  using ( Stream             s         = File.OpenWrite(path) )
  using ( SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create() )
  using ( ICryptoTransform   transform = algorithm.CreateEncryptor( key , iv ) )
  using ( CryptoStream       cs        = new CryptoStream( s , transform , CryptoStreamMode.Write ) )
  using ( TextWriter         tw        = new StreamWriter( cs , encoding ) )
  {
    foreach ( string line in lines )
    {
      tw.WriteLine( line ) ;
    }
  }
  return ;
}

您可能需要拨入您使用的特定算法(每种算法都有关于keyiv大小的要求)。

我假设您正在尝试实现某种类型的验证,以确保文件未被修改。为什么不直接获取字符串的哈希码并进行检查呢?

using (StreamReader file = File.OpenText(basePath + "jsontxt"))
{
    string s = file.ReadToEnd();
}
if (verificationCode != s.GetHashCode())
{
    // Malicious fart joke eminent!
}

你的验证码可以很容易地产生通过运行一个Powershell脚本在你的文件目录…你没有提到你是如何存储你的异或值来检查,但你可以让脚本写到一个位置,你可以检查…

$files = Get-Item "C:'test'*.js"
foreach ($file in $files)
{
    $text = Get-Content $file
    $file.BaseName +" "+ $text.GetHashCode()
}