RSA шифрование .bmp файлов - lanit-tercom-school/grouplock GitHub Wiki
###Генерируем ключи
- Возьмем два больших простых числа p and q
- Определим n, как результат умножения p on q (n= p*q)
- Выберем случайное число, которое назовем d. Это число должно быть взаимно простым (не иметь ни одного общего делителя, кроме 1) с результатом умножения (p-1)*(q-1)
- Определим такое число е, для которого является истинным следующее соотношение (e * d) mod ((p-1) * (q-1))=1
- Назовем открытым ключом числа e и n, а секретным - d и n
###Шифрование с помощью открытого ключа {e,n}
-
Разбить шифруемую картинку на блоки, каждый из которых может быть представлен в виде числа M(i)=0,1,2..., n-1( т.е. только до n-1)
-
Числа в блоках и есть значения R G B. У нас ключ 512 бит минимум, а это 64 байта поэтому шифруем блоками по 16 пикселей (смотри структура .bmp файла)
-
В связи с этим у нас остается хвост из максимум 15 пикселей, если количество пикселей не кратно 16
-
Можно не шифровать хвост
-
Можно шифровать и изменять заголовок(т.к. размер файла увеличится на <=63байта)
-
Можно шифровать и НЕ изменять заголовок(по идее просто не будут выводится лишние пиксели, но расшифровка должна проходить корректно, Но тут несоответствие фактического размера и указанного, это вообще не ок)
-
Зашифровать картинку, рассматриваемую как последовательность чисел M(i) по формуле C(i)=(M(i)^e)mod n.
Здесь мы берем остаток по модулю n, причем n длинной 64 байта, а значит и остаток будет такой же длинны или меньше, но с дополнительными нулями. Размер ДОЛЖЕН оставаться тем же. Возможно, из-за свойств некоторых библиотек он увеличивается, если написать самим, все должно быть оk.
- Записать вместо старых блоков M(i) новые C(i)
Дешифрование с помощью секретного ключа {d,n}
- Вводим
- Секретный ключ {d,n}
- Предполагаемо зашифрованный с помощью открытого ключа {e,n} .bmp файл
- Расшифровать картинку рассматриваемую как последовательность блоков C(i) по формуле M(i) = (C(i)^d) mod n
- Записать на место старых блоков C(i) новые M(i)
libsodium
БиблиотекаНам пригодится раздел Public-key cryptography