我读了维基百科的文章,关于MD5哈希值,但我仍然无法理解一个散列不能被“重组”回到原来的文本。

有人能解释给别人谁很少知道这个密码是如何工作的?哪一部分的功能使得它单向?

有帮助吗?

解决方案

由于大家到现在为止还简单地定义一个散列函数是什么,我会咬。

一个单向函数不仅是一个散列函数 - 即失去信息的功能 - 但功能f为此,给定图像y(“SE”或294中现有的答案),就很难找到预图像x,使得f(x)=y

这是为什么它们被称为单向的:你可以计算图像,但你不能找到一个预图像对于给定的图像

普通的哈希函数都没有提出到现在为止现有的答案具有这种性质。他们都不是单向加密散列函数。例如,给定“SE”,就可以很容易地拿起输入“SXXXE”,与属性的输入是X编码(“SXXXE”)= SE。

有没有“简单”的单向函数。他们有混合的投入这么好,不仅你完全不认识的输入输出,你不承认其他输入任一。

SHA-1和MD5曾经是流行的单向功能,但它们都几乎断(专科了解该如何为给定的图像创建前映像,或几乎能够做到这一点)。有一场比赛正在进行中选择一个新的标准之一,它被命名为 SHA- 3

一个显而易见的方法来转化一个单向函数是计算许多图像,并保存在一个表关联到每个图像产生它的原像。为了在实践中使这不可能,所有单向函数具有大的输出,至少64个比特,但可能大得多(多达,比方说,512位)。

编辑:?如何做的大部分加密散列函数的工作

通常它们在它们的核心,它(比特块一个块密码对复杂变换的单一功能)。该功能应该是接近双射(它不应该过多的序列映射到相同的图像,因为这会导致以后的弱点),但它并不一定是完全的双射。并且该功能被重复固定的次数,足以使输入(或任何可能的输入)不可能识别。

绞纱,强候选人SHA-3的上下文中的一个例子。其核心功能是重复72次。迭代的数目只为其中功能专有的创造者如何有时涉及输出到一些输入是25.他们说这具有2.9“安全系数”。

其他提示

想一个真正的基本散列 - 为对输入的字符串,返回每个字符的ASCII值的总和。

hash( 'abc' ) = ascii('a')+ascii('b')+ascii('c')
              = 97 + 98 + 99
              = 294

现在,鉴于294的哈希值,你可以告诉一下原来的字符串是?显然不是,因为“ABC”和“CBA”(和无数其他)给出相同的散列值。

加密散列函数相同的方式工作,所不同的是明显的算法复杂得多。总有一些将要碰撞,但如果你知道字符串s散列到h,那么它应该是非常困难的(“计算上不可行”)到的构造的另一个字符串也哈希到h

拍摄一个简单的类比这里代替复杂的解释。

首先,让我们打破的主题分为两个部分,单向操作和散列。什么是单向操作和为什么你会要吗?

单向操作被称为是因为他们是不可逆的。像加法和乘法最典型的操作可以被逆转,而模师不能颠倒。这是为什么重要?因为要提供一个输出值1)是困难没有原始输入和2重复)没有提供方法找出从输出器的输入。

双向

<强>加成

4 + 3 = 7  

这可以通过取之和减去所述加数的一个逆转

7 - 3 = 4  

<强>乘法

4 * 5 = 20  

这可以通过服用该产品,并通过的因素之一除以逆转

20 / 4 = 5

不可逆的

<强>模除法

22 % 7 = 1  

这不能逆转,因为没有操作,你可以做到的商和以重构除数(或反之亦然)的股息。

你能找到的地方,以补操作“?”是什么?

1  ?  7 = 22  
1  ?  22 = 7

有了这样说,单向散列函数具有相同的数学质量为模除法。

为什么这很重要?

可以说,我给你一键在已有一千储物柜总线端子柜,并要求您将它交付给我的银行家。作为聪明的家伙你,别说可疑,你会立即寻找的关键,看看更衣室号在关键写入。知道了这一点,我已经做了一些迂回的东西;第一我发现了两个数字,使用模的除法运算时给我在1和1000之间的范围内的数,第二I擦除原来的数量和从该对数字上它写入的除数,第二我选择具有一个总线终端守卫只让人们尝试每天一个储物柜他们的关键,第三银行家已经知道了分红,所以当他得到他可以自己算算,找出剩余部分,且知道要打开的储物柜钥匙保护储物柜从歹徒。

