2017-02-16 59 views
1

通常,PSSPKCS1v15都可用于RSA签名填充。
而对于java代码也很简单,但它不能说明使用的填充策略。
我的代码:SunJCE使用什么填充策略SHA1WithRSA

Signature signature = Signature.getInstance("SHA1WithRSA"); 
signature.initSign(privateKey); 
signature.update(plainBytes); 
byte[] signBytes = signature.sign(); 

我可以明确地定义PSSMGF1如使用了SunJCE作为供应商的填充策略?

+0

我有测试它使用'PKCS1v15'作为填充策略,但仍不知道'SunJCE'是否支持'PSS'。 – xuanzhui

回答

1

PSS未出现在支持的算法列表SunJCE中。然而SHA256withRSA/PSSandroid中执行。

我建议在PKCS#1 v2.1使用BouncyCastle的

Security.addProvider(new BouncyCastleProvider()); 

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

修订

默认maskGenAlgorithm是MGF1。

RSASSA-PSS-params ::= SEQUENCE { 
    hashAlgorithm  [0] OAEP-PSSDigestAlgorithms DEFAULT sha1, 
    maskGenAlgorithm [1] PKCS1MGFAlgorithms DEFAULT mgf1SHA1, 
    saltLength   [2] INTEGER DEFAULT 20, 
    trailerField  [3] INTEGER DEFAULT 1 
} 

我认为BouncyCastle的使用它。您可以定义您自己的PSS参数。例如(见PSSParameterSpec

sig.setParameter(PSSParameterSpec.DEFAULT); 
+0

你是对的,这是不需要的。谢谢 – pedrofb

+0

我还没有看到任何'MGF1'的标志,是默认的吗? – xuanzhui

0

通过回答启发,只是增加一个片段,展示了如何手动设置所有的参数,可以,当然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();