散列使用一种读取文件内部数据并以数学方式从中创建数字和字母的方法。 C++ 中的数学方程是如何做到这一点的?
我正在尝试使用 C++ 和 Visual Studio 创建一个应用程序,该应用程序读取数据文件并从中获取 SHA-256 哈希和。然后应用方程式将其更改为不同的数字和字母,但字符较少。经过处理的数字和字母将用作 7zip 或 rar 文件的密码。 (不确定哪个更适合加密)
这是为了迁移访问内容的互联网爬虫和不应该访问内容的人。我不指望它能够将一个人完全锁在门外。
此外,它必须是可转码的。因此它必须能够从哈希到通行证,并且最好能够从通行证到哈希。
如果有人能在这方面帮助我,我将非常感激,我会在制作人员名单页面中为您提供一个位置,并提供您的个人资料或您想要的任何内容的链接:3。
如果您有任何其他问题或信息,请随时给我留言。
GUI图片:
最佳答案
看来你需要的很简单。 (虽然为这个问题找到一个优雅的数学解决方案可能很有趣,但实际上没有必要) SHA-256 是一个 32 字节长的数组。你看到的字母和数字只是数组的十六进制表示。由于十六进制数字需要 4 位数据,两个字母或数字(或字母和数字)的每个组合代表 1 个字节。这就是为什么需要 64 长的字符串来表示 32 字节数组。
据我所知,WinRar 的密码限制为 177 个字符,而 7z 则没有限制。理论上,您可以使用原始的 64 个字符 SHA-256 表示形式作为密码。生成的密码非常强大,因为它有 16^64 == 2^256 种组合。
然而,事实上 - 使用 Base64 编码可以生成更短但更强大的密码(维基百科是一个很好的起点)。使用 Base64,您的 32 字节数组可以表示为 43 个字符长的密码,由大写和小写字母以及 9 个数字以及 + 和/字符组成。所以你得到 64^43 > 2^256。
您可以轻松地将 Base64 字符串转换回哈希值。
作为旁注: 您应该注意到,由于 AES256 使用 256 位 key ,因此生成更强的密码实际上毫无用处,因为在这种情况下,攻击者可以攻击 key 并忽略密码,因此使用 SHA-256 确实足够了。但我喜欢这样一个事实:我们可以生成比 64 字符长的密码更强的 43 字符长密码。
还有一个旁注: 根据您将使用的压缩器接受作为密码字符的字符类型,您可以设计自己的 Base128 编码并将字符数减少到 37 个。
此外,我建议使用 7z,因为它速度快、功能强大,而且最后但并非最不重要的是开源。
关于c++ - 数字和字母的哈希数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13113595/