【问题标题】:Mathematics of Hashing with numbers and letters数字和字母散列的数学
【发布时间】:2012-10-18 07:02:22
【问题描述】:

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

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

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

此外,它必须是可转码的。所以它必须能够从 Hash 到 pass,从 pass 到 hash,最好是。

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

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

图形用户界面图片:

【问题讨论】:

  • 如果您从哈希中删除字节以创建密码,这是一种方式操作。
  • 应该有一种方法我会想,如果不是我也不介意它是否是单向操作,我可以在此基础上进行构建。
  • 好吧,缩短的哈希仍然是哈希,只是安全性较低。
  • 计算一个 SHA256 摘要(32 个字节)并只保留其中的一部分(12 个字节),base64 编码为您的 16 字符“密码”将适用于单向。请记住,您剥离散列的每一点都会使巧合碰撞的可能性增加 2 的幂。无论 7zip 允许的最大密码长度如何,都可以使用它。每一点都很重要。我仅使用 12 字节作为示例,因为它可以很好地融合到 4/3 升迁到 asci。为了回答您的其他评论,没有散列的压缩(由于它们太短且分散,它们做得非常糟糕),您可以忘记双向性。

标签: c++ encryption hash


【解决方案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,因为它既快速、功能强大,又是最后但并非最不重要的开源。

【讨论】:

  • 实际上,Base64 密码仍然有 256 位熵,就像十六进制一样,因为它是从 256 位哈希派生的。是的,43*6 = 258 > 256,但额外的两个位将简单地为零。
  • @IlmariKaronen - 为什么你可能是对的,但关于密码你实际上是错的。 Base64 密码是通过表格生成的。因此,生成的密码不仅仅是相同位的不同表示。它是一个 344 位长的新位串。因此,除非您攻击用于生成它的原始哈希,否则您将获得更大的熵。仅当您首先知道密码是如何生成的时,您的观点才真正有效。
  • 识别 base64 编码的数据往往很容易,尤其是当您有多个样本时。
  • @IlmariKaronen - 你是对的。很容易识别 Base64 字符串。但是,如果您只有加密文件,那么您有两个选择 - 攻击密码或攻击加密密钥。如果你选择第一个选项,你将不得不处理 2^344 的熵,或者如果你知道你只有 64 个可能的字符,那么熵为 64^43 - 两者都大于 2^256。但是,如果您知道密码是如此之大,那么最好攻击 2^256 的加密密钥。但是鉴于您知道密码是如何生成的-您是绝对正确的。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2014-10-21
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2019-11-12
    • 2018-07-29
    • 2021-08-14
    • 2014-10-08
    相关资源
    最近更新 更多