如果我选择操作数明智的,我可以接近到商和分红之间的一个一对一的关系,你试试每个更衣室其力量,因为答案利差可能投入超过所需数量的范围内的结果在终端中可用的储物柜。基本上,这意味着你不能获得对其余的任何知识,即使你知道一个操作数。

所以,现在我可以“信任”您交付的关键,它的合法主人,不用担心,你可以轻易猜出哪个更衣室它属于。当然,你可以蛮力搜索所有的储物柜但会采取近3年来,我的银行使用密钥并清空更衣室充裕的时间。

请参阅上不同的散列函数的详细细节的其他的答案。

下面是一个非常简单的例子。假设我是一个开端密码专家和我创建的散列函数执行以下操作:

int SimpleHash(file) {
    return 0 if file.length is even;
    return 1 if file.length is odd;
}

现在,这里的测试。SimpleHash(specialFile)为0 什么是我的原始文件?

显然,有没有办法知道(尽管你可能会发现很容易地,我的哈希值是基于文件的长度)。有没有办法“重新构建”基于散列因为散列不包含的一切,我的文件做了我的文件。

一个散列(非常)有损编码。

要给你一个简单的例子,假设称为X-编码一个5个字母的单词的一个虚构的2个字母编码。用于X编码算法简单:取词的第一个和最后一个字母

所以,

X-encode( SAUCE ) = SE
X-encode( BLOCK ) = BK

显然,不能从它的编码SE重建SAUCE(假设我们的可能的输入范围是所有5个字母的单词)。字可以很容易地被SPACE。

顺便说一句,事实上,酱油和空间都产生SE作为编码被称为的碰撞的,你可以看到X-ecoding不会使一个很好的哈希值。 :)

在简单术语中,散列函数的工作通过使输入数据的一个大的一团糟。

请参阅 MD5 获得实例。它通过512位的块进行处理的输入数据。每个块被分成16个32位字。有64个步骤,的16个输入字,每个使用步骤之一。因此,每个字所使用的算法的过程中四次。这是一wayness来自:任何输入比特是在几个地方输入,并且两个这样的输入的功能混合所有当前数据一起之间,使得每个输入位的影响的128位的运行状态的最多。这可以防止反转的功能,或计算发生碰撞,通过查看只有数据的一部分。您一定要看整个128位,和128位的块的空间太宽而无法被有效地走通。

现在MD5并不在它做好,因为该功能的碰撞都可以找到。从一个密码员点,MD5是一个旋转的加密函数。一个消息块M(512位)的处理中使用的输入状态V(一个128位的值),并计算新的状态V“为V” = V + E(M,V),其中‘+’是一个字处理明智此外,和“E”恰好是一个对称加密函数(也叫做“块密码”),其使用中号作为密钥和V作为要加密的消息。从定睛一看,E能够是一种“扩展型Feistel网络”,类似于DES分组密码,具有四个季度,而不是两半。细节在这里并不重要;我的观点是什么使一个“好”的哈希函数,它使用结构(称为“梅克尔-Damgård”)散列函数中,类似于什么使一个块密码“安全”。上MD5使用差分密码分析成功冲突攻击,其目的首先攻击块密码的工具。

从一个很好的分块密码术的良好散列函数,有一个步骤,它是不被驳回。随着梅克尔-Damgård结构,散列函数是安全的,如果底层分组密码是“相关密钥攻击”性,一个默默无闻的财产免遭其分组密码很少加强,因为对称加密,相关密钥攻击几乎没有任何实际影响。例如,AES加密事实并非像耐为可希望相关密钥攻击,而这并没有引发恐慌性一般。这阻力不是其被寻找AES被设计为当所述属性的一部分。它只是防止翻身的AES到哈希函数。有一个叫惠而浦的哈希函数,它建立在Rijndael算法的衍生物,“Rijndael算法”是什么成为了AES的初始名称;但惠而浦需要照顾到修改的Rijndael其是弱相关密钥攻击的部分。

