寻找哈希算法,其中输入的微小变化将导致哈希值

时间:2016-07-19 01:57:14

标签: c++ algorithm hash cryptography antivirus

当前哈希函数被设计为对哈希进行大的更改,即使只有很小一部分输入被更改。我需要的是一种哈希算法,其输出变异将与输入变异成正比。例如,我需要类似的东西:

Hash("STR1") => 1000
Hash("STR2") => 1001
Hash("STR3") => 1002

等。 我不擅长算法,但从来没有听说过这样的实现,虽然我几乎肯定有人应该已经提出了这个算法。

我目前的要求是要有大比特率(512比特可能?)以避免冲突。

由于

更新

我认为我应该澄清我的目标,我发现我的工作非常糟糕,解释了我的需求。对不起,我不是英语母语人士和伟大的沟通者。

所以基本上我需要这个哈希算法来搜索类似的二进制文件。您可以将其视为Antivirus哈希算法。它计算文件校验和,但与传统的散列函数不同,即使在恶意软件二进制文件中进行了一些小的修改之后,它仍然能够检测到它。这正是我正在寻找的。

另一个方面是避免碰撞。让我解释一下我的意思。这不是一个相互冲突的目标。我希望Hash(“STR1”)产生1000和Hash(“STR2”)以产生1001或1010,只要该值相对于前一个哈希值很接近就没有关系。但是Hash(“这是一个非常大的字符串或者甚至是二进制数据”+ 100个随机字符)不应该产生接近1000的值。我知道它不会总是工作并且会有一些散列/散列范围冲突,但是我想我可以引入另一个哈希算法并验证两者以最小化冲突。

那你觉得怎么样?也许有更好的方法来实现我的目标,也许我要求太多,我不知道。我不熟悉密码学,数学或算法。

再次感谢您的时间和精力

6 个答案:

答案 0 :(得分:2)

简单求和怎么样?然后,您的哈希可以以所需的大小进行换行,如果在哈希比较期间考虑到这一点,则输入中的小差异应该会产生较小的哈希差异。

然而,我认为"最小的碰撞"和"输出比例变化"是相互冲突的目标。

答案 1 :(得分:1)

对不起,误读了你的问题。 MD5或SHA-x不是您想要的。

根据维基百科,例如https://en.wikipedia.org/wiki/Substitution_cipher没有雪崩效应(这是你的意思)。

就哈希而言,您可以使用某种数字

例如:

Sub LoopThroughDirectory()
    Dim Filepath As String, MyFile As String
    Dim wkbSource As Workbook, wkbTarget As Workbook
    Dim copyRange As Range, cel As Range, pasteRange As Range

    Set wkbTarget = Workbooks("Import Info.xlsm")
    Set pasteRange = wkbTarget.Sheets("sheet1").Range("a2") ' start at row 2

    Filepath = "C:\xxxxx\"
    MyFile = Dir(Filepath)

    While MyFile > ""
        If MyFile = "Import Info.xlsm" Then GoTo NextFile    

        Set wkbSource = Workbooks.Open(Filepath & MyFile)   
        Set copyRange = wkbSource.Sheets("sheet1").Range("c3,f6,f9,f12,f15,f19,f21,f27,f30,f33,f37,f41")

        For Each cel In copyRange

            pasteRange.Value = cel.Value   ' "copy" the value

            Set pasteRange = pasteRange.Offset(, 1) ' move to the next column

        Next

        wkbSource.Close

        Set pasteRange = pasteRange.EntireRow.Resize(1,1) ' move back to the first cell in the row

        Set pasteRange = pasteRange.Offset(1) ' move to the cell bellow (next row)

    NextFile:
        MyFile = Dir

    Wend    
End Sub

希望,现在有所帮助。

答案 2 :(得分:1)

在其他领域,这被称为感知散列。

一种解决方法如下:

  1. 获得n-gram训练多重集。 (例如,如果n = 2并且您的训练数据是“这是一个测试”,您的训练集将是“Th”,“hi”,“is”,“s”等)
  2. 排序并计算所述n-gram的频率,降序。
  3. 然后一个字的散列是“对于数据库中每个n-gram的第一位,这个字的频率是说n-gram高于平均频率?”

    请注意,不幸的是,这会导致许多与类似单词的冲突,除非哈希长度非常长。

答案 3 :(得分:0)

它可能适合孩子,但旧NSA Kid's section有一些非常好的想法。

当然,这些算法确实不安全,因此您无法使用它来代替REAL加密。 (但是当你想要玩得开心时,你不能使用真正的加密算法。)

数字网格涉及设置网格,然后使用每个字母的坐标:

grid of letters

进一步的想法:

  • 混合字母安排
  • 将数字转换为二进制以进行混淆

绕线方式也使用网格。从本质上讲,这些字母从左到右排成网格,向下排成行。通过在网格中垂直切片产生输出:

The password is an enigma

答案 4 :(得分:0)

通常,面向加密的散列和加密算法的行为与您正在寻找的行为完全相反(即输入中的微小变化将导致输出发生较大变化,反之亦然),因此此算法类是死路一条。

作为对这些算法为何如此行为的快速描述:必要时,它们旨在模糊输入和输出之间的统计关系,使其更难以破解。例如,在英语中,字母“e”是迄今为止最常用的字母;在一些非常弱的经典密码中,您可以简单地找到对应于“e”的最常见的字母和数字(例如 - 如果 n 是最常见的字母,则赔率为n = e)。实际上,像你描述的统计模式可能会使算法显着更容易受到选择明文,已知明文,中间人和重放攻击的影响。

由于在不知道密钥的情况下编辑密文以获得所需的明文会更加容易(特别是如果您可以访问几个选定的明文),那么中间人和重放攻击将变得更加容易。 )。

如果你知道

7/19/2016 1:35 transfer $10 from account x to account y

(其中datestamp用于防御重放攻击)编码为

12345678910

,而

7/19/2016 1:40 transfer $10 from account x to account y

编码为

12445678910

这是一个非常安全的猜测

12545678910

意味着类似

7/19/2016 1:45 transfer $10 from account x to account y

无法访问原始密钥,您可以定期重播此数据包,只需进行简单的编辑即可继续从某人的帐户中窃取资金。当然,这是一个相当人为的例子,但它仍然说明了基本问题。

我对你要找的东西的理解是文件之间的统计相似性。这可能会对某些人有所帮助:https://en.wikipedia.org/wiki/Semantic_similarity

答案 5 :(得分:0)

这确实存在。术语是局部敏感的散列。具体实现可以在这里找到:https://github.com/trendmicro/tlsh。 根据源文档,您可能需要查看数字取证或VisualRank(来自谷歌)以查找类似的图像和视频。对于文本数据,这通常用于反垃圾邮件(请在此处阅读:http://spdp.di.unimi.it/papers/pdcs04.pdf)。对于二进制文件,你可能想先运行反汇编程序,然后在文本版本上运行算法 - 但这只是我的感觉,我没有研究支持这个陈述,但这将是一个有趣的假设进行测试。