如何从ECDSA签名推导消息与公钥?求PHP/在线测试方案
ECDSA签名逆向问题解答
核心结论
仅通过ECDSA签名值无法直接推导原始消息和公钥。原因在于ECDSA签名是私钥对消息哈希值的加密结果,签名仅包含r和s两个参数,这两个参数无法反向唯一确定对应的消息原文和公钥——存在大量不同的消息-公钥组合都能生成相同的签名(虽然概率极低,但从密码学逻辑上不具备唯一性)。
工具与实现说明
在线工具
不存在仅通过ECDSA签名就能还原消息和公钥的在线工具,所有ECDSA相关工具都需要至少一个额外输入项(比如已知公钥验证消息,或已知消息匹配公钥)。
PHP实现方案
PHP中常用openssl扩展处理ECDSA操作,但同样无法仅从签名逆向出消息和公钥。以下是仅能解析签名结构(提取r和s值)的测试用代码:
<?php // 你的Base64编码签名 $signatureBase64 = 'MEUCIH+9yjWRCSWYVW1Tk6hLE91iR8NiVetvz17C3k6ZTJo8AiEAiHe6OK7iyxjUVjpU5RKZjgXgWYP5LjdFsoE5GTB4cIA='; // 解码为二进制 $signatureBin = base64_decode($signatureBase64); // 解析ASN.1格式的签名(ECDSA签名通常用ASN.1 DER编码) $asn1 = openssl_asn1_parse($signatureBin); if ($asn1 === false) { die('无法解析签名'); } // 提取r和s值(十六进制格式) $r = bin2hex($asn1['children'][0]['content']); $s = bin2hex($asn1['children'][1]['content']); echo "签名解析出的r值: {$r}\n"; echo "签名解析出的s值: {$s}\n"; ?>
注意:这段代码仅能解析签名的结构参数,无法得到你需要的消息和公钥。
补充提示
如果想要验证签名对应的消息或公钥,你必须补充以下其中一项信息:
- 已知原始消息,尝试匹配可能的公钥(但效率极低,不具备实操性)
- 已知公钥,验证某条消息是否对应该签名
内容的提问来源于stack exchange,提问作者MK Said
相关产品推荐
相关产品推荐