另外,还有一些可用于构建一个散列函数的其他结构。当前的标准功能(MD5,SHA-1,而 “SHA-2” 家族,又名SHA-224,SHA-256,SHA-384和SHA-512)是梅克尔-Damgård功能,但是许多潜在的继任者都没有。有一个持续的竞争,由NIST(美国联邦单位与那种事交易),选择一个新的标准散列函数主办,被称为“SHA-3”。请参见的细节此页面。现在,他们都下降到14名候选人从最初的51(不包括其发送失败,代码完整提交的行政测试十几额外其编译和运行正常)。

现在让我们更概念性的样子。安全散列函数应该看起来像一个随机预言:一个oracle是一个黑盒子其中,由于一个消息时的中号作为输入,输出一个应答ħ(M )其中是随机选择,均匀地,在输出空间(即,所有的名词的比特串,如果散列函数的输出长度为名词的)。如果给定的相同的消息的中号再次作为输入,在oracle输出比以前相同的值。除此之外的限制,以前使用的oracle在非输出输入的中号是不可预测的。可想而知,Oracle作为对谁抛出骰子,并仔细记录输入的信息和相应的输出在一本大书侏儒的容器,这样他将履行他的预言合同。有没有办法来预测下一个输出将是什么,因为侏儒自己也不知道。

如果一个随机预言存在,则反相的散列函数具有成本 2 ^ N :以具有给定的输出,没有比使用不同的输入消息更好的策略直到获得预期的值。由于均匀的随机选择,成功的概率是 1 /(2 ^ n)的在每个试,并请求到骰子投掷侏儒的平均数目将是 2 ^ N 的。对于碰撞(找到两个不同的输入,其产生相同的散列值),成本约* 1.4 * 2 ^(N / 2)*(粗略地说,有* 1.4 * 2 ^(N / 2)*输出,就可以组装约 2 ^ N 对输出,其各自具有的概率 1 /(2 ^ n)的匹配,即具有两个具有相同的输出不同的输入)的。这些是可与随机预言进行最好的。

因此,我们寻找的散列函数,它们不如随机预言:他们必须以这样的方式混合输入的数据,我们不能更有效地找到碰撞比它的成本简单地调用该函数的 2 ^(N / 2)次。散列函数的祸根是数学结构,即,快捷方式,其允许攻击者查看散列函数内部状态(这是大,至少名词的比特),其住在数学对象上的变化短得多的空间。 30年的对称加密系统的公共研究已经产生可应用的概念和工具(扩散,雪崩,差速器,线性...)的全部工具。底线,然而,就是我们没有证据证明随机预言可能实际存在。我们的的散列函数不能被攻击。我们的的是哈希函数的考生,对于没有攻击是目前的的,并且,稍微好一些,我们有一些功能它的一些的种攻击可以证明没有工作。

还有一些研究工作要做。

阵列,点击  对于一些眯眼,关联数组看起来非常像哈希值。主要的区别是缺乏对哈希名称%符号,而一个只能分配给他们一次一个关键。因此,一会说$foo{'key'} = 1;,但只有@keys = keys(foo);。熟悉的功能,如每个,钥匙,和因为它们现在做(和在Perl 2的溶液中加入删除)工作值。

的Perl 3有三个整体的数据类型:它有上散列名称%符号,允许整个哈希一次被分配给,并加入dbmopen(现在淘汰,领带)。的Perl 4中使用逗号分隔的混杂键来模拟多维数组(其现在更好地与数组引用处理)。

Perl 5中采取参照关联数组作为哈希的巨大飞跃。 (据我所知,它是就此提到的数据结构中的第一语言,而不是“散列表”或类似的东西。)有点讽刺的是,它也移动相关的代码从hash.c成hv.c.

命名,点击 字典,如前所述,是由唯一键索引值的无序集合。他们有时被称为关联数组或地图。它们可以以几种方式,其中之一是通过使用被称为哈希表的数据结构来实现(这是什么的Perl是指作为一个散列)。

Perl的使用“哈希”一词是一些潜在的混乱的来源,因为散列函数的输出有时也被称为散列(特别是在加密上下文),并且因为哈希表通常不称为哈希的任何地方其他

要为安全起见,请参考的数据结构的散列表,并且只在明显,特定Perl的上下文使用的术语“散列”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top