2010-01-06 73 views
0

我最近打開的是使用BinaryFormatter而不是某些數據庫產品。我有一個想法,寫簡單的64位數字到硬件加密狗中,並用它加密我的文件 - 通過簡單的XOR操作。只是這樣,在另一端就不可讀。我是從Stream推導出來的,還是什麼?異或在流上,讀取和寫入

我知道我可以簡單地把這個數字放到文件中,並在閱讀時檢查它,但是......如果它一直是XOR,我會感覺更好。

+0

我想評論一下,我不打算在這裏做防黑客版本。如果我不混淆,無論如何都要從加密狗中提取密鑰相對簡單,所以任何真正的加密都應該放在加密狗內部,而不是在代碼中完成。由於我沒有這樣的設備,但是一個簡單的HASP,我會在這裏使用XOR(也許很少有一些額外的技巧,例如用一些素數遞增'key'值) – 2010-02-04 23:15:03

回答

1

我不打算評論異或加密,這太愚蠢了。讓我們專注於實施您的自定義流的實用指南。你應該從流派生它,因此它有一個熟悉的界面給用戶。右鍵單擊「流」,實現抽象類。您可以將大部分NotImplementedException拋出,流通常會像這樣被癱瘓。添加一個私有的FileStream成員,它將會付出艱辛的努力。然後添加:

  • 一個構造器,它接受一個字符串參數,該文件的路徑。用它構建FileStream。
  • 實現CanWrite,返回true。
  • 實現Write()方法。根據需要對客戶端傳遞的字節[]執行任何操作。您通常需要您自己的byte []緩衝區,如果它變得太大,請調用Flush()。或者,如果不需要緩衝區,則直接使用FileStream.Write()。
  • 執行Flush方法。調用FileStream.Write()爲您的緩衝區,然後它的Flush()。
  • 執行Close和Dispose(),調用相應的FileStream方法。
+0

你能爲閱讀添加相同的好配方嗎? :) – 2010-02-04 23:11:09

2

請注意,如果另一端知道關於原始數據的任何信息,異或將非常容易中斷。如果它在任何位置知道正確的8個字節,那麼您的「加密」會立即被破壞。你真的確定你想要這樣做嗎?提出自己的加密方案几乎是總是一個壞主意 - 是否有任何理由不想使用框架中內置的衆多加密算法之一?當然,使用硬件加密狗來派生密鑰 - 然後使用正常的CryptoStream

但是,如果你真的想這樣做,有兩個明顯的選擇:

  • 建立一個流包裝,是的。除非你真的需要支持異步操作,否則我不會這麼做 - 這會讓事情變得更加棘手。編寫一個流實現,該流實現將另一個流用於代理,並將值與long值進行異或運算,然後在讀取或寫入數據時應用XOR。

  • 構建ICryptoTransform的實現。然後你可能會得到CryptoStream來完成所有繁重的工作 - 你只需要知道如何一次轉換一個塊。我相信這應該很簡單,但我不能說我自己做過。

+0

true ...如果文件包含大數量爲零。零被轉換成你的EOR鍵,如果有人做了簡單的十六進制文件轉儲,那麼你的關鍵是非常明顯的。 – Toad 2010-01-06 08:23:09