2010-01-06 104 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