是否存在输出固定大小且可从结果反推输入的可逆算法?
可逆类哈希定长输出算法方案
首先明确数学层面的硬限制:如果算法支持无上限的任意长度输入、同时输出固定大小结果,根据鸽巢原理必然存在多输入对应同一输出的碰撞,这种情况下不可能实现100%的无前提可逆。只有给输入加上长度上限限制,或者额外存储映射关系,才能满足你的需求,对应不同场景的可行方案如下:
输入长度有明确上限的场景
如果你的实际使用中输入的最大长度 ≤ 输出长度 - 少量元数据长度,可以直接用以下两种原生可逆的方案:
- 带长度头的填充方案
实现逻辑非常简单,以输出32字节定长结果为例:- 取前2字节存储原始输入的字节长度(最多支持65535字节的输入)
- 拼接原始输入内容
- 剩余空位用固定规则的填充字节(比如
0x00)补满到32字节
反推时只要读取前2字节拿到原始长度,再截取对应长度的内容即可还原输入。
- 无损压缩+填充方案
如果需要支持更长的输入,可以先对原始输入用DEFLATE等无损压缩算法处理,再按上面的规则加长度头、补全到固定输出长度,只要压缩后的内容大小不超过阈值就可以正常可逆。 - 对称加密补全方案
如果需要输出结果具备类哈希的混淆性,无法直接看出原始内容,可以用AES-CTR等流密码加密原始输入后再补全到固定长度,解密时用相同密钥就可以还原输入,输出结果的分布和常规哈希结果类似。
输入无长度上限的场景
如果确实需要支持任意长度的输入,只能采用映射存储的伪可逆方案:
- 哈希映射查表方案
用常规哈希算法(比如SHA-256)生成定长输出,同时将「哈希结果 -> 原始输入」的映射关系存储在KV数据库或者本地存储中。反推时直接通过哈希结果查询对应的原始输入即可,这种方案的输出完全符合常规哈希的定长、低碰撞特征,唯一的要求是你需要提前存储所有需要反推的输入的映射关系,未存储过的输入对应的哈希无法反推。
内容的提问来源于stack exchange,提问作者Tahsin Alpaydın
相关产品推荐
相关产品推荐

