用数字和字母哈希的数学

时间:2012-10-28 22:22:02

标签: c++ encryption hash

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

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

这是为了迁移访问内容的互联网抓取工具和不应该访问内容的人。我不认为它能够完全锁定一个人。

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

如果有人可以帮助我,我会非常感激,我会在学分页面给你一个位置,并附上你的个人资料或任何你想要的链接:3。

如果您有任何其他问题或信息,请不要犹豫,给我发消息。

图片GUI:

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

看来你需要的东西很简单。 (虽然找到一个优雅的数学解决方案来解决这个问题可能很有趣,但实际上没有必要) SHA-256是一个32字节长的数组。您看到的字母和数字只是数组的十六进制表示。由于十六进制数字需要4位数据,因此每个字母或数字(或字母和数字)的组合代表1个字节。这就是为什么你需要一个64长的字符串来表示一个32字节的数组。

据我所知,WinRar的密码限制为177个字符,7z没有限制。从理论上讲,您可以使用原始的64字符SHA-256表示作为密码。生成的密码非常强大,因为它有16 ^ 64 == 2 ^ 256种组合。

然而,正如它发生的那样 - 使用Base64编码可以生成更短的密码但更强大(Wikipedia是一个很好的起点)。使用Base64,您的32字节数组可以表示为43个字符的长密码,由大写和小写字母以及9位数字和+和/字符组成。所以你得到64 ^ 43> 2 ^ 256。

您可以轻松地将Base64字符串转换回哈希值。

作为旁注: 您应该注意到,由于AES256使用256位密钥,因此生成更强的密码实际上毫无用处,因为在这种情况下攻击者可以攻击密钥而忽略密码,因此使用SHA-256就足够了。但我喜欢这样一个事实:我们可以生成一个比64个字符长的密码更强的43个字符的长密码。

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

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