关于流,阅读和写作的XOR

时间:2010-01-06 07:34:17

标签: .net serialization encryption stream

我最近的开启是使用BinaryFormatter而不是某些数据库产品。我有一个想法是将简单的64位数写入硬件加密狗,并用它加密我的文件 - 通过简单的XOR操作。只是因为它在另一端无法读取。我是从Stream派生出来的,还是什么?

我知道我可以简单地将这个数字放入文件中并在阅读时检查它,但是......如果它一直被XORed,我会感觉更好。

2 个答案:

答案 0 :(得分:2)

请注意,如果另一端知道有关原始数据的信息,那么XOR将非常容易破解。如果它在任何位置知道正确的8个字节,那么您的“加密”会立即被破坏。你确实确定要这样做吗?提出自己的加密方案几乎总是一个坏主意 - 你有什么理由不想使用框架中内置的众多加密算法之一吗?当然,使用硬件加密狗来获取密钥 - 但随后使用普通CryptoStream

但是,如果你真的想这样做,有两个明显的选择:

  • 构建一个流包装器,是的。除非你真的需要支持异步操作,否则我不会这样做 - 它会让事情变得更加艰难。编写一个流实现,它将另一个流代理到,并将long值与XOR一起使用,然后每当您读取或写入数据时,都应用XOR。

  • 构建ICryptoTransform的实现。然后,您可以让CryptoStream根据流内容完成所有繁重工作 - 您只需要知道如何一次转换块。我相信应该非常简单,但我不能说我自己做过。

答案 1 :(得分:1)

我不打算评论XOR加密,这太傻了。让我们专注于实现您的自定义流的实用指南。您应该从Stream派生它,以便它具有熟悉的用户界面。右键单击“Stream”,实现Abstract Class。您可以将大多数NotImplementedException抛出到位,流通常会像这样瘫痪。添加一个私有的FileStream成员,它将完成艰苦的工作。然后添加:

  • 一个构造函数,它接受一个字符串参数,即文件的路径。用它构造FileStream。
  • 实施CanWrite,返回true。
  • 实现Write()方法。对客户端传递的byte []做任何你需要做的事情。您通常需要自己的byte []缓冲区,如果它太大则调用Flush()。如果你不需要缓冲区,可以直接使用FileStream.Write()。
  • 实施Flush方法。为你的缓冲区调用FileStream.Write(),然后调用它的Flush()。
  • 实现Close和Dispose(),调用相应的FileStream方法。