Java SunJCE SHA1WithRSA使用什么填充策略

Java SunJCE SHA1WithRSA使用什么填充策略,java,rsa,padding,digital-signature,jce,Java,Rsa,Padding,Digital Signature,Jce,通常,PSS和PKCS1v15都可以用于RSA签名填充。 对于java来说,代码也很简单,但它无法分辨所使用的填充策略。 我的代码: 我可以用MGF1明确定义PSS作为使用SunJCE作为提供者的填充策略吗 支持的算法列表中不存在PSS。但是,在中实现了带有RSA/PSS的SHA256 我建议使用BouncyCastle Security.addProvider(new BouncyCastleProvider()); Signature sig = Signature.getInstance

通常,
PSS
PKCS1v15
都可以用于RSA签名填充。
对于java来说,代码也很简单,但它无法分辨所使用的填充策略。
我的代码:


我可以用
MGF1
明确定义
PSS
作为使用SunJCE作为提供者的填充策略吗

支持的算法列表中不存在PSS。但是,在中实现了带有RSA/PSS的SHA256

我建议使用BouncyCastle

Security.addProvider(new BouncyCastleProvider());

Signature sig = Signature.getInstance("SHA1withRSA/PSS");
sig.initSign(privateKey);
sig.update(data);
byte[] signature = sig.sign();
已更新

中的默认
maskGenAlgorithm
为MGF1

我猜BouncyCastle正在使用它。您可以定义自己的PSS参数。例如(参见)


受答案启发,只需添加一个片段,演示如何手动设置所有参数,当然必须使用
BouncyCastle

Signature signature = Signature.getInstance("SHA256WithRSA/PSS", "BC"); //second param "BC" is not really required
MGF1ParameterSpec mgf1ParameterSpec = new MGF1ParameterSpec("SHA-256"); 
PSSParameterSpec pssParameterSpec = new PSSParameterSpec("SHA-256", "MGF1", mgf1ParameterSpec , 20, 1);
signature.setParameter(pssParameterSpec);
signature.initSign(privateKey);
signature.update(plainBytes);
byte[] signBytes = signature.sign();
谢谢@xuanzhui

以下是我如何成功验证我的(十六进制编码)签名:

public static boolean verify(String plainText, String signature, PublicKey publicKey) throws Exception {
    Signature publicSignature = Signature.getInstance("SHA512withRSA/PSS");
    publicSignature.setParameter(new PSSParameterSpec("SHA-512", "MGF1", MGF1ParameterSpec.SHA512 , 64, 1));
    publicSignature.initVerify(publicKey);
    publicSignature.update(plainText.getBytes(UTF_8));

    return publicSignature.verify(hexToBytes(signature));
}
注意:尽管文档中另有建议(
getSaltLength()
-“以位为单位返回salt长度”),salt长度似乎以字节为单位


另外,我认为“SHA512withRSA/PSS”仅受Android 23+的支持。

我已经测试过它使用
PKCS1v15
作为填充策略,但仍然不知道
SunJCE
是否支持
PSS
。我没有看到任何
MGF1
的迹象,是默认的吗?
sig.setParameter(PSSParameterSpec.DEFAULT);
Signature signature = Signature.getInstance("SHA256WithRSA/PSS", "BC"); //second param "BC" is not really required
MGF1ParameterSpec mgf1ParameterSpec = new MGF1ParameterSpec("SHA-256"); 
PSSParameterSpec pssParameterSpec = new PSSParameterSpec("SHA-256", "MGF1", mgf1ParameterSpec , 20, 1);
signature.setParameter(pssParameterSpec);
signature.initSign(privateKey);
signature.update(plainBytes);
byte[] signBytes = signature.sign();
public static boolean verify(String plainText, String signature, PublicKey publicKey) throws Exception {
    Signature publicSignature = Signature.getInstance("SHA512withRSA/PSS");
    publicSignature.setParameter(new PSSParameterSpec("SHA-512", "MGF1", MGF1ParameterSpec.SHA512 , 64, 1));
    publicSignature.initVerify(publicKey);
    publicSignature.update(plainText.getBytes(UTF_8));

    return publicSignature.verify(hexToBytes(signature));
}