Способ обезопасить использование приложения - lanit-tercom-school/grouplock GitHub Wiki

Спустя какое-то продолжительное время активного использования приложения шифрования, у пользователя может накопиться немалое число зашифрованных изображений, а также огромное количество QR-кодов, которые, вероятнее всего, будут храниться и в галерее смартфона, и на сторонних носителях, включая распечатанный вид.

Таким образом, возможна следующая неприятная ситуация:

Настал день X, и люди собрались расшифровать изображение, но среди их числа нашёлся минимум один, который облажался с хранением своего QR-кода и не знает, какой QR-код у него в галерее является требуемым, или он случайно предоставил для считывания не тот. Если код будет абсолютно другого формата (например, в нем будет зашифрована ссылка на сайт и т.п.), то без проблем можно это выявить, сообщить пользователю об ошибке и предоставить ему возможность использовать другой QR-код. А вот что делать, если код верного формата, но является ключом к другой картинке? Тогда у нас приложение выдаст неверно расшифрованное изображение, либо программа вообще аварийно завершится.

То есть появляется необходимость проверки того, является ли данный код ключом к расшифровке данной картинки.

Получается, надо поместить некий идентификационный номер и в QR-код, и в зашифрованное изображение.

Как поместить этот номер в QR-код - вопросов, естественно, не возникает, просто зашифровываем его там вместе с "секретом", разделив их, допустим, знаком "_". Но вот как зашифровать идентификационный номер в изображении?

Вариант, в котором он записывается в названии файла, считаю неудачным, потому что файл легко переименовать. Наиболее выгодным в данной ситуации считаю воспользоваться стеганографией и разместить нужную нам информацию в самом изображении (то, как это делается, можно прочитать здесь). Считаю, что лучше всего будет отвести 4 бита компоненты цвета под текст, чтобы и в глаза не бросалась данная часть картинки, и можно было разместить значительное количество информации в меньшем количестве пикселей. Таким образом, в 2 пикселях, мы сможем зашифровать 3 символа.

Посмотрев примеры в статье, указанной выше, можно заметить, что при заимствовании последних бит компонент цветов, получаемый результат вполне приемлем. Но данные об изображении нам требуется поместить в уже зашифрованную картинку, и вот тут может появиться проблема из-за того, что при изменении 12 битов, мы можем обратно не получить даже похожий цвет. В итоге, у нас будет восстановленное изображение явно испорченное местами. В данном случае, выходом из сложившейся ситуации могут стать еще один или несколько рядов пикселей, которые будут добавлены в самое начало, и при этом являющихся копиями последующих рядов. Вот как раз в них и можно помещать необходимую нам информацию.

Теперь, собственно, какую информацию стоит туда помещать.

GrLo_DeviceID_ImgID

"GrLo"- будет показывать, что файл является зашифрованным.

"DeviceID"- 16-значный идентификационный номер устройства, на котором производилось шифрование файла

"ImgID" - 5-значный порядковый номер зашифрованного файла на данном устройстве (00000,00001, и т.д.).

То есть всего будет 27 символов, которые можно зашифровать в 18 пикселях. И этот код будет однозначно определять наше зашифрованное изображение, правда, не совсем надежно правило выбора последних 5-ти знаков, т.к. при удалении и повторной установке приложения, счётчик обнулится и будут получаться изображения с повторными номерами. Тут, естественно, можно придумать нечто понадёжнее)


Запись QR-кода будем аналогичной, но с добавлением порядкового номера кода, т.е.:

GrLo_DeviceID_ImgID_QrID_Secret, где

"QrID" - 2-значный порядковый номер (00,01 и т.д.)

"Secret" - сам секрет, необходимый к дешифровке.


Таким образом, пользователям будет намного проще при возникновении, описанных в начале статьи, проблем. К тому же, записывая в зашифрованное изображение дополнительную информацию, получим 2 преимущества:

  1. Нам не надо будет, при добавлении файлов в папки Encrypt и Decrypt, указывать куда именно их помещать, приложение само сможет это определять.

  2. Будет возможность несколько раз шифровать один и тот же файл, и при этом не понадобится запоминать это количество раз или перетаскивать его в папку "Encrypted" обратно, после процесса дешифровки оно будет помещено обратно.

Но тут возникает вопрос, как тогда будет выглядеть процесс повторного шифрования уже зашифрованного файла, если он уже находится в папке "Encrypted". Но это скорее головная боль дизайнерам приложения, в плане реализации - всё тривиально.