Я пытаюсь подписать строку с использованием базового c кода RSA с помощью SpongyCastle на android:
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
...
Signature sign = Signature.getInstance("SHA256withRSA");
RSAPrivateKey privateKey = parsePrivateKey( pk_pem_string );
sign.initSign(privateKey, new SecureRandom());
sign.update(content.getBytes("UTF-8"));
byte[] signature = sign.sign();
Но происходит сбой с этой ошибкой:
E/AndroidRuntime( 3392): Caused by: java.security.SignatureException: java.lang.IllegalStateException: RSA engine faulty decryption/signing detected
E/AndroidRuntime( 3392): at org.spongycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi.engineSign(DigestSignatureSpi.java:142)
E/AndroidRuntime( 3392): at java.security.Signature$Delegate.engineSign(Signature.java:1418)
E/AndroidRuntime( 3392): at java.security.Signature.sign(Signature.java:739)
I обнаружили, что эта ошибка генерируется для предотвращения атак RSA-CRT, но больше нет информации о том, как исправить или предотвратить проблему. Мне нужно подписать с SHA256 с помощью RSA, потому что мне нужно взаимодействовать с внешним API, который ожидает содержимое, подписанное этим алгоритмом.
Если я использую поставщика безопасности Android по умолчанию, знак завершается с ошибкой:
Caused by: java.lang.RuntimeException: error:04000044:RSA routines:OPENSSL_internal:internal error