Ошибка в этой строке:
plainText.setText(new String(cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));
Если мы разобьем его на части, у нас будет что-то вроде
byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));
plainText.setText(new String(cipherBytes, StandardCharsets.UTF_8);
Проблема в том, что cipherBytes
- это последовательность произвольных байтов, а не символов строки. Конструктор String будет молча заменять недопустимые символы чем-то другим, процесс, который портит данные.
Если вы хотите отобразить байты шифра или иным образом отправить его в символьно-ориентированный канал, вы должны кодировать его. Обычно кодировки являются base64 или hex. Чтобы расшифровать строку, вы должны сначала декодировать ее в байты, а затем расшифровать.
Пример:
byte [] cipherBytes = cipher.doFinal(plainText.getText().toString().getBytes(StandardCharsets.UTF_8));
plainText.setText(Base64.encodeToString(cipherBytes, Base64.DEFAULT));
А при расшифровке:
byte[] cipherBytes = Base64.decode(plainText.getText().toString(), Base64.DEFAULT);
byte[] decrypted = cipher.doFinal(cipherBytes);