Генерирую ключи таким образом:
KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT | PURPOSE_SIGN | PURPOSE_VERIFY )
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setKeySize(4096)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build();
generator.initialize(spec);
}
KeyPair keyPair = generator.generateKeyPair();
Проблема в том что имея на руках публичный ключ, cгенерированный по алгоритму выше, в виде String, не получается перевести в тип PublicKey. Точнее он переводиться, но при расшифровке текста, зашифрованным этим ключом, вылетает ошибка: javax.crypto.illegalblocksizeexception
Пробую восстанавливать ключи так:
public PublicKey strongRestorePublicKey(String str_key) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException
{
String modulus = str_key.substring(str_key.indexOf("=") + 1, str_key.indexOf(","));
String exponent = str_key.substring(str_key.lastIndexOf("=") + 1, str_key.indexOf("}"));
BigInteger M = new BigInteger(modulus, 16);
BigInteger E = new BigInteger(exponent, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(M, E);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey public_key_who = factory.generatePublic(spec);
Log.d("TAG123", "strongRestorePublicKey " + public_key_who.toString());
return public_key_who;
}
Ошибка:
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: javax.crypto.IllegalBlockSizeException
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:486)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at javax.crypto.Cipher.doFinal(Cipher.java:1502)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at com.example.jack.myapplication.Crypto.RSADEC(Crypto.java:186)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at com.example.jack.myapplication.MessagesActivity$2$2.run(MessagesActivity.java:592)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.os.Looper.loop(Looper.java:148)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: Caused by: android.security.KeyStoreException: Unknown error
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
03-19 14:33:57.621 619-619/com.example.jack.myapplication W/System.err: ... 10 more
Проблема была в параметре ключей. Хотя и идея кодить всё в BASE64 не лишняя. В общем я поменял этот параметр RSA/ECB/OAEPWithSHA-256AndMGF1Padding
на этот RSA/ECB/PKCS1Padding
и всё заработало.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Подозреваю что проблема с зависимостями при добавлении Spring Data, без data, напрямую с EntityManager всё работает, но нужно построить приложение с dataПри...