rsass
Утилита для шифрования файлов
Установка
Чтобы установить данную утилиту на ОС Linux, необходимо скачать скрипт установки и запустить его или клонировать репозиторий локально и собрать из исходников: wget -vS https://github.com/SashaShrek/rsass/blob/master/Install.sh
, для Windows необходимо скачать архив.
Использование
Данная утилита является консольной. То есть, чтобы её использовать, необходимо открыть терминал (в Линукс) или cmd (в Windows) и перейти в директорию, где лежит бинарник программы. Утилита имеет 3 флага, комбинируя которые можно создать ключи, зашифровать/расшифровать любые файлы.
- Создать ключи:
rsass -ak=23,73
- два простых числа; ak - add keys. После данной команды в директории, где лежит бинарник, будут созданы файлы с открытым и закрытым ключами. Советую не удалять их, потому что утилита будет брать ключи именно из этих файлов. - Зашифровать файл:
rsass -crypto=/path/to/file
- данная команда создаст файл по названию идентичный изначальному, только в конце будет .cry. - Расшифровать файл:
rsass -uncry=/path/to/file.cry
.
Возможные проблемы
- При шифровании выбирай адекватных размеров файл
- Не рекомендуется шифровать бинарники
Математика
Для создания зашифрованного сообщения необходимо действовать по алгоритму: c = m^e mod n
, где:
- c - зашифрованное сообщение
- m - первоначальное сообщение
- e - открытая экспонента
- n - произведение двух простых чисел a и b
Чтобы найти e, необходимо использовать неравенство: 1 < e < Fi(n)
, где Fi(n) - функция Леонардо Эйлера, Fi(n) = (a - 1) * (b - 1) | n = a * b
. В коде это:
func getE(fi int) int {
var index int
count := fi
for index = 2; index < count; index++ {
if (index%1 == 0) && (fi%1 == 0) && (fi%index != 0) {
break
}
}
return index
}
Для создания закрытого ключа, необходимо использовать тождество: d * e = 1 (mod Fi(n)) => d = 1 (mod Fi(n)) / e => d = (1 + k * Fi(n)) / e
, где k будем искать перебором с условием, что e != d
, а (d * e) mod Fi(n) = 1
, d - секретная экспонента. Код:
func getD(e int, fi int) int {
var d int
var k int
for k = 2; k < fi; k++ {
d = (1 + fi*k) / e
if d != e && ((e*d)%fi == 1) {
break
}
}
return d
}
Чтобы расшифровать сообщение, необходимо использовать следующее равенство: m = c^d mod n
.