Мое приложение может скрывать текст, указанный в предоставленном изображении, и пользователь этого изображения может свободно отправлять его кому угодно. С помощью этого приложения можно расшифровать одно и то же изображение и извлечь из него данные/текст. Может использоваться как в целях развлечения, так и в целях безопасности.
Как работает
Шифрование
Входные данные: код из 16 цифр, текст (который должен быть скрыт), изображение (в котором текст должен быть скрыт).
Текст преобразуется в bytearray и передается в шифрование AES с использованием библиотеки шифрования Android.
Зашифрованный текст в форме bytearray, преобразуется в кодировку Base64.
Каждый символ строки base64 преобразуется в двоичное значение и объединяется в виде строки с завершающей строкой с обеих сторон.
Двоичная строка затем вставляется в изображение с помощью метода LSB.
Изображение появляется у вас на устройстве.
Дешифрование
Входные данные - код из 16 цифр (тот же, что использовался для шифрования),изображение (в котором скрыты данные).
Двоичные данные, извлекаются из пикселей изображения, просто изменив процесс метода LSB.
Двоичная строка преобразуется обратно в строку base64 и строка base64 снова декодируется в bytearray.
Bytearray передается в алгоритм AES, и с помощью ключа данные расшифровываются.
Окончательный расшифрованный bytearray преобразуется в текст (utf-8) и отображается на экране.



Примеры кода
1. Шифрование данных и сокрытие их в изображении
encbtn!!.setOnClickListener() { if(keytxt!!.text.toString().length==16) { if(data_to_hide!!.text.toString().length>0) { if (btm != null) { Thread{ runOnUiThread{dialog.show()} //encrypting data using AES encryption val s: String = encrypting_data() //hiding data in image and getting modified img val bitmap:Bitmap=data_hiding_in_img(s, btm!!) //reseting the encrypted binary string for next time use b_string="" //saving stego image to gallary saveMediaToStorage(bitmap) runOnUiThread{dialog.dismiss()} }.start() } else{Toast.makeText(this, "ADD A IMAGE FIRST", Toast.LENGTH_SHORT).show() } } else{ Toast.makeText(this, "Text to hide is empty", Toast.LENGTH_SHORT).show() } } else{ val k=keytxt!!.text.toString().length Toast.makeText(this, "Key must be of 16 digits not $k ", Toast.LENGTH_SHORT).show() } }
2. Конвертирование закодированной строки в base64 и размещение двоичной строки в изображение
val re_base64 = Base64.encodeToString(re, Base64.NO_WRAP or Base64.NO_PADDING) Log.e("aaAA", re_base64.toString()) //converting each chr of base64 string to binary and combining it for(i in re_base64){ var single_b_string=Integer.toBinaryString((i.toInt())) //if binary str is less than 8 bit then making it 8 bit by adding 0's if(single_b_string.length<8){ for(j in 1..(8-single_b_string.length)){ single_b_string="0"+single_b_string } } //binary string to hide in image b_string= b_string+ single_b_string } Log.e("barraylength", b_string.toString()) Log.e("barray", b_string!!.length.toString()) return b_string.toString()
Это приложение я сделал для участия в конкурсе open source проектов.
Если чем то заинтересовало приложение , поддержите меня оценкой на github. Также более подробно ознакомиться с моим проектом и посмотреть демо можно по ссылке ниже.
