当前位置: 首页 > 知识库问答 >
问题:

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

杜海
2023-03-14

这是我的Java代码,正如预期的那样,它成功地验证了签名。

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代码,它不验证签名,正如预期的那样:

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的消化长度。密钥和签名看起来也一样。怎么了?

共有1个答案

锺离伟彦
2023-03-14

加密。Signature.pss.PSS_SigScheme不返回验证结果为True/False,但在验证失败时抛出一个ValueError异常,即将if语句替换为:

try:
    verifier.verify(hash, signatureBytes)
    print("Signature authentic")
except (ValueError):
    print("Signature not authentic")
    

通过此更改,验证成功。在您发布的代码中,验证()返回一个,因此即使验证成功,也会执行其他分支。

 类似资料:
  • 问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。

  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • PHP5.5中新的password_hash API非常好,我想开始在任何地方使用它。对于一个使用旧数据库的旧项目,密码存储在md5散列中,将旧用户密码迁移到新的、更安全的API的最佳方法是什么? 除了简单地提示用户在下一次登录时重置密码(这对用户来说是不切实际和令人讨厌的)之外,我还考虑了使用当前md5哈希作为所有现有用户的password_hash()输入的可能性。为了验证这些用户的密码(在登

  • 我使用以下代码使用PBKDF2对密码进行哈希: 如何验证身份验证的密码?看来我需要拿到用来哈希密码的盐。我怎么拿到?请注意,我没有使用单独的字段来存储哈希。数据库中只存储散列密码。

  • 嗨,我想知道如果你有你要寻找的对象的Hashcode,是否可以直接访问HashSet的内容,有点像在HashMap中使用Hashcode作为键。 我想它可能会像这样工作: 谢谢 编辑:谢谢你的回答。好的,我知道我可能会稍微推动HashSet的契约,但是对于这个特定的项目,等式完全由hashcode决定,我确信每个hashcode/hashbucket只有一个对象。我非常不愿意使用HashMap的原

  • 问题内容: 我需要一个Python / C / C ++ / Java实现,可以 暂停散列进步 和 商店 ,在这样一个文件进度的进展是 可恢复 从该文件在稍后阶段。 无论上面列出的是哪种语言编写的,它都应该可以在Python中正常工作。建议您提供它以便与“ hashlib”一起良好地工作,但这不是必需的。同样,如果已经存在这样的事物,那么到此的链接就足够了。 对于一个想法 ,您的实现应该实现什么。