代码之家  ›  专栏  ›  技术社区  ›  Daniel MoÅ¡mondor

异或流,读写

  •  0
  • Daniel MoÅ¡mondor  · 技术社区  · 16 年前

    我最近启用的是binaryformatter,而不是一些数据库产品。我有一个想法,写简单的64位数字到硬件加密狗,并用它加密我的文件-通过简单的异或操作。只是因为它在另一端不可读。我是源于溪流,还是什么?

    我知道我可以简单地把那个号码放进文件里,然后在阅读时核对一下,但是…如果一路都用XORED,我会感觉好些的。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Hans Passant    16 年前

    我不想评论异或加密,那太傻了。让我们关注实现自定义流的实际指导。您应该从stream派生它,这样它对用户就有了一个熟悉的接口。右击“stream”,实现抽象类。您可以保留大部分notimplementedexception抛出,流通常会像这样瘫痪。添加一个私有的文件流成员,它将完成这项艰巨的工作。然后添加:

    • 一个带字符串参数的构造函数,文件的路径。用它构造文件流。
    • 实现canwrite,返回true。
    • 实现write()方法。对客户端传递的字节[]执行所需的任何操作。通常需要自己的byte[]缓冲区,如果缓冲区太大,则调用flush()。或者如果不需要缓冲区,直接使用filestream.write()。
    • 实现flush方法。为缓冲区调用filestream.write(),然后调用它的flush()。
    • 实现close和dispose(),调用相应的filestream方法。
        2
  •  2
  •   Jon Skeet    16 年前

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

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

    • 构建一个流包装器,是的。除非你真的需要支持异步操作,否则我不会这么做-这会让事情变得更困难。编写一个流实现,它将另一个流以及 long 将值设置为xor,然后在读取或写入数据时应用xor。

    • 构建的实现 ICryptoTransform . 那么你就有可能 标准接口 为了完成所有的繁重工作,你只需要知道如何一次转换一个块。我相信这个 应该 很简单,但我不能说我自己做过。