Мое приложение может скрывать текст, указанный в предоставленном изображении, и пользователь этого изображения может свободно отправлять его кому угодно. С помощью этого приложения можно расшифровать одно и то же изображение и извлечь из него данные/текст. Может использоваться как в целях развлечения, так и в целях безопасности.
Как работает
Шифрование
Входные данные: код из 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. Также более подробно ознакомиться с моим проектом и посмотреть демо можно по ссылке ниже.
Комментарии (3)
splix
05.04.2022 00:48+1Посмотрел
private fun encrypting_data():String
. Не надо так делать.Во-первых, вы используете дефолтные настройки AES а для JVM это
AES/ECB/NoPadding
, что вообще не подходит для чего угодно серьезного. С ECB можно шифровать только в пределах длинны ключа, т.е. приемлемая длинна текста для шифрования это 128 или 256 бит. В зависимости от того какой длинны AES у вас, а вы его тоже не указалиВо-вторых, ключ тоже используете без каких либо настроек. Значит размерность AES у вас возьмется из длинны ключа, и конкретно пароля. И на 256 бит видимо рассчитывать не придется, потому что не будет пользователь вводить пароль из 32 символов.
И в-третих. Не надо напрямую пароль пихать в шифрование. Особенно в данном случае, когда все по умолчанию и без безопасных настроек. Для пароля есть различные KDF, используйте хотя бы стандартный PBKDF2
Mishima_Zaibatsu
05.04.2022 02:23+2Нет. Пожалуйста, нет. Не надо. Никаких easy encryption. Есть куча более безобидных способов потренироваться писать программы. Для шифрования и безопасности следует использовать системный подход, с фундаментальными знаниями.
Здесь в статье следует добавить кучу дисклеймеров, что это демонстрационный проект, что этим приложением нельзя пользоваться по прямому назначению, но вместо этого автор указывает
Может использоваться [...] в целях безопасности.
Опасное заблуждение. И статьи подобного рода делают беспечную иллюзию, что можно взять и написать "на коленке" приложение для шифрования, а потом такие подобные поделки могут быть выданы за реальный продукт на маркетплейсах.
Я не хочу обидеть автора, но хочу обратить его внимание на повышенную ответственность в такой специфичной теме, как информационная безопасность. Например, химики не предлагают в качестве готового лекарства синтезированную "на коленке" субстанцию.
Отдельное спасибо комментатору выше за технический разбор.
P.S. Когда-то давно в школе я написал простенькое приложение-дневник с паролем, показал другу, ему понравилось, и он начал им пользоваться. В результате все его секреты стали достоянием третьего человека, который нехитрыми действиями смог напрямую открыть файл с записями. Мне до сих пор стыдно за свой тогдашний беспечный подход.
nikita_dol
Называется это стеганография и отправлять картинки нужно без сжатия