当前哈希函数被设计为对哈希进行大的更改,即使只有很小一部分输入被更改。我需要的是一种哈希算法,其输出变异将与输入变异成正比。例如,我需要类似的东西:
Hash("STR1") => 1000
Hash("STR2") => 1001
Hash("STR3") => 1002
等。 我不擅长算法,但从来没有听说过这样的实现,虽然我几乎肯定有人应该已经提出了这个算法。
我目前的要求是要有大比特率(512比特可能?)以避免冲突。
由于
更新
我认为我应该澄清我的目标,我发现我的工作非常糟糕,解释了我的需求。对不起,我不是英语母语人士和伟大的沟通者。
所以基本上我需要这个哈希算法来搜索类似的二进制文件。您可以将其视为Antivirus哈希算法。它计算文件校验和,但与传统的散列函数不同,即使在恶意软件二进制文件中进行了一些小的修改之后,它仍然能够检测到它。这正是我正在寻找的。
另一个方面是避免碰撞。让我解释一下我的意思。这不是一个相互冲突的目标。我希望Hash(“STR1”)产生1000和Hash(“STR2”)以产生1001或1010,只要该值相对于前一个哈希值很接近就没有关系。但是Hash(“这是一个非常大的字符串或者甚至是二进制数据”+ 100个随机字符)不应该产生接近1000的值。我知道它不会总是工作并且会有一些散列/散列范围冲突,但是我想我可以引入另一个哈希算法并验证两者以最小化冲突。
那你觉得怎么样?也许有更好的方法来实现我的目标,也许我要求太多,我不知道。我不熟悉密码学,数学或算法。
再次感谢您的时间和精力
答案 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)
在其他领域,这被称为感知散列。
一种解决方法如下:
然后一个字的散列是“对于数据库中每个n-gram的第一位,这个字的频率是说n-gram高于平均频率?”
请注意,不幸的是,这会导致许多与类似单词的冲突,除非哈希长度非常长。
答案 3 :(得分:0)
它可能适合孩子,但旧NSA Kid's section有一些非常好的想法。
当然,这些算法确实不安全,因此您无法使用它来代替REAL加密。 (但是当你想要玩得开心时,你不能使用真正的加密算法。)
数字网格涉及设置网格,然后使用每个字母的坐标:
进一步的想法:
绕线方式也使用网格。从本质上讲,这些字母从左到右排成网格,向下排成行。通过在网格中垂直切片产生输出:
答案 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)。对于二进制文件,你可能想先运行反汇编程序,然后在文本版本上运行算法 - 但这只是我的感觉,我没有研究支持这个陈述,但这将是一个有趣的假设进行测试。