После прочтения вашего кода, я думаю, что нашел проблему, вы кодируете в Base64, но никогда не декодируете.В Encryption
вы делаете следующее
enctv.setText("[ENCRYPTED]:\n" +
Base64.encodeToString(encodedBytes, Base64.DEFAULT) + "\n");
, и я могу предположить, что пользователь копирует его в поле расшифровки, но после нажатия кнопки вы делаете
decodedBytes= c.doFinal(dec_edtext_view.getText().toString().getBytes());
вместо декодированияиз Base64.Я также хотел бы добавить несколько замечаний: вы не защищены, безопасность, вы едва достигли какого-либо уровня безопасности, когда ключи находятся на плоскости, как это.
Примечание 1:
Ключи должны генерироваться случайным образом с помощью SecureRandom .Вы можете легко сделать это, выполнив следующее:
byte[] key = new byte[16];
new SecureRandom().nextBytes(key);
Примечание 2:
Используйте вектор инициализации или IV , это полезно, если пользователь набралто же сообщениеНапример, рассмотрим следующий сценарий, в котором вы шифруете «Hello World», и он выглядит как «ABCDEFGHIJK».Теперь вы отправляете это снова, и это снова "ABCDEFGHIJK".С IV он будет отличаться каждый раз, пока вы генерируете новый IV для сообщения, вы должны добавить этот IV к сообщению, чтобы позже при расшифровке вы могли извлечь его.
Примечание 3:
При объявлении Cipher
используйте больше AES
.Есть отличная статья о том, как повысить вашу безопасность и знания: ссылка на статью
Примечание 4:
Если возникнет исключение, не продолжайте, как ничего не случилось,вы должны обрабатывать его правильно и не продолжать работу с кодом, который зависит от того, что вызвало исключение.
Примечание 5:
Более подробно изучите Java, вместо того, чтобы переходить к криптографии.private и некоторые final не объявляют null, если вы планируете использовать его позже, если вы проверяете, имеет ли оно значение null.Не объявляйте "UTF-8" в байтах получения, имейте константу, объявляющую Charset , такую как "UTF-8", это легко сделать с Charset.forName("UTF-8")