SunJCE SHA1WithRSA使用了什么填充策略

时间:2017-02-16 02:01:17

标签: java rsa padding digital-signature jce

通常,PSSPKCS1v15都可以用于RSA签名填充 而对于java,代码也很简单,但它不能告诉所使用的填充策略 我的代码:

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

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

3 个答案:

答案 0 :(得分:1)

<{3}}支持的算法列表中不存在

PSS。但是SHA256withRSA/PSS已在SunJCE中实施。

我建议使用BouncyCastle

Security.addProvider(new BouncyCastleProvider());

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

<强>已更新

android中的默认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参数。例如(见PKCS#1 v2.1

sig.setParameter(PSSParameterSpec.DEFAULT);

答案 1 :(得分:1)

受答案的启发,只需添加一个片段,说明如何手动设置所有参数,当然必须使用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();

答案 2 :(得分:0)

谢谢@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() - &#34;返回盐长度为#34;)盐长度似乎是字节

我认为&#34; SHA512withRSA / PSS&#34;仅支持Android 23 +