Мне нужно кодировать эту инструкцию 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));
}
}