You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当原始值小于256位时,能否从Keccak_256哈希还原原始值?

短文本从Keccak_256哈希还原的问题

信息是否真的丢失?

从哈希函数的单向性定义来看,它被设计为无法通过多项式时间算法从哈希值反推原始输入,但这是针对任意输入空间的通用情况。对于输入空间极小的场景(比如8位ASCII字符,总共仅256种可能),暴力枚举所有可能输入并对比哈希值是完全可行的——这种情况下,信息并没有“实际可感知的丢失”,原始输入可以被准确还原。

需要明确的是:哈希函数的碰撞特性依然存在(理论上存在不同输入得到相同哈希的可能),但对于8位输入这种极小空间,碰撞出现的概率极低,实际还原时几乎可以忽略。

如何还原原始值?

以你提到的哈希值3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb为例,还原步骤如下:

  1. 锁定输入范围:原始输入是8位字符,对应ASCII码的0-255,共256种可能。
  2. 枚举计算哈希:对每一个可能的输入值,计算其Keccak_256哈希。
  3. 匹配哈希值:将计算出的哈希与目标哈希对比,找到完全匹配的输入。

代码示例(Python)

使用pycryptodome库实现还原:

from Crypto.Hash import keccak

# 目标哈希值
target_hash = "3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb"

# 枚举所有8位可能的输入(ASCII码0-255)
for ascii_code in range(256):
    input_data = bytes([ascii_code])
    # 计算Keccak_256哈希
    hash_obj = keccak.new(digest_bits=256)
    hash_obj.update(input_data)
    computed_hash = hash_obj.hexdigest()
    # 对比哈希值
    if computed_hash == target_hash:
        print(f"原始输入为: '{chr(ascii_code)}' (ASCII码: {ascii_code})")
        break

运行这段代码会直接输出:原始输入为: 'a' (ASCII码: 97)

注意事项

这种还原方法仅适用于输入空间极小的场景。如果输入长度增加(比如16位字符、短字符串),可能的输入组合数会指数级增长,暴力枚举会变得耗时甚至不可行——此时哈希的单向性就会生效,无法快速还原原始输入。

内容的提问来源于stack exchange,提问作者aste123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:42:26