2

散列使​​用一种读取文件内部数据的方法,并在数学上从中创建数字和字母。C++ 中的数学方程如何做到这一点?

我正在尝试使用 C++ 和 Visual Studio 创建一个应用程序,该应用程序读取数据文件并从中获取 SHA-256 哈希和。然后应用一个等式将其更改为不同的数字和字母,但字符更少。这个处理过的数字和字母将用作 7zip 或 rar 文件的密码。(不确定哪个更适合加密)

这是为了缓解互联网爬虫访问内容和不应该访问内容的人。我不希望它能够完全锁定一个人。

此外,它必须是可转码的。所以它必须能够从哈希到传递,最好是从传递到哈希。

如果有人可以在这方面帮助我,我将非常感激,我会在积分页面中为您提供一个位置,并提供指向您的个人资料的链接或任何您想要的链接:3。

如果您有任何其他问题或信息,请随时给我发消息。

图形用户界面图片:

4

2 回答 2

1

你根本不是在寻找哈希。如果您想要从编码到原始的可逆性,您需要加密。有很多方法可以加密某些东西,但一种非常简单的方法是使用Everpassword 的 AESCrypto.org 的 RC4之类的东西,并使用其他密码作为密钥。(如果你真的不在乎,你甚至可以使用空白密钥,它仍然会编码为看起来随机的东西。)主要区别在于 AES 通常需要填充(忽略 CTR 模式),因此它会产生更长的结果, 但 RC4 的大小与输入的大小完全相同。在上面的链接中,Bo 是通过 base64 转换扩展出来的。

不过,我真的不明白为什么您希望能够获得原始密码。我看不到一个用例可以给某人密码,然后让他们发现生成密码的原始短语以满足他们的好奇心,而您只需要加密的短语来做任何有用的事情。您不妨使用哈希中的几个字符,因为没有人会关心您是如何想到它的。

此外,哈希和密码不提供数字和字母。它们给出 1 和 0 - 数字和字母只是我们想要比较或键入它们时可视化它们的一种方便方式,因为我们不能很容易地处理原始二进制文件。但是,有许多可能的表示。

于 2012-10-29T14:21:51.397 回答
1

看来你需要的很简单。(虽然为这个问题找到一个优雅的数学解决方案可能很有趣,但实际上没有必要)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 位密钥,因此生成更强的密码实际上是毫无用处的,因为在这种情况下,攻击者可以攻击密钥并忽略密码,因此使用 SHA-256 真的足够了。但我喜欢这样一个事实,即我们可以生成一个比 64 个字符长的密码更强大的 43 个字符长的密码。

还有一个注意事项: 根据您将使用的压缩器接受的字符类型作为密码字符,您可以设计自己的 Base128 编码并将字符数减少到 37 个。

我还建议使用 7z,因为它既快速、功能强大,又是最后但并非最不重要的开源。

于 2012-10-30T19:14:32.170 回答