RSA шифрование .bmp файлов - lanit-tercom-school/grouplock GitHub Wiki

###Генерируем ключи

  1. Возьмем два больших простых числа p and q
  2. Определим n, как результат умножения p on q (n= p*q)
  3. Выберем случайное число, которое назовем d. Это число должно быть взаимно простым (не иметь ни одного общего делителя, кроме 1) с результатом умножения (p-1)*(q-1)
  4. Определим такое число е, для которого является истинным следующее соотношение (e * d) mod ((p-1) * (q-1))=1
  5. Назовем открытым ключом числа e и n, а секретным - d и n

###Шифрование с помощью открытого ключа {e,n}

  1. Разбить шифруемую картинку на блоки, каждый из которых может быть представлен в виде числа M(i)=0,1,2..., n-1( т.е. только до n-1)

  2. Числа в блоках и есть значения R G B. У нас ключ 512 бит минимум, а это 64 байта поэтому шифруем блоками по 16 пикселей (смотри структура .bmp файла)

  3. В связи с этим у нас остается хвост из максимум 15 пикселей, если количество пикселей не кратно 16

  4. Можно не шифровать хвост

  5. Можно шифровать и изменять заголовок(т.к. размер файла увеличится на <=63байта)

  6. Можно шифровать и НЕ изменять заголовок(по идее просто не будут выводится лишние пиксели, но расшифровка должна проходить корректно, Но тут несоответствие фактического размера и указанного, это вообще не ок)

  7. Зашифровать картинку, рассматриваемую как последовательность чисел M(i) по формуле C(i)=(M(i)^e)mod n.

Здесь мы берем остаток по модулю n, причем n длинной 64 байта, а значит и остаток будет такой же длинны или меньше, но с дополнительными нулями. Размер ДОЛЖЕН оставаться тем же. Возможно, из-за свойств некоторых библиотек он увеличивается, если написать самим, все должно быть оk.

  1. Записать вместо старых блоков M(i) новые C(i)

Дешифрование с помощью секретного ключа {d,n}

  1. Вводим
  • Секретный ключ {d,n}
  • Предполагаемо зашифрованный с помощью открытого ключа {e,n} .bmp файл
  1. Расшифровать картинку рассматриваемую как последовательность блоков C(i) по формуле M(i) = (C(i)^d) mod n
  2. Записать на место старых блоков C(i) новые M(i)

Библиотека libsodium

Нам пригодится раздел Public-key cryptography