基本上我正在实现一个字典,我不希望任何用户访问我的字典 .txt 文件。我需要从我的程序中访问该文件。txt 文件太大,加密方法需要很长时间才能解密它们。还有哪些其他方法?
4 回答
你给自己设定了一个几乎不可能完成的任务。
根据“读取”的一些定义,您的程序的任何用户都可以“读取”文件,只需要求程序进行查找即可。
如果您想通过程序以外的其他方式阻止对文件的读取访问,您唯一有效的选择是拒绝对文件的物理访问(通过将其托管在服务器上并在其前面有一个仅允许查询的 API) . 任何能够访问程序和数据文件的知识渊博和坚定的用户都将能够破译它。对某些人来说,加密数据文件会使这变得更加困难,但前提是程序中没有内置密钥,但用户必须手动输入。然后只有那些拥有密钥的人才有合理的机会破译数据文件。
巴特的回答是完全有效的。但问题可能有解决方案。
根据字典的实际作用,您可以使用 Bloom 过滤器或其他概率哈希数据结构来避免以任何直接方式存储其内容。但是在这种情况下,您将无法访问单词,只能检查单词是否存在。
通过向程序查询所有可能的单词,这样的字典仍然容易受到攻击。这可能可行,也可能不可行;目前还不清楚你到底在做什么。
如果您真的很重视安全性,那么您应该使用适当的长密钥加密。[但是请参阅有关“您将密钥存储在哪里”的评论-您无法安全地执行此操作]。
但是,如果您只是想让文件在文本编辑器中有点难以阅读,您可以使用某种形式的简单压缩[还有一个好处是占用更少的空间]。字节对编码很容易实现。霍夫曼编码需要更多的努力。显然,使用现有的编码技术,如 gzip、bzip2、xz 或其他一些技术,破解的难度会小一些,因此不会具有相同的保护特性。
如果目的是让普通用户(例如,不精通破解代码和破解软件的人)难以使用,则使用简单的“位旋转”来存储密钥 - 例如获取顶部和底部 4 位字符并反转它们:char ch = (orig_ch >> 4) | ((orig_ch & (1<<4)-1) << 4);
会使普通用户几乎无法阅读内容。
就像许多人已经观察到的那样,不可能 100% 地保护您的数据免受用户的侵害。只要有足够的时间,任何有足够决心的用户都会得到它。
但是,有一种“简单”的方法可以确保用户不会“弄乱”字典文件中的数据:您可以使用二进制文件 I/O:
ofstream out("dictionary.dat",ios::binary);
out.write((char*) &your_data, sizeof(your_data));
对于阅读,您可以执行类似的操作:
ifstream in("dictionary.dat",ios::binary);
in.read((char*) &your_data, sizeof(your_data));
这不是真正意义上的“加密”,它只是一种替代表示,使人们更难“弄乱”您的数据。
此外,与其担心用户是否会弄乱您的数据文件,不如实施检测文件是否被篡改的方法(例如:校验和、文件哈希等)并拒绝加载它会更有意义。