首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试将Java RSA-PSS签名验证码(使用SHA256哈希、SHA1 MGF哈希)转换为Python

尝试将Java RSA-PSS签名验证码(使用SHA256哈希、SHA1 MGF哈希)转换为Python
EN

Stack Overflow用户
提问于 2021-01-31 13:54:19
回答 1查看 184关注 0票数 1

下面是我的Java代码,它成功地验证了签名,不出所料。

代码语言:javascript
复制
Signature sig = Signature.getInstance("RSASSA-PSS");
PSSParameterSpec pssParams = new PSSParameterSpec(
    "SHA-256",
    "MGF1",
    new MGF1ParameterSpec("SHA-1"),
    MessageDigest.getInstance("SHA-256").getDigestLength(),
    PSSParameterSpec.TRAILER_FIELD_BC
);
sig.setParameter(pssParams);

sig.initVerify(publicKey);
sig.update(plaintext.getBytes());
System.out.println(sig.verify(signatureBytes) ? "good" : "bad");

完整的代码(包括导入、密钥、消息和签名)可以在https://pastebin.com/PmhGDaPv上看到,以防您想要重现该问题。

我的Python代码并没有像预期的那样验证签名:

代码语言:javascript
复制
hash = Hash.SHA256.new(message.encode("ascii"))
verifier = pss.new(key, mask_func=lambda x, y: pss.MGF1(x, y, Hash.SHA1), salt_bytes=Hash.SHA256.digest_size)
if verifier.verify(hash, signatureBytes):
    print("good")
else:
    print("bad")

完整的代码(包括导入、密钥、消息和签名)可以在https://pastebin.com/f5iW4Xdg上看到,以防您想要重现该问题。

因此,在这两个代码中,散列是SHA256,而MGF1散列是SHA1。且盐长度等于SHA256的摘要长度。密钥和签名似乎也是一样的。有什么事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-31 15:46:46

Crypto.Signature.pss.PSS_SigScheme#verify()不会以True/False的形式返回验证结果,但如果验证失败,则会抛出ValueError异常,即将if语句替换为:

代码语言:javascript
复制
try:
    verifier.verify(hash, signatureBytes)
    print("Signature authentic")
except (ValueError):
    print("Signature not authentic")

通过此更改,验证成功。在您发布的代码中,verify()返回一个None,因此即使验证成功也会执行else-branch。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65976176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档