我想分两步制作SHA256withRSA / PSS签名,首先我对消息进行哈希处理,然后使用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();
但是我使用SHA256withRSA / PSS无法验证
Signature ver = Signature.getInstance("SHA256withRSA/PSS", "BC");
ver.setParameter(pssParam);
ver.initVerify(keyPair.getPublic());
ver.update(document);
boolean re = ver.verify(signature);
我需要一些帮助,谢谢您的帮助。
不要做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) );
同样,琐碎地,您将拼写错误DefaultDigestAlgorithmIdentifierFinder
并在变量名中使用了s2
vs。s
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句