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

sug*_* Xu 6 java rsa signature

我想通过 2 个步骤使用 RSA/PSS 进行 SHA256 签名\xef\xbc\x8c 首先我对消息进行哈希处理,然后使用 RSASSA-PSS 对摘要进行签名

\n\n
    byte[] document =   {0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1};\n    MessageDigest digestor256 = MessageDigest.getInstance("SHA256", "BC");\n    byte[] documentDigest256 = digestor256.digest(document);\n\n    DigestAlgorithmIdentifierFinder hashAlgorithmFinder = new faultDigestAlgorithmIdentifierFinder();\n    AlgorithmIdentifier hashingAlgorithmIdentifier256 = hashAlgorithmFinder.find("SHA256");\n\n    DigestInfo digestInfo2 = new DigestInfo(hashingAlgorithmIdentifier256, documentDigest256);\n    Signature s2 = Signature.getInstance("NONEwithRSASSA-PSS", "BC");\n    MGF1ParameterSpec mgfParam = new MGF1ParameterSpec("SHA256");\n    PSSParameterSpec pssParam = new PSSParameterSpec("SHA256", "MGF1", mgfParam, 32, 1);\n    s.setParameter(pssParam);\n    s.initSign(keyPair.getPrivate());\n    s.update(digestInfo2.getEncoded());\n    byte[] signature = s.sign();\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我使用 SHA256withRSA/PSS 无法验证

\n\n
    Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");\n    ver.setParameter(pssParam);\n    ver.initVerify(keyPair.getPublic());\n    ver.update(document);\n    boolean re = ver.verify(signature);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要一些帮助才能做到这一点,谢谢你的帮助。

\n

dav*_*085 4

不要执行 DigestInfo。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) );
Run Code Online (Sandbox Code Playgroud)

另外,很重要的是,您拼写错误DefaultDigestAlgorithmIdentifierFinder并使用s2vss作为变量名称。