javax.crypto.IllegalBlockSizeException во время декодирования - PullRequest
0 голосов
/ 26 апреля 2018

После попытки сохранить пароль в Android KeyStore я получаю javax.crypto.IllegalBlockSizeException.Вот мой код:

    public static String decode(String encodedString, Cipher cipher) {
    try {
        byte[] bytes = Base64.decode(encodedString, Base64.NO_WRAP); // bytes.length= 44, as I know it should be multiple of 16, am I right ? How to make it right ?
        return new String(cipher.doFinal(bytes)); // getting the error here
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    }
    return null;
}

Используемый алгоритм:

    private static final String TRANSFORMATION = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";

Я получаю следующую ошибку:

    javax.crypto.IllegalBlockSizeException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:513)
at javax.crypto.Cipher.doFinal(Cipher.java:1741)
at com.mayzusfs.android.moneypolo.app.utils.CryptoUtils.decode(CryptoUtils.java:82) // the line of the above method
at com.mayzusfs.android.moneypolo.app.FingerprintHandler.onAuthenticationSucceeded(FingerprintHandler.java:51)
at android.hardware.fingerprint.FingerprintManager$MyHandler.sendAuthenticatedSucceeded(FingerprintManager.java:975)
at android.hardware.fingerprint.FingerprintManager$MyHandler.handleMessage(FingerprintManager.java:896)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6501)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.security.KeyStoreException: Invalid input length
at android.security.KeyStore.getKeyStoreException(KeyStore.java:697)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)

Также я нашел интересную вещь,после шифрования длина байта [] равна 256, но после декодирования она становится 44:

public static String encode(String inputString) {
    try {
        inputString = Encryptor.toMd5Hash(inputString);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    try {
        if (prepare() && initCipher(Cipher.ENCRYPT_MODE)) {
            byte[] bytes = sCipher.doFinal(inputString.getBytes()); // length is 256
            return Base64.encodeToString(bytes, Base64.NO_WRAP);
        }
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    }
    return null;
}

Я новичок в шифровании, поэтому, пожалуйста, извините, если вопрос немного тупой.Я также пытался найти его в Google и столкнулся со следующими решениями, но они не помогли мне (возможно, я сделал что-то не так): javax.crypto.IllegalBlockSizeException: длина ввода должна быть кратна 16 при расшифровке с использованием зашифрованного шифра [duplicate]

javax.crypto.IllegalBlockSizeException

1 Ответ

0 голосов
/ 26 апреля 2018

Вы указываете, что не хотите переноса во время декодирования , поэтому, если строки переносятся, вы можете получить другой результат.Обычно, однако, строки переносятся после 76 символов, что дает 57, а не 44 байта данных.

Так что это означает, что - по какой-то причине - декодер base 64 остановился до концаСтрока была достигнута или что строка была неправильного размера в первую очередь.Это может быть, например, случай, если вы попытаетесь прочитать файл и ожидать, что методы read всегда будут возвращать полный размер файла.

Распечатайте строку base 64 после кодирования и перед декодированием, чтобыконечно.Ожидается выходной размер 256 байт, так как он равен размеру ключа в байтах (что означает, что вы использовали 2048-битный ключ RSA).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...