如何用Java中的RSASSA-PSS正确签名?

时间:2018-12-11 16:35:50

标签: java bouncycastle signature

我需要用Java编写openssl-sign-instruction的代码。

  

openssl dgst -sha256 -binary -out“ signaturefile” .sig -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -sign“ privatekey” .pem“ file2sign”

此说明来自德国联邦广播电视台(BZSt)-ELMA文件上传。

  

Bits stellen Signatureerstellung daher auf RSASSA-PSS mit folgenden参数:

     

Hashverfahren:SHA-256

     

掩码生成功能:MGF1 mit SHA-256盐:32字节尾部字段:0xBC

我已经尝试了不同的签名算法(使用和不使用bouncycastle),但是没有获得与openssl相同的签名结果。

这就是我在做什么。

public class SignTest {

    public static void main(String[] args){
        Security.addProvider(new BouncyCastleProvider());

        Signature signatureSHA256Java = Signature.getInstance("SHA256withRSA/PSS");
        signatureSHA256Java.setParameter(new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1));

        signatureSHA256Java.initSign(KeyManagerHelper.getPrivateKeyFromKeyStore("privatekey"));
        signatureSHA256Java.update(byteArray);
        byte[] signSHA256Java = signatureSHA256Java.sign();

        // after that I compare the Java-sign-bytearry with the openssl one
        System.out.println("signSHA256Java == signSHA256Openssl:\n" + Arrays.equals(signSHA256Java, signSHA256Openssl));
    }
}

1 个答案:

答案 0 :(得分:1)

我用正确的算法编辑了问题,以使用Java bouncycastle创建签名。

Signature signatureSHA256Java = Signature.getInstance("SHA256withRSA/PSS");
signatureSHA256Java.setParameter(new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1));

您可以像这样用openssl验证Java生成的签名

  

openssl dgst -sha256 -sigopt rsa_pads_mode:pss -sigopt rsa_pss_saltlen:-1-验证“ publickey” .pem-签名“ signaturefile” .sig“ file2sign”