【问题标题】:how to store additional data in a text file apart from it's content - C++如何在文本文件中存储除内容之外的其他数据 - C++
【发布时间】:2022-08-09 02:10:33
【问题描述】:

我正在做这个小型大学项目,我必须创建一个基于控制台的具有一些功能的文本编辑器,并且使文件受密码保护就是其中之一。正如我所说,这是一个面向 OOP 入门课程的大学项目,因此它不需要是地球上最安全的东西。我打算使用一个简单的凯撒密码来加密我的文件。

唯一的问题是密码。我将使用密码作为加密密钥,它会起作用,但问题是处理密码错误的情况。如果没有检查,那么它只会显示乱码,但我想让它在密码错误的情况下显示一条消息。

我想出的想法是以某种方式将未加密文件的哈希值存储在该文本文件中(但当我用记事本打开文件时它不应该显示该哈希值)并且在使用提供的密码解密后,我可以只需散列内容并检查它是否与存储在该文件中的隐藏散列匹配。可能吗?

顺便说一句,我使用的是 Windows,可移植性不是问题。

  • 您可以使用Alternative Data Stream,这是特定于 NTFS 的功能。但要知道,如果该文件曾经被复制到非 NTFS 文件系统,ADS 将会丢失。
  • 一个更简单的选择是将散列附加到加密文件内容的开头/结尾,然后在解密文件时忽略散列字节。哈希不会出现在解密的内容中,这使得无论文件如何复制都可以保留哈希。此外,对整个文件内容进行散列处理是不必要的,如果文件很大,也会很冗长。您可以简单地存储正确密码的哈希值,然后在解密期间将其与用户输入的哈希值进行比较。将错误密码散列为正确值的可能性可以忽略不计。
  • @RemyLebeau 是的,但如果我用任何其他文本编辑器打开它,我希望我的文件是干净的。哈希应该是不可见的。
  • 在文本编辑器中打开加密文件无论如何都会显示垃圾,那么如果哈希作为额外垃圾存在有什么关系呢?您的要求没有意义,也没有必要。
  • 编辑器的代码页是什么? ASCII,ANSI,一些单字节一,完整的Unicode?

标签: c++ encryption hash file-handling txt


【解决方案1】:

一般来说,理论上你不能设计一种数据格式,其中只有纯文本是它的有效子集,但也可以有元数据(散列或其他东西)。想一想:你如何在每个字节都被解释为文本的文件中存储文本以外的东西(即元数据)?

也就是说,有一些技巧可以将元数据隐藏起来。使用 Unicode,技巧的范围更广。例如,您可以使用类似空格的字符来编码元数据或以用户不会注意到的方式指示元数据的存在。考虑 Unicode BOM。它是“零长度空格”字符。不会在记事本中看到,用作元数据。你可以做类似的事情。

他们已经提到了替代数据流。虽然其中一个可以保留元数据,但另一种数据流无法保存存档、电子邮件、上传到 Google Drive/OneDrive/Dropbox、使用不知道它的程序复制或复制到文件系统不支持它(例如,带有 FAT 的 CD 或闪存驱动器)。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多