2013-04-16 73 views
2

我需要防止一些孩子修改json文本文件並在其中放置「fartface」。我當前的代碼從文本文件中獲取一個字符串,像這樣:C#如何XOR字節作爲文本文件讀入字符串

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

我可以申請一個XOR我jsontxt文件,這足以阻止惡意屁的笑話,但在我的WPF C#應用程序,我不知道如何在文件讀入字符串時實現字節XOR。

+3

這個問題沒有意義 –

+10

@SamIam - 我同意。屁笑話是有趣的。 – Brian

+0

-1:沒有描述實際問題的嘗試。 –

回答

4

嘗試使用一些祕密密鑰得到的字符串作爲字節數組,只是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 
+0

謝謝,我正在嘗試子類StreamReader,因爲我是一個完整的白癡與C#。 – Mark

+0

不要那麼關鍵。編程並不像開車一樣困難。 –

1

我看到兩個問題,這個想法。

首先,你會發現想出一個XOR值非常困難,這個XOR值在應用時會始終產生一個可讀的字符。在這種情況下,您的文件將變成二進制文件,而不是文本文件。第二,假設你可以想出一種保證可讀文件的方法,那不會阻止人們對其進行修改。

如果你想加密你的文件,使用真正的加密技術。或者至少將字符串轉換爲字節數組,XOR字節,並將文件寫入二進制文件。要讀迴文件,將該文件作爲二進制文件讀入byte[](即File.ReadAllBytes),對字節進行異或運算,然後將該字節緩衝區轉換爲字符串。

-1

我假設你正試圖實施某種類型的驗證,以確保該文件未被修改。爲什麼不只是得到你的字符串的哈希碼並檢查呢?

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

你verificationCodes可以很容易地通過運行在你的文件目錄中的PowerShell腳本製作...你不提你是如何存儲你的XOR值要檢查,但你可以有腳本寫的位置,您可以對證......

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

foreach ($file in $files) 
{ 
    $text = Get-Content $file 
    $file.BaseName +" "+ $text.GetHashCode() 
} 
+0

'Object :: GetHashCode()'不是校驗和。 –

+0

@MattEnright當然不是...... OP顯然不是在尋找校驗和......他想要一個非常簡單的方法來查看文件是否已經改變。 – Kevin

1

你應該使用System.IO.CryptoStream,微軟的流裝飾讀/寫加密的數據流。簡單!

要閱讀加密文本,這樣的事情就足夠了:

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大小的要求)。

相關問題