Hash 密码散列函数是如何设计的?

Hash 密码散列函数是如何设计的?,hash,cryptography,Hash,Cryptography,在解释了为什么单向散列函数是单向的之后,我想知道如何设计一个散列函数。是的,我知道不使用经过验证和测试的哈希函数是个坏主意,但我仍然想知道设计中什么是重要的,设计过程是什么样的 我熟悉Feistel网络密码,但这些密码必须是可逆的,这对于加密散列非常可怕。是否有某种结构在加密哈希中得到了很好的应用?使其成为单向功能的东西?目前正在运行,其目标是找到旧的SHA-1和SHA-2功能的替代品。 您可以获得所有参与其中的算法的白皮书(参见第2轮提交)。描述了许多不同的哈希函数,以及它们的优点和问题。哈希

在解释了为什么单向散列函数是单向的之后,我想知道如何设计一个散列函数。是的,我知道不使用经过验证和测试的哈希函数是个坏主意,但我仍然想知道设计中什么是重要的,设计过程是什么样的

我熟悉Feistel网络密码,但这些密码必须是可逆的,这对于加密散列非常可怕。是否有某种结构在加密哈希中得到了很好的应用?使其成为单向功能的东西?

目前正在运行,其目标是找到旧的SHA-1和SHA-2功能的替代品。

您可以获得所有参与其中的算法的白皮书(参见第2轮提交)。描述了许多不同的哈希函数,以及它们的优点和问题。

哈希函数的“单向性”不容易计算。通常,哈希函数在很长一段时间内都能经受住加密社区的审查,从而显示出良好的质量。您可以查看一些已发布的针对现有哈希函数的攻击,并尝试设计一个专门避免这些攻击的哈希函数,但即使这样,它也可能被证明对另一种新攻击很弱


作为一个非常好的起点,我建议大家阅读NIST竞赛(参见tanascius的答案)。

哈希函数和其他加密函数都是用非常强大的数学概念创建的。它们中的大多数都是构建的,因此不一定无法对它们进行反向/解密,但根据当前计算机的性能,这样做是不可行的。这就是为什么以前认证的DES和MD5算法现在已经过时的原因。既然如此,我建议您首先阅读与加密哈希函数相关的数学概念。哪一个是?我会把这个留给比我更有知识的人:)

首先你应该读一读。这本书的全称是《应用密码学手册》


接下来,我建议您查看现有哈希函数的分析。例如,Skein是SHA-3最强大的竞争对手之一。Skien's包含了大量关于如何构造和安全的文档。

你应该从这本书开始,它是一本关于设计各种晶片算法的全面介绍性教科书。

密码学家Bart Preneel的博士论文是对这门学科的一个很好的概述:

只需丢弃部分结果,即可将密码转换为哈希函数。虽然这不是生成散列函数的最快方法,而且在可能需要双射散列函数的情况下(例如,一个函数将接受128位的输入并产生128位的输出,这样每个可能的输出值都会出现在某些输入中),它肯定不起作用,但它应该适用于多种用途

我能自己表述的唯一类型的双射单向函数是(128->128的例子):

  • 将全零输入映射到全零输出。
  • 对于任何其他输入,加载一个带所有1的线性反馈移位寄存器,将输入解释为128位移位计数,并运行移位器进行如此多的计数(请注意,这并不需要实际执行2^128步!)。
    反转单向散列需要解决离散日志问题。对于大量的位,这确实是一个困难的问题,但不幸的是,我相信有一些方法可以解决n=128的问题。我怀疑使用大于2的基数,并使用xor以外的基本运算,可能会提高方法的强度,但我不知道如何分析这些调整以确保函数是双射的。

    您可以从基本的数学单向运算开始,例如模(%)运算符。然后将其扩展到位单向运算符,并扩展到模糊性和模糊性。这可能更适合于or。