Как правильно подписаться с помощью RSASSA-PSS на Java? - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно кодировать эту инструкцию openssl-sign в java.

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

Эта инструкция взята из Bundeszentralamt für Steuern (BZSt) - ELMA-File-Upload.

Bitte stellen Sie die Signaturerstellung daherauf RSASSA-PSS mit folgenden Параметр um:

Hashverfahren: SHA-256

Функция генерации маски: MGF1 с 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 голосов
/ 12 декабря 2018

Я отредактировал свой вопрос с правильным алгоритмом, чтобы создать подпись с помощью java bouncycastle.

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

Вы можете проверить сгенерированную Java-сигнатуру с помощью openssl:

openssl dgst -sha256 -sigopt rsa_padding_mode: pss -sigopt rsa_pss_saltlen: -1 -verify "publickey".pem -подпись "signaturefile" .sig "file2sign"

...