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

如何使“MessageDigest SHA-256和签名RSASSA-PSS”等同于“签名SHA256withRSA/PSS”

马天逸
2023-03-14

我想分两步使用RSA/PSS签名制作SHA256,首先散列一条消息,然后使用RSASSA-PSS签名摘要

    byte[] document =   {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1};
    MessageDigest digestor256 = MessageDigest.getInstance("SHA256", "BC");
    byte[] documentDigest256 = digestor256.digest(document);

    DigestAlgorithmIdentifierFinder hashAlgorithmFinder = new faultDigestAlgorithmIdentifierFinder();
    AlgorithmIdentifier hashingAlgorithmIdentifier256 = hashAlgorithmFinder.find("SHA256");

    DigestInfo digestInfo2 = new DigestInfo(hashingAlgorithmIdentifier256, documentDigest256);
    Signature s2 = Signature.getInstance("NONEwithRSASSA-PSS", "BC");
    MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256");
    PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, 32, 1);
    s.setParameter(pssParam);
    s.initSign(keyPair.getPrivate());
    s.update(digestInfo2.getEncoded());
    byte[] signature = s.sign();

但我使用SHA256时RSA/PSS无法验证

    Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");
    ver.setParameter(pssParam);
    ver.initVerify(keyPair.getPublic());
    ver.update(document);
    boolean re = ver.verify(signature);

我需要一些帮助,谢谢你的帮助。

共有1个答案

江飞章
2023-03-14

不要做信息摘要。RSASSA-PKCS1v1_5签名使用ASN中的哈希编码步骤。1 DER DigestInfo,但RSASSA-PSS签名没有;参见RFC 3447或8017。此外,您不需要使用组合算法在版本上指定参数,因为默认值已经是正确的,尽管冗余地这样做并没有什么坏处。示例修改为使用我的密钥对,并输出到控制台:

    KeyStore ks = KeyStore.getInstance("jks"); ks.load(new FileInputStream(args[0]), args[1].toCharArray());
    PrivateKey prv = (PrivateKey)ks.getKey(args[2], args[1].toCharArray()); 
    PublicKey pub = ks.getCertificate(args[2]).getPublicKey();

    byte[] document =   {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1};
    MessageDigest digestor256 = MessageDigest.getInstance("SHA256", "BC");
    byte[] documentDigest256 = digestor256.digest(document);

    Signature s2 = Signature.getInstance("NONEwithRSASSA-PSS", "BC");
    MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256");
    PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, 32, 1);
    s2.setParameter(pssParam);
    s2.initSign(prv);
    s2.update(documentDigest256);
    byte[] signature = s2.sign();

    Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");
    if(false){ ver.setParameter(pssParam); } // can enable if desired
    ver.initVerify(pub);
    ver.update(document);
    System.out.println( ver.verify(signature) );

此外,很简单,您拼错了DefaultDigest算法标识符查找器,并使用s2vss作为变量名。

 类似资料:
  • 我已经把它归结为我能做的最简单的测试用例。我需要获取Python中生成的RSASSA-PSS签名,并在Go中验证它们。创建RSA密钥对并用其签名的Python代码如下: 那里引用的pycrypto_keys库可以在这里找到,用于参考函数和的具体实现。 我的Go测试由两个简单的文件组成,这些文件只依赖于核心包。首先是验证功能,verify.go: 第二,一个测试用例。密钥对和签名是使用顶部的Pyth

  • 我们使用Chilkat在PowerBuilder 9.0.3应用程序(以及PowerBuilder 12.6)中签名HTTP请求,但这就像Chilkat生成的签名不被Isabel的API接受(我们已经联系了Isabel,他们猜测签名中存在参数问题算法)。伊莎贝尔API(https://documentation.ibanity.com/http-signature)的留档说,我们必须使用带有以下参

  • 我试图在python2.7中找到RSASSA-PSS-2048-SHA256数字签名算法。 目前我的代码如下: 但是当我们尝试验证生成的签名时,出现了签名不匹配错误。 在Java中,代码如下所示: 我不知道上面的python签名代码有什么问题。或者如何在python2中使用算法。7. 非常感谢。

  • 我正在研究PKSC1V2.2 RSASSA-PSS签名方案。我得到了一些用于最终结果测试的标准测试向量,但是我的结果不匹配。为了检查我的代码哪里出错了,我需要一些具有中间结果的测试向量。 我使用的是RSA 2048和SHA 256。 请帮助...如果有人有或者如果你知道我在哪里可以得到它?还有任何其他方法来测试它。 问候

  • 我花了无数个小时在这个图书馆里,但仍然无法让它工作。 我想用充气城堡库发送SMIME消息,用RSASSA-PSS签名,用AES加密,其中密钥传输应该是RSAES-OAEP,所有P1#v2.1 签名者优先,这是它的创建方式: 所以现在当它应该被签名、加密和使用OAEP填充时: 我找不到正确的setAlgorithmMapping()说明,因此尝试了以下组合: 顺便说一句,有人能解释一下,这个模式在这

  • 我们为RSA签名创建了调试公钥和私钥,并生成sha256哈希并保存在cp1.bin中。然后我们尝试验证签名,但总是失败。如果我们不使用pss填充,验证命令将通过。任何人都可以帮忙评论吗? 谢谢 C:\Project\pkc C:\Project\pkc