当文本文件被读入字符串时,如何XOR字节
本文关键字:如何 XOR 字节 字符串 文本 文件 | 更新日期: 2023-09-27 18:09:41
我需要防止一些孩子修改json文本文件,并把"屁脸"在他们。我当前的代码从文本文件中获取一个字符串,如下所示:
using (StreamReader file = File.OpenText(basePath + "jsontxt"))
{
string s = file.ReadToEnd();
我可以应用异或到我的jsontxt文件,这足以防止恶意放屁笑话,但在我的wpf c#应用程序,我不确定如何实现字节异或,因为文件被读成一个字符串。
尝试获取字符串作为字节数组,并简单地用一些密钥对每个字节进行异或:
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 ;
}
您可能需要拨入您使用的特定算法(每种算法都有关于key
和iv
大小的要求)。
我假设您正在尝试实现某种类型的验证,以确保文件未被修改。为什么不直接获取字符串的哈希码并进行检查呢?
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()
}