C#如何在将文本文件读入字符串时对字节进行异或运算
我需要防止一些孩子修改json文本文件并在其中放入“fartface”。我的当前代码从文本文件中获取一个字符串,如下所示:C#如何在将文本文件读入字符串时对字节进行异或运算,c#,C#,我需要防止一些孩子修改json文本文件并在其中放入“fartface”。我的当前代码从文本文件中获取一个字符串,如下所示: using (StreamReader file = File.OpenText(basePath + "jsontxt")) { string s = file.ReadToEnd(); 我可以对我的jsontxt文件应用XOR,这足以防止恶意放屁笑话,但在我的wpf C#app中,我不知道如何实现字节XOR,因为文件被读入字符串。尝试将字符串作为字节数组,并简
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显然不是在寻找校验和。。。他想要一种非常简单的方法来查看文件是否发生了变化。