加密哈希函数的时间复杂度是多少?
What is the time complexity for cryptographic hash function?
假设是 MD5 还是 SHA-1?这两个的时间复杂度是多少?我试图在互联网上找到它,但它非常有限,我得到的只是它们都是 O(n)。谁能进一步启发我?也许给我一个最坏的情况和最好的情况?
MD5 和 SHA-1 算法 - 两者 都不是加密安全的,不应再使用 - 基于 Merkle-Damgard construction。这意味着它们是由
- 从采用固定宽度位块输入并输出相同大小的固定宽度位块的分组密码开始,
- 使用 cryptographically secure padding scheme 将输入填充到块大小的某个倍数,然后
- 迭代地将块密码应用于输入的一些位数的组合,加上初始化值或前一个块密码的输出。
因为块密码在固定大小的位块上工作,所以 运行 的时间复杂度是 O(1)。该块密码总共有 Θ(n) 次应用(输入被分成固定大小的块,因此这些块有 Θ(n) 次),计算填充位的成本可能是 O( 1) 但可能是 O(n)。总的来说,这意味着 运行 计算这些哈希函数的时间是 Θ(n),这是有道理的,因为每个位至少被访问一次并且每个位所做的工作是恒定的。
分组密码通常以一种方式实现,使它们在任何输入位组合上花费完全相同的时间 运行 - 或者至少,非常接近相同的时间- 尝试使它们抵抗 timing attacks,其中计算分组密码所需的时间量用于窃取一些位。因此,如果这些哈希函数在相同大小的不同输入上花费不同的时间来完成,那将是非常不寻常的。因此,与 运行 时间为 Θ(n) 这一事实无关,您不应期望在挂钟 运行 时间中看到太多变化。
假设是 MD5 还是 SHA-1?这两个的时间复杂度是多少?我试图在互联网上找到它,但它非常有限,我得到的只是它们都是 O(n)。谁能进一步启发我?也许给我一个最坏的情况和最好的情况?
MD5 和 SHA-1 算法 - 两者 都不是加密安全的,不应再使用 - 基于 Merkle-Damgard construction。这意味着它们是由
- 从采用固定宽度位块输入并输出相同大小的固定宽度位块的分组密码开始,
- 使用 cryptographically secure padding scheme 将输入填充到块大小的某个倍数,然后
- 迭代地将块密码应用于输入的一些位数的组合,加上初始化值或前一个块密码的输出。
因为块密码在固定大小的位块上工作,所以 运行 的时间复杂度是 O(1)。该块密码总共有 Θ(n) 次应用(输入被分成固定大小的块,因此这些块有 Θ(n) 次),计算填充位的成本可能是 O( 1) 但可能是 O(n)。总的来说,这意味着 运行 计算这些哈希函数的时间是 Θ(n),这是有道理的,因为每个位至少被访问一次并且每个位所做的工作是恒定的。
分组密码通常以一种方式实现,使它们在任何输入位组合上花费完全相同的时间 运行 - 或者至少,非常接近相同的时间- 尝试使它们抵抗 timing attacks,其中计算分组密码所需的时间量用于窃取一些位。因此,如果这些哈希函数在相同大小的不同输入上花费不同的时间来完成,那将是非常不寻常的。因此,与 运行 时间为 Θ(n) 这一事实无关,您不应期望在挂钟 运行 时间中看到太多变化。