HeroBrine1st
Пользователи-
Публикации
134 -
Зарегистрирован
-
Посещение
-
Победитель дней
21
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя HeroBrine1st
-
Попытался решетом Эратосфена. Получил ошибку заполнения ОЗУ для n = 10 000 000.
- 72 ответа
-
- цифровая подпись
- шифрование
- (и ещё 1 )
-
Оптимизировал алгоритм. Работает моментально, кодирует большие числа без намека на провисание. Избавился от метачисел, теперь библиотека работает на чистом Lua. Дополнил таблицу простых чисел.
- 72 ответа
-
- 1
-
-
- цифровая подпись
- шифрование
- (и ещё 1 )
-
В сотрудничестве с @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 репозитория. Спойлер: стоит на месте, ищу способ выполнения длинных битовых операций
- 72 ответа
-
- 9
-
-
-
-
- цифровая подпись
- шифрование
- (и ещё 1 )
-
(При редактировании не могу сбросить строку, поэтому пишу новым сообщением) Так же без фикса выше этот слушатель работать не будет. listeners[1] = {"key_down",function (_,_,k1,k2) if keyboard.isControlDown() and keyboard.isKeyDown(46) then info("info","interrupted server.") running = false end end}
-
Дошло не сразу, долго искал причину nil в аргументах function main() while running do local e = {event.pull()} for i=1,#listeners do Зачем паковать ивент в таблицу и подавать его таким? local ok,err = pcall(listeners[i][2],e) Предлагаю исправленный вариант: local ok,err = pcall(listeners[i][2],table.unpack(e))
-
Давным-давно Zer0Galaxy выложил эту программу в теме, которая будет ниже (т.е. в конце страницы): Я же ее перенес и преобразовал в библиотеку: Методы те же - getkey(key:string), crypt(str:string,key:table), decrypt(cryptedStr:string,key:table), а так же md5(str:string) - возвращает хеш определенной строки. Если будут ошибки, отпишите. Я тестировал, все работает, однако могут быть ошибки или даже несоответствие алгоритму (что крайне маловероятно, но возможно - я заменил какую-то функцию, похожую на rshift из bit32 на этот самый rshift) Сама тема - http://computercraft.ru/topic/96-razmyshleniia-o-shifrovanii-i-bezopasnoi-peredach/ Команда для установки - pastebin get uDnh4RLi /lib/crypt.lua
- 3 ответа
-
- 1
-
-
Можно сделать биржу с неавтоматической установкой цен, но и не с фиксированной. Предлагаю сделать так: игрок-покупатель делает ордер на покупку. Если нету предметов с такой ценой в продаже, можно установить время, за которое какой-нибудь игрок-продавец даст ордер на сумму, равную или ниже стоимости в ордере, то предмет в n-количестве покупки блокируется и становится доступен только тому, кто его купил. Игрок-покупатель приходит в пункт торговли и забирает. Да, сложно, однако такой рынок будет зависеть от мысли не нескольких игроков-богачей, а от обстоятельств на сервере. При этом если опять же игроки будут скупать все, цена так же будет взлетать, однако уже по воле игроков и без алгоритмов. Ну и поставить бота, который будет просто вешать ордера на покупку, используя среднюю цену на рынке*произвольный коэффициент больше 0.5, дабы игроки могли получать внутриигровую валюту без других богачей. Вот и решена проблема с ценами и алгоритмами.
-
Согласно документации, если я вызову метод getUpdates с параметром offset, все обновления, меньшие или равные этому ID будут засчитаны как обработанные. То есть API сервер сам сохраняет то, что я обработал обновление. Со стороны бота ничего сохранять в файл не нужно. Однако есть одно но: при команде типа /reboot и последующей перезагрузке бот может зациклить перезагрузку. Решение - перед выключением или перезагрузкой надо еще раз получить обновления. И да, лимит обновлений - 100 единиц. При получении нового обновления самое первое удаляется (если выходит за лимит). Если обновлению уже исполнился 1 день, оно автоматически удаляется.
-
API сервер никогда не отключается. В одиночной игре использование данной библиотеки бессмысленно, а сервера без интернета не остаются.
-
Дописал документацию.
-
Сделал документацию по некоторым функциям. https://github.com/HeroBrine1st/Module-Kernel/wiki
-
Из-за того, что мне приходится для каждого нового компонента писать код, драйвера позволяют вместе с программой устанавливать пакеты этих самых драйверов, позволяющих этой и остальным программам использовать новый компонент. + Я не собираюсь давать свободный доступ к библиотеке component.
-
Теперь более подробно о ключе суперпользователя, о котором я умалчивал. (В init.lua переменная называется superuserkey, ес че) Он требуется для некоторых операций, опасных для системы. Тот же SCI.io.filesystem имеет 2 основных функции - getFileObject и list. Обе обращаются к разрешениям, в которых прописано, что может пользователь, а что суперпользователь. По умолчанию оба могут все, однако можно с помощью setPermission можно ограничить доступ даже суперпользователю (однако что бы изменить разрешения, нужен тот самый ключик). Ключик этот размером в 128 символов, что бы его невозможно было пробрутить. Уязвимости возможно есть, я пока не искал. Но самую большую уязвимость (getFileObject) я прикрыл с помощью псевдо-ООП (если я сделаю метатаблицу, то в итоге object.permissions можно будет подменить. очевидная уязвимость, о которой многие, не посмотрев кода, могут догадываться). Это основная причина отсутствия ООП в этой функции. Второстепенная - я банально не знал, что надо хранить метатаблицу в локальном окружении библиотеки, а подключать уже в функции. В планах сделать файл hosts и его обработку.
-
Сделал систему драйверов. Теперь все, что находится в drivers, загружается и что они возвратят, добавляется в SCI.device[имяфайла]. Появилась новая функция - SCI.device.installDriver(path: string, name: string, SUkeyOrRequest:boolean or string): boolean or nil, string Как нетрудно догадаться из названия, она устанавливает драйвер. Path - путь до исходного файла, name - название драйвера (он установится в /drivers/[name]), SUkeyOrRequest - ключ суперпользователя или запросить разрешение пользователя. В SCI.lua надо подменить функцию requestOfInstallDriver, поскольку она всегда возвращает false (сделано, что бы 1. не было большой уязвимости (поставлю true - будет уязвимость) 2. взяв за основу мое ядро, можно будет быстро вставить окошко запроса, не стирая мой код). в нее надо поставить окошко запроса. Либо так и оставить.
-
Нет, он сам его выложил в общее использование на этом же форуме
-
Я думаю, что любой из вас пытался сделать права доступа к определенным файлам. У некоторых это получалось - например разработчик opensecurity со своей secureos, но она тоже взламывается. Не думаю, что кому-то это удалось, поэтому встречайте Module Kernel. Это еще сырое ядро, и даже неспособное открывать какие-либо программы, поэтому я прошу подкинуть идей насчет некоторых компонентов и sandbox-окружения (ибо я удаляю все компоненты из окружения и добавляю их в System Calling Interface, а это ведь код). Код можно посмотреть тут https://github.com/HeroBrine1st/Module-Kernel . За лишние do-end не ругайтесь: это для удобства чтения кода в моем редакторе, ведь можно сделать вот так: И можно будет получить быстрый доступ к определенному куску кода. Установить это ядро можно поверх openos. Вот установщик (по быстрому сляпал, поэтому использую установщик ECS): https://github.com/HeroBrine1st/Module-Kernel/blob/master/v1.0/installer.lua. Вместе с моим кодом есть еще два файла, которые я выдрал из openos - buffer.lua и serialization.lua. Оба нужны для SCI. Первый для сокетов, а второй - для чтения и записи прав доступа. Список того, что есть: Демоны - слушают все события в системе и обрабатывают их. На форуме выкладывали методику построения резидентных программ, а это тоже самое, но в виде файла. Что бы создать демона, просто сделайте, что бы он вернул при запуске 3 параметра - свое имя, функцию старта (можно поставить хоть пустышку в виде function() end, но главное - не nil и ничего другого, кроме function) и функцию, которая будет запускаться при каждом событии в системе с первым параметром - таблица с событием (touch, key_down и подобное). Если файл демона есть в папке /daemons/ - он подключится сам, никаких действий с вашей стороны больше не потребуется. Базовая система модулей - kernel.loadModule(name:string). работает почти как require, но загружает модули из /module/?.lua. Недописанная библиотека безопасных обращений к модулям и прав доступа к файловой системе. UPD: драйвера. Подробнее ниже. Один скриншот запущенного ядра. Белая полоска внизу - поле для ввода текста. Все основные идеи я воплотил, и они почти закончились, поэтому подкиньте, пожалуйста, идей. P.s. думаю, что документация не нужна, поскольку в коде все и так понятно. P.s.s. ниже - в комментариях
-
Переставь клавиатуру в другое место. Повторять до исчезновения проблемы. Помогает всегда.
-
Установка 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 вместо ошибки, я пока полагаю, что это связано с блокировками.
-
А как работать с сетью? Всмысле прогонять через нее данные, что бы она на основе своей обученности выдавала новые значения. Или эта функция тоже недописана/не написана?
-
И правда. Ночью вообще подумал про забывшие запятые) + в репу (вам обоим, ес че)
-
Сделал я значит себе блютуз в ОС (знаю, есть такой, но код я воровать не хочу). Отдебажил все, но тут ошибка local bluetooth = { port = 61593, state = false, opened = false, name = "Безымянный", devices = {}, listener = function(...) local s = {...} print(pcall(function(signal) print(signal[6]) --if not signal[4] == bluetooth.port then return end local reason = signal[6] if reason == "PING" and opened then modem.send(signal[3],bluetooth.port,"PONG",bluetooth.name) end if reason == "PONG" then computer.pushSignal("BLUETOOTH","PONG",signal[3],signal[7]) end end,s)) } -- это та самая 31я строка, просто я перетащил скобку вверх, убрав пустые строки Я проверил все несколько раз, пытался добавить и убрать скобку, минификатор так же видит эту ошибку, но при этом никакая конфигурация скобок не помогает решить проблему. В общем, помогите мне решить эту проблему.
-
Есть. Моя либка folderMount вам поможет. дублируете корень в папку, затем монтируете папку в корень, параллельно запустив программу через load()(), а component.eeprom.set просто переопределяете, что бы при перепрошивке EEPROM пользователя спросило, прошивать или нет. component.invoke тоже переопределить, что бы юзал component[component][method]. В итоге если программа нашалит, то либо пользователь согласился, либо она нашалила не в ту папку. А, еще component.filesystem замените на то, что отдаст метод mount моей библиотеки.
-
[ok=Обновлено][/ok] Я убрал большинство костылей, но добавил 1 из-за особенностей библиотеки - импорт библиотеки находится в цикле и импортируется с помощью dofile Также: Программа узнает количество слотов в инвентаре сама Спрашивает "частоту зигзагов" Спрашивает положение робота на базе Установка все та же - pastebin get -f PZGzqbdk /miner.lua Так же, если вставить в робота и в комп связанные платы, можно установить pastebin get PZGzqbdk /controller.lua в компьютер Это альфа-версия программы контроллирования робота, но она уже успешно показывает координаты
-
Насчет эффективности: я вдохновился астрошахтером, а он упускает руду частенько. Я сделал также, пользователь может ходить по шахтам и выкапывать руду, если тот упустил. А еще это плюс для новичков - если пользователь забывает подчищать за роботом, новички на сервере могут выкапывать руды в шахтах. И в конце концов, робот копает шахты, а не карьер.
