C#如何在将文本文件读入字符串时对字节进行异或运算

C#如何在将文本文件读入字符串时对字节进行异或运算,c#,C#,我需要防止一些孩子修改json文本文件并在其中放入“fartface”。我的当前代码从文本文件中获取一个字符串,如下所示: using (StreamReader file = File.OpenText(basePath + "jsontxt")) { string s = file.ReadToEnd(); 我可以对我的jsontxt文件应用XOR,这足以防止恶意放屁笑话,但在我的wpf C#app中,我不知道如何实现字节XOR,因为文件被读入字符串。尝试将字符串作为字节数组,并简

我需要防止一些孩子修改json文本文件并在其中放入“fartface”。我的当前代码从文本文件中获取一个字符串,如下所示:

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

我可以对我的jsontxt文件应用XOR,这足以防止恶意放屁笑话,但在我的wpf C#app中,我不知道如何实现字节XOR,因为文件被读入字符串。

尝试将字符串作为字节数组,并简单地用一些密钥对每个字节进行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

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

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

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


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

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

using (StreamReader file = File.OpenText(basePath + "jsontxt"))
{
    string s = file.ReadToEnd();
}
if (verificationCode != s.GetHashCode())
{
    // Malicious fart joke eminent!
}
通过在文件目录上运行Powershell脚本,可以轻松生成验证代码。。。您没有提到如何存储要检查的XOR值,但您可以将脚本写入可以检查的位置

$files = Get-Item "C:\test\*.js"

foreach ($file in $files)
{
    $text = Get-Content $file
    $file.BaseName +" "+ $text.GetHashCode()
}
您应该使用Microsoft的stream decorator来读取/写入加密流。简单

要读取加密文本,以下内容就足够了:

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 ;
      }
  }
}
静态IEnumerable ReadEncryptedTextFile(字符串路径,字节[]键,字节[]iv,编码)
{
字符串值;
使用(streams=File.OpenRead(path))
使用(SymmetricAlgorithm algorithm=SymmetricAlgorithm.Create())
使用(ICryptoTransform transform=algorithm.CreateDecryptor(key,iv))
使用(CryptoStream cs=新的CryptoStream(s,transform,CryptoStreamMode.Read))
使用(TextReader sr=新的StreamReader(cs,编码))
{
弦线;
while(null!=(line=sr.ReadLine())
{
收益率回归线;
}
}
}
要写入加密文本,请执行以下操作:

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 ;
}
静态void WriteEncryptedTextFile(IEnumerable行,字符串路径,字节[]键,字节[]iv,编码)
{
使用(streams=File.OpenWrite(path))
使用(SymmetricAlgorithm algorithm=SymmetricAlgorithm.Create())
使用(ICryptoTransform transform=algorithm.CreateEncryptor(key,iv))
使用(CryptoStream cs=新的CryptoStream(s,transform,CryptoStreamMode.Write))
使用(TextWriter tw=新的StreamWriter(cs,编码))
{
foreach(行中的字符串行)
{
tw.WriteLine(行);
}
}
返回;
}

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

这个问题不适用sense@SamIam-我同意。放屁笑话总是很有趣。-1:没有人试图解决所描述的实际问题。谢谢,我试图对StreamReader进行子类化,因为我是一个有c#的白痴。不要那么挑剔。编程不像开车那么难。
Object::GetHashCode()
不是校验和。@MattEnright当然不是。。。OP显然不是在寻找校验和。。。他想要一种非常简单的方法来查看文件是否发生了变化。