能否通过RIPEMD160(Hash160)生成公钥?版本0场景下是否有可实现方案?
关于RIPEMD160(Hash160)反推公钥的相关解答
基础结论
首先明确:正常情况下无法直接从RIPEMD160公钥哈希反推原始公钥。
- RIPEMD160是密码学单向哈希函数,本身设计就不支持逆运算
- 比特币体系中使用的Hash160是
RIPEMD160(SHA256(公钥))的组合哈希,输出固定20字节,而压缩公钥长度为33字节、非压缩公钥为65字节,输入空间远大于输出空间,存在哈希碰撞的理论可能但无实用化的逆算方法
版本0场景下的公钥获取方案原理
你提到的“版本0场景下可从Hash160计算公钥”的说法,通常指两种可行场景,并非哈希逆算:
- 比特币版本0 P2PKH地址已发生过链上支出
比特币版本0地址就是P2PKH地址,当该地址发起转账(即支出UTXO)时,解锁脚本需要附带原始公钥和有效签名,此时公钥会直接在链上公开,只需从交易数据中提取即可,不需要做哈希逆运算。 - 候选公钥范围已知的匹配场景
如果已经明确目标公钥属于某个小范围的候选集合,可以通过遍历所有候选公钥、逐个计算其Hash160值和目标值比对的方式找到对应公钥,本质是枚举匹配而非逆算哈希。
该方案的技术逻辑非常简单:哈希计算是确定性过程,同一个公钥的Hash160值唯一且固定,只要候选集范围足够小,遍历匹配的成本完全可以接受。如果候选集是全量公钥空间,2^160的搜索空间没有任何可行性。
示例实现代码
运行前需要先安装依赖:pip install ecdsa
import hashlib from ecdsa import SigningKey, VerifyingKey, SECP256k1 def calc_hash160(pub_key: bytes) -> bytes: # 计算公钥对应的Hash160值 sha256_result = hashlib.sha256(pub_key).digest() return hashlib.new('ripemd160', sha256_result).digest() def find_pubkey_from_hash160(target_hash160: bytes, candidate_pubkeys: list[bytes]) -> bytes | None: for pubkey in candidate_pubkeys: if calc_hash160(pubkey) == target_hash160: return pubkey return None # 测试用例 if __name__ == "__main__": # 生成测试公钥作为候选 test_privkey = SigningKey.generate(curve=SECP256k1) test_pubkey = test_privkey.get_verifying_key().to_string('compressed') test_hash160 = calc_hash160(test_pubkey) # 构造候选公钥列表 candidates = [ b'\x02' + b'a'*32, b'\x03' + b'b'*32, test_pubkey, b'\x02' + b'c'*32 ] matched_pubkey = find_pubkey_from_hash160(test_hash160, candidates) if matched_pubkey: print(f"匹配到对应公钥: {matched_pubkey.hex()}") else: print("候选集中无对应公钥")
内容的提问来源于stack exchange,提问作者rage0920
相关产品推荐
相关产品推荐

