Перейти к публикации

HeroBrine1st

Пользователи
  • Публикации

    108
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    12

Все публикации пользователя HeroBrine1st

  1. HeroBrine1st

    RSA

    Шарил по форумам (в поисках эффективной организации поиска простых чисел), внезапно обнаружил: Так что моя реализация полностью оправдана, хоть и немного костыльна.
  2. В сотрудничестве с @Zer0Galaxy мы доработали целочисленную библиотеку metaint. Итак, встречайте: RSA Криптосистема с открытым ключом Теперь на "отечественной" библиотеке metaint Доработаны алгоритмы поиска простых чисел - засчет уменьшения скорости шанс прохождения составного числа как простого уменьшен (на самом деле я просто сделал 8 тестов ферма на число) Поддерживаются ключи с кастомным количеством бит А так же полная оптимизация генерации ключей. Осталось лишь оптимизировать поиск простых чисел и ключи в 2048 бит в ваших руках. Установка pastebin run 1xudmTa7 - выберите RSA и установите. С hpm проблемы( Использование Библиотека возвращает класс. Для получения инстанса - просто require("RSA")(<params>): RSA_instance Аргументом (он один) конструктора класса может быть: строка - путь к файлу собственной структуры. В нем обязательно должен быть публичный ключ. число (битовая длина ключа, не менее 16 - иначе будет недоступно шифрование текста. Да и не выйдет меньше 16) таблица. В ней нужно 2 поля - private_key и public_key, структура как у файла ключа библиотеки. Так же должен быть публичный ключ. Методы инстанса 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, если подпись верна. Работа с текстом. Очень медленно, битовая длина ключа - минимум 16 бит (StrToInt возвращает число в 32 бит, 16 бит*16 бит = 32 бит. Ограничение из-за использования остатка от деления). RSA:textEncrypt(text: string[,salt: string]):table[metaint] - шифрует текст поблочно, перемешивая блоки - защита от DPI. Блок равен 32 бита. Соль - строка, которая будет добавлена к тексту ради сокрытия первого блока текста (с ним не происходит ничего, он просто шифруется). RSA:textDecrypt(text: string[, saltLen: number]): string - расшифровывает текст с учетом длины соли, если она указана. Применяет обратное преобразование текста для расшифровки - защита от DPI, все дела. RSA:textSign(text:string): table[metaint] - поблочно подписывает текст, перемешивая блоки. RSA:textVerify(text:string, signedBlocks: table[metaint]): boolean - проверяет подпись текста. Работа с текстом проверялась на 32 битном ключе и юникоде (достаточно длинном). Ошибок алгоритма быть не должно. Более полная документация с описанием алгоритмов.
  3. HeroBrine1st

    RSA

    Похоже, да. Но я провел тестирование на слишком малых числах, возможно на больших числах появляются проблемы. В любом случае. такой алгоритм должен быть на широкую публику (я имею ввиду описание), ибо.. он очень простой. Но его нет, так что похоже он на больших числах не работает, либо через алгоритм Эвклида быстрее. Нужно тестирование и бенчмаркинг. Но, кажется, это не такая уж и задача. Для меня сейчас главное - оптимизировать поиск больших простых чисел, вот это действительно увеличит скорость. А возможно, просто на больших phi он очень долго возводит. Те же 64 бита - там числа порядка 10^30
  4. HeroBrine1st

    RSA

    Разобрался с алгоритмом Евклида. Генерация ключей происходит реально быстро, и с первого раза (цикл в коде - ну не знаю, можно и убрать). Основное время занимает генерация простых чисел, что неудивительно - с увеличением диапазона их количество в нем все падает и падает. Тест ферма берет некое число a в степень p-1 (p - проверяемое число), а вычисление степени, тем более на таких огромных числах - это невероятно сложное вычисление. Даже по модулю. Поиграюсь с тестами простоты, найду самый быстрый и выпущу еще одно обновление. А дальше - только избавляться от костылей вроде subNum - я решил не ждать Zer0Galaxy и не нагружать его работой, а накостылить целые числа на основе натуральных (и не переделывать алгоритм под натуральные - я не нашел даже описания алгоритма на натуральных числах), тем более, что нужно всего 3 операции - умножение, сложение и вычитание. Обновление уже на гитхабе, можно скачивать. Охх, знали бы вы, как у меня бомбило при поиске ошибки в алгоритме Евклида. А оно просто возвращало отрицательное число, и нужно было модуль прибавить к нему.
  5. HeroBrine1st

    RSA

    Хотел сегодня провести сногсшибательное обновление с полной оптимизацией всего и вся. Не вышло. Собственно, появилась оптимизация теста ферма, при первом непрохождении числа возвращает false. Это ускоряет тест для составных чисел (не всех) в 8 раз, но оставляет точность теста нетронутой. Так же после создания ключа он проверяется шифрованием какого-нибудь простого числа (оно само выбирается). Из нереализованного, но закомментированного: расширенный алгоритм евклида :C Прошу помочь с оптимизацией и фиксом уже его (xD), ибо например 64-битный ключ мне так и не удалось на нем сделать - постоянно отбраковывает ключ (с 8ю битами с раза 2-3 делает). Хотя ускоряет создание ключа реально сильно. https://github.com/HeroBrine1st/RSA/blob/master/RSA/RSAB.lua UPD: я почти разобрался с этим алгоритмом евклида и понял, что какого-то хрена алгоритм обрезает число до семи знаков)) Вот и вся проблема UPD2: Выход за пределы натуральных чисел - вычитание большего из меньшего. Передлываю алгоритм под натуральные числа.
  6. HeroBrine1st

    RSA

    Да) Я использовал твои наработки с сети фейстеля, когда там строка в 4 символа в число преобразовывалась.
  7. HeroBrine1st

    RSA

    Еще одно большое обновление. Добавлено то, что сказал выше + работа с текстом. С hpm одна большая проблема - пекейдж просто не добавляется. Опять же, требуется помощь с оптимизацией. Подробности мелким шрифтом в шапке внизу. (вкратце - нужно оптимизировать поиск экспонент).
  8. HeroBrine1st

    RSA

    Собственно, поддержка ООП. Когда Zer0Galaxy выложит metaint на npm,я это добавлю в npm и в шапку темы (просто не хочу у себя ее выкладывать, все же большую часть работы он сделал) https://github.com/HeroBrine1st/RSA/tree/master/RSA require("RSA") - все как обычно. RSA(filepath or bitlen) - импортирует или создает класс RSA. Методы класса - save - сохраняет, sign - подписывает число, verify(num:number, cryptedNumber: number) - проверяет подпись, encrypt - шифрует, decrypt - расшифровывает. Наличие публичного ключа в файле ключа обязательно. Для обратной совместимости - require("RSA/RSAB")
  9. HeroBrine1st

    RSA

    Я пока не готов это сделать. Я переведу эту библиотеку на ООП, тогда выложу на hpm. Предложенный выше алгоритм еще имеет кучу недостатков и не готов к полноценному использованию. Но это уже огромный шаг вперед - библиотека адекватно работает с огромными ключами)
  10. HeroBrine1st

    RSA

    Пришло большое обновление. В сотрудничестве с Zer0Galaxy (не буду тегать второй раз) мы доделали библиотеку metaint и RSA. Добавлена поддержка кастомной длины ключа.
  11. Система предоставляет графическую оболочку для планшетов, имеющую минималистичный интерфейс и понятное только мне использование, а так же минимальное (надеюсь) потребление ОЗУ. Из фич оболочка дает: Возможность использования OpenOS частично без использования команд. Для особых случаев - используем контекстное меню -> "Выполнить команду" Возможность посылки уведомлений пользователю. Многозадачность не реализована, так что пассивную часть программы нужно активировать библиотекой thread из OpenOS Запуск программ-папок (*.pkg). Чисто для разграничения кода и возможности создания модулей Адаптивная отрисовка интерфейса. На экранах с разрешением по ширине, не кратной 20, могут возникать проблемы, однако без искусственного изменения разрешения такого не произойдет. Помощь в настройке при первом запуске. На случай проблем - на первом экране используется колёсико мыши. Блокировка экрана Горячие клавиши на главном экране (клик+delete - удалить, ctrl+e+клик - редактировать и подобное) В планах: QR-коды для ссылок (свои причины) Специальный фреймворк аля Zygote из андроида. Естественно абсолютно весь функционал переписывать не буду, однако основной останется. Этот фреймворк повлечет за собой полный рефакторинг кода (перевод системы на него), но полностью устранит все недостатки TabletOSNetwork - что бы было. Протокол сам в себе будет держать защиту от MITM (Сначала на DSA, потом переведу на ECDSA (реально сложно для меня пока)) и некоторую маршрутизацию с помощью специальных реле (что бы у юзеров планшеты не лагали). Установка - pastebin run 1xudmTa7 Выберите в установщике TabletOS и канал обновлений "Stable". В дальнейшем система будет уведомлять о обновлениях, при получении оного нужно будет зайти в настройки (контекстное меню в левом нижнем углу экрана) и там обновиться. В случае, когда при обновлении бросает ошибку - посмотрите изменения, там будут инструкции по ручному обновлению или переустановке системы. Если и это невозможно. переустановите систему. Данные должны сохраниться, а вот система - обновиться. Зачем я ее сделал - не знаю сам. Но ей полтора года и я ее отрефакторил полгода назад. Не люблю бросать начатое, хотя вроде оболочка уже бесполезна. Сама идея появилась от проблемы медленного запуска программ на моем планшете. Я хотел сделать быстрый запуск включил-нажал, но я не нашел достойной системы, которая могла тогда установиться на планшет. Решил сделать сам.
  12. HeroBrine1st

    TabletOS

    В канале Experimental появились эти QR коды. Удалите файл /TabletOS/Settings.bin и переустановите систему с каналом Experimental, затем пройдите Setup Wizard и найдите в настройках уведомление "Добро пожаловать в графическую оболочку TabletOS" (это и есть те самые инструкции для юзера). Слова перед "кликабельно" вроде как кликаются. Вроде как, потому что не знаешь, как работать с этой луа, например у меня сегодня один и тот же код в разных функциях давал разный результат)) отличие было в цвете текста. Пока это в канале Experimental, могу послушать рекомендации по изменению вида этого QR-кода, ибо я не знаю. как убрать эту черную область (черный на зеленый не сменить - считыватель не видит тогда код) Использовал костыль от ECS (unicode.find из ECSAPI), либу qr кодов с гугла и braile bicycle с этого форума, модифицировав под даблбуфер. (Спасибо всем, что почти ничего не пришлось писать самому ) + свайпы таки могут появиться, я решил просто убрать анимацию, что позволит В РАЗЫ уменьшить количество кода. Что забыл сказать при обновлении вчера. Все необновившиеся до 1.0.6 потеряют доступ к обновлениям перед обновлением 1.0.7. Связано оно с тем, что в системе обновлений есть автоматическая подчистка файлов, которых уже нет в файллисте, а я как раз в 1.0.7 удаляю /lib/TabletOSGraphics.lua и переделываю ее в папку - будет несовместимость. Переустановить систему, к сожалению, не поможет :C Надеюсь с помощью installerScript исправить это
  13. HeroBrine1st

    TabletOS

    Если юзер хочет перейти по ссылке, но ему лень списывать, он на нее нажимает и сканирует QR-код, получает ссылку и переходит по ней. Ну у меня не исчерпывает, у меня вон на сервисе_нейм подписчиков штук 40 пришло без пиара за месяцев 3. Да и кодят для удовольствия вообще-то) Я щас доделываю саму концепцию оболочки (где-то в 2019м, мб раньше), выпущу 2.0 и начну клепать прожки Ээ, это может конечно доставить несовместимостей, но попробовать стоит. Тем более, что в оболочке весь ввод от одной функции зависит. UPD: не будет несовместимостей, я же при добавлении детектора малой памяти заодно все проги на перерисовку экрана раз в 0.5сек переписал
  14. HeroBrine1st

    TabletOS

    Еще одно обновление. Удалил из TODO свайпы - слишком сложно и бесполезно. Добавил в TODO QR-коды для ссылок - очень просто (нашел либу и научился ей пользоваться) и полезно - с сервиса_нейм ко мне в соцсеть_нейм и в мессенджер_нейм будут (надеюсь) быстрее перетекать юзеры и писать багрепорты, которые я сам не обнаруживаю. Фиксы: Ассоциации файлов не работали вообще Теперь "низкий уровень свободной памяти" - 64 килобайта. При меньших значениях возникали проблемы. Всплывающие окна теперь располагаются правильно. Добавлено: Подсказки пользователю о некоторых аспектах работы с системой (решил перевести все на нормальный фреймворк вместо однотипных кусков кода по всей оболочке). Кнопка "Продолжить" у поля ввода. Кнопка удаления уведомления, а так же при клике по самому уведомлению оно откроется полностью. У файлов в "Все программы" появилось контекстное меню. Изменения: Полный рефакторинг системы обновлений. Внимание: вам придет два обновления. Одно обновление обновит оболочку, а второе - инициализирует систему обновлений.
  15. package.preload - таблица с функциями, возвращающими библиотеку. Используется самой опеносью, что бы закинуть туда библиотек в незагруженном формате и загрузить одну из них - тогда все зависимости загрузятся сами и не надо будет танцевать с бубном. Если изменить на loaded, надо еще заменить все после "=" на просто api.
  16. Установка pastebin get c1v8T9CK /lib/Telegram.lua; pastebin get 4Lh9ALEY /lib/Promise.lua;pastebin get ji28sbxU /lib/JSON.lua Создание бота Здесь все подробно обьясняют: https://tlgrm.ru/docs/bots#botfather. Документация Эта библиотека возвращает одну-единственную функцию - Telegram (в либе названа Bot, но будет телеграмом) Telegram(token: string) - создает обьект бота. Использует псевдо-ООП. Bot.API - таблица с единственным полем rawRequest(method: string, options: table): table - сырой запрос без оболочек. Имеет метатаблицу. Bot.API[method](options) - возвращает промис. Promise:next(onFulfilled:function) - установить функцию, принимающая значение result при успешном выполнении промиса. Promise:catch(onRejected:function) - установить функцию, принимающая значение error при ошибке промиса. Promise:await() - ждет завершения промиса и возвращает результат с учетом всех его обработчиков. Bot.longpoll on(event: string,callback: function) - установить обработчик ивента. Весь список - message, edited_message, channel_post, edited_channel_post, inline_query, chosen_inline_result, callback_query, shipping_query, pre_checkout_query start() - запустить лонгполл. Программа блокируется. stop() - остановить. Возможно, библиотека будет не очень хорошо работать, но я тупо не могу ее адекватно протестировать - вебпрокси (закомментированная 7я строка) перестал работать (только для меня xD) P.s. если у вас тоже выбивает ошибку на 30й строке - напишите. component.internet.request тупо льет nil вместо ошибки, я пока полагаю, что это связано с блокировками.
  17. HeroBrine1st

    Telegram Interface

    Неплохо бы найти способ так же делать в либе
  18. HeroBrine1st

    Telegram Interface

    Обновил библиотеку. Появился longpoll и запросы к API теперь асинхронные. Однако вылетает ошибка, скорее всего из-за блокировок (тем не менее, телеграм без прокси у меня работает прекрасно). Если у вас даже с впн выпадает ошибка - напишите. + появилась поддержка веб-прокси, надо раскомментировать 7ю строку и вставить url, + переписать функцию encode (ради одной функции тащить web.lua от ECS не очень хотелось), если сайт использует другой вариант кодирования URL.
  19. HeroBrine1st

    Lua Promise

    Для создания асихнронных библиотек по типу vk-fast-longpoll у nodejs. pastebin get 4Lh9ALEY /lib/Promise.lua Методы библиотеки: all(iterable: table) - создает промис, который ждет завершения всех переданных промисов (в виде таблицы) и в resolve шлет таблицу со всеми их значениями. Если хоть один завершится с ошибкой, вызовет reject с этой ошибкой race(iterable: table) - создает промис, который ждет первого завершения любого промиса, и проксифицирует его результат на себя (т.е. ошибку или результат перекидывает через себя, не обрабатывая) resolve(value:any) - создает промис, который успешно завершился с параметром value reject(value:any) - создает промис, который завершился с ошибкой value Магия ООП начинается с магии метатаблиц - вызывайте библиотеку как функцию. Просто Promise(...). Аргумент один - функция, принимающая 2 аргумента - resolve и reject. Если промис завершает работу успешно, он вызывает функцию resolve с одним (!) аргументом, а та передает его обработчикам. Если с ошибкой - вызывает reject, либо он вызывается автоматически при синхронной ошибке (attempt to call a nil value, error(...) и все подобное). Возвращает класс. У него 3 метода: next(onResolve:function,onReject:function): self: object (__name=Promise) - аналог then в NodeJS. catch(onReject): self: object (__name=Promise) - думаю понятно. await - ждет завершения промиса и возвращает его результат. Поддерживается чейнинг, но паралельные обработчики не добавить, и я не знаю, как это исправить :C Если во время чейнинга из обработчика вернуть промис, библиотека будет ждать его завершения и передаст результат в следующий обработчик. Если на уже выполненный промис навесить обработчик, он выполнится синхронно. На выполняющийся - асинхронно после завершения. Обьяснил возможно непонятно, обьяснение на learn.javascript.ru. Примеры кода: local Promise = require("Promise") local p = Promise(function(resolve,reject) print(123) os.sleep(5) print(234) resolve(5) end) --123 p:next(function(result) print(result) return 8 end) os.sleep(5) --234 --5 print(p.result) --8 a=Promise(function(a,b) os.sleep(5) a(1) end) b=Promise(function(a,b) os.sleep(1) a(2) end) c = Promise.all({a,b}) c:onResolve(function(values) print(serialization.serialize(values)) end) d = Promise.race({a,b}) d:onResolve(function(values) print(values) end) os.sleep(10) --2 --{2,1} Чистый исходный код на MoonScript Если туда не засовывать os.sleep, то промис заблокирует остальные потоки, как и если в основную программу не вставить os.sleep, она заблокирует промис. Учтите.
  20. HeroBrine1st

    Lua Promise

    Сделал промисы наиболее похожими на настоящие. Нет только методов resolve и reject у самой либы (по-моему, особо не нужно). UPD: уже есть + даже если на уже выполненный промис добавить обработчик, он выполнится, если соблюдены его условия. Надеюсь, без дубликатов других промисов и нареканий.
  21. HeroBrine1st

    Lua Promise

    Чейнинг тут есть. Тут другая сторона медали - нельзя на один промис навешать 2 обработчика, только последовательно, друг за дружкой.
  22. HeroBrine1st

    Lua Promise

    thread.waitForAny({promise.thread}) local result = table.unpack(promise.result) Я уже начал юзать эту либу (в который раз убеждаюсь, что ничего по приколу делать не могу) и дорабатываю ее, так что возможно эти 2 строки кода появятся в либке)
  23. HeroBrine1st

    TabletOS

    Обновление завез. Фиксы: Пимпочка скроллбара неправильно отображалась (окно с прокруткой сразу после отрисовки отображало пимпочку, несоотвествующую реальным размерам показанного контента) Юникод в поле ввода теперь поддерживается полноценно Папка рабочего стола изменена в связи с грамматической ошибкой (Desctop -> Desktop) Добавлено: Горячие клавиши. Клик + delete - файл удаляется, клик + ctrl + e - редактирование, клик+ctrl+e+delete - перезапись файла. Иконка батарейки в статусбаре - . (К сожалению, пока является статичным элементом) Техническое: файл настроек автоматически обновляется Изменено: Техническое: очистка кода в SetupWizard Техническое: частичный рефакторинг TabletOSGraphics. P.s. стараюсь выпускать обновления в первую субботу каждого месяца. До этого все изменения накапливаются в канале Experimental. В инсталлере этот канал есть, можете смотреть). Но там обычно немного нестабильно.
  24. string.find возвращает 2 величины - начало искомой подстроки и конец. Т.е. ты можешь получить начало слова и его конец, а затем обрезать с помощью unicode.sub(строка_для_обрезки,начало,конец). string.sub лучше для строк с юникодом не использовать. Пример кода - https://ideone.com/tEZHqh Что делает код выше со строкой str: 1.Ищет в строке подстроку "badWord" и получает положение ее начала и конца с помощью string.find(строка_в_которой_ищем,строка_которую_ищем) 2. Обрезает строку до первой буквы слова с помощью string.sub(строка_для_обрезки,начало,конец) 3. Обрезает строку от последней буквы слова с помощью string.sub(строка_для_обрезки,начало) (конец можно опустить - тогда он станет равен -1, т.е. до самого конца строки) 4. Конкатекует две строки, получая строку без слова badWord В данном случае надо будет делать это в цикле, пока string.find не вернет nil, и переходить к следующему "запрещенному" слову. P.s. возможно много информации. Отвечаю кратко - тебе нужен string.sub (s, i [, j]), где s - строка для обрезки, i - начало, j - конец. UPD: Не подумав написал. Можно использовать string.gsub(строка_из_которой_удалить,слово_которое_удалить,на_что_заменить), хотя при некоторой доработке можно с помощью алгоритма выше сделать складывание "запрещенных" слов в отдельную строку/таблицу, чего gsub не позволяет.
  25. HeroBrine1st

    TabletOS

    Точняк, ступил) спасибо
×