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

PyCryptodome ECC无法验证OpenSSL生成签名(疑似ASN1问题)求助

问题排查结论
  • 核心错误出在待验证数据的处理环节,共2处错误:
    1. 使用echo test > i_am_a_test.txt生成测试文件时,echo命令默认会在输出末尾追加换行符,文件实际存储的内容是test\n(对应字节序列为b'test\n'),并非你代码中填写的纯test字符串。
    2. 代码中错误地对原始明文数据做了base64解码操作,待签名数据是普通明文,不需要做base64解码,直接传入对应字节即可。

修复后可正常运行的代码

import base64
from Crypto.Hash import SHA256
from Crypto.PublicKey import ECC
from Crypto.Signature import DSS

if __name__ == "__main__":
    # 来自publicKey.pub的公钥
    pub = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzlNm3snsI8D4VWf7vwNkR4WG0F/ymFgew1xUIVn6tUL0ln+lc/lKxOIUa3O2uFkoCUwEALCTpasWbNUoNGi+JQ=="
    # 待验证数据,对应echo test生成的文件实际内容
    data = b"test\n"
    # 来自data.sig的签名
    sig = "MEYCIQCLbTx5uk18vixVZiG/s9bpBso5u3BZcJDNDSUX5bZc6gIhAMbqzdioGmelKIgVlUmZhtaYs9Szs9asATHCJvTIx7G8"
    
    key = ECC.import_key(base64.b64decode(pub))
    # 直接用原始字节计算哈希
    h = SHA256.new(data)
    verifier = DSS.new(key, 'fips-186-3', encoding="der")
    verifier.verify(h, base64.b64decode(sig))
    print("The message is authentic.")

如果你不想硬编码文件内容,也可以直接读取测试文件的字节流计算哈希,代码更通用:

h = SHA256.new(open("i_am_a_test.txt", "rb").read())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:45:03