Как получить PublicKey из String

206
21 марта 2017, 11:45

Генерирую ключи таким образом:

 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
Answer 1

Проблема была в параметре ключей. Хотя и идея кодить всё в BASE64 не лишняя. В общем я поменял этот параметр RSA/ECB/OAEPWithSHA-256AndMGF1Padding на этот RSA/ECB/PKCS1Padding и всё заработало.

READ ALSO
Работа с JComboBox

Работа с JComboBox

Здравствуйте, нужна помощь с JComboBox

254
Spring MVC + Spring Data

Spring MVC + Spring Data

Подозреваю что проблема с зависимостями при добавлении Spring Data, без data, напрямую с EntityManager всё работает, но нужно построить приложение с dataПри...

325
Проблемы с WebView

Проблемы с WebView

Организую экраны с помощью Flipper

324