После попытки сохранить пароль в 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