В сотрудничестве с @Zer0Galaxy мы доработали целочисленную библиотеку metaint.
Итак, встречайте:
RSA
Криптосистема с открытым ключом
Теперь на "отечественной" библиотеке metaint
Для поиска простых чисел используется Тест Миллера — Рабина
Поддерживаются ключи с кастомным количеством бит
А так же полная оптимизация генерации ключей. Осталось лишь оптимизировать поиск простых чисел и ключи в 2048 бит в ваших руках.
Установка
pastebin run 1xudmTa7 - выберите RSA и установите.
С hpm проблемы(
Использование
Библиотека возвращает класс. Для получения инстанса - просто require("RSA")(<params>): RSA_instance
Аргументом (он один) конструктора класса может быть:
строка - путь к файлу собственной структуры. В нем обязательно должен быть публичный ключ.
число (битовая длина ключа, не менее 16 - иначе будет недоступно шифрование текста. Да и не выйдет меньше 16)
таблица. В ней нужно 3 поля - private_key, public_key и metadata, структура как у файла ключа библиотеки. Так же должен быть публичный ключ. Приватный ключ и метадата необязательны - они хранятся у создателя ключа.
Методы инстанса RSA
RSA:save(filepath: string) - сохранить ключ в файл
RSA:encrypt(number:number) - зашифровать число
RSA:decrypt(cryptedNum: number) - расшифровать число. Кинет ошибку, если нет приватного ключа.
RSA:sign(number: number) - подписать число. Кинет ошибку, если нет приватного ключа.
RSA:verify(number:number, signedNumber: number): boolean - проверить подпись. Вернет true, если подпись верна.
Работа с текстом. Очень медленно, битовая длина ключа - минимум 32 бит.
RSA:textEncrypt(text: string[,saltLen=4: number]):table[metaint] - шифрует текст поблочно, перемешивая блоки - защита от DPI. Блок равен 32 бит.
RSA:textDecrypt(cryptedText: table[, saltLen=4: number]): string - расшифровывает текст с учетом соли. Применяет обратное преобразование текста для расшифровки - защита от DPI, все дела.
RSA:textSign(text:string): table[metaint] - поблочно подписывает текст, перемешивая блоки.
RSA:textVerify(text:string, signedBlocks: table[metaint]): boolean, string - проверяет подпись текста. Второе значение - полученная строка.
Более полная документация с описанием алгоритмов.
Готовится оптимизация библиотеки, прогресс можно посмотреть в ветке beta репозитория. Спойлер: стоит на месте, ищу способ выполнения длинных битовых операций