HeroBrine1st
-
Публикации
134 -
Зарегистрирован
-
Посещение
-
Победитель дней
21
Сообщения, опубликованные пользователем HeroBrine1st
-
-
Выкатил обновление. Свайпов нету (слишком сложно, а я обновление хотел выпустить сегодня).
Добавлено: - Показатель оперативной памяти в строке состояния
- Обработчик малого количества оперативной памяти
- "Расположение файла" у ярлыков
- Ярлыки теперь работают и для контекстного меню
-
Блокировка системы паролем
Изменено: - Вложенные контекстные меню подсвечиваются (вы это можете видеть на скриншотах выше - зеленым подсвечивается)
- Большинство программ (в том числе контекстное меню) реагируют не на нажатие, а на отпускание кнопки мыши
- Незначительные изменения системы обновлений
Исправлено: - OS.lua могла неверно думать о количестве элементов на рабочем столе
- Дублирование ошибки системы обновлений
P.s. нужна помощь с алгоритмом свайпа. Я не до конца понимаю, как мне рассчитать координаты одновременно двух страниц.
-
2
-
Не тестировал от слова совсем, однако быстрого выключения не наблюдал.
Там DoubleBuffering должна оптимизировать работу с gpu, а соотвественно и основное потребление энергии. Операций CPU в конфиге не видел, вроде и не должен потреблять энергию.
UPD: Проверил, примерно 1% в минуту без апгрейдов на батарею кушает в простое
-
Только что, Totoro сказал:Свайпать можно?
Всмысле прокрутка с помощью зажатия и движения мышки?
Этого пока нет. Но идея отличная. спасибо
-
-
Репозиторий с кодом - https://github.com/HeroBrine1st/TabletOS
Прошу не углубляться в мой код.
Есть неполная документация - https://github.com/HeroBrine1st/TabletOS/wiki
P.s. система юзает DoubleBuffering от ECS, можно юзать его библиотеку GUi.lua (ее скачать надо)
UPD2: Скриншоты -
-
Система предоставляет графическую оболочку для планшетов, имеющую минималистичный интерфейс и понятное
только мнеиспользование, а так же минимальное(надеюсь)потребление ОЗУ.Из фич оболочка дает:
- Возможность использования OpenOS частично без использования команд. Для особых случаев - используем контекстное меню -> "Выполнить команду"
- Возможность посылки уведомлений пользователю. Многозадачность не реализована, так что пассивную часть программы нужно активировать библиотекой thread из OpenOS
- Запуск программ-папок (*.pkg). Чисто для разграничения кода и возможности создания модулей
- Адаптивная отрисовка интерфейса. На экранах с разрешением по ширине, не кратной 20, могут возникать проблемы, однако без искусственного изменения разрешения такого не произойдет.
- Помощь в настройке при первом запуске. На случай проблем - на первом экране используется колёсико мыши.
- Блокировка экрана
- Горячие клавиши на главном экране (клик+delete - удалить, ctrl+e+клик - редактировать и подобное)
- QR-коды для быстрого доступа юзера к ссылкам
В планах:
-
Специальный фреймворк аля Zygote из андроида. Естественно абсолютно весь функционал переписывать не буду, однако основной останется. Этот фреймворк повлечет за собой полный рефакторинг кода (перевод системы на него), но полностью устранит все недостатки
- TabletOSNetwork - что бы было. Протокол сам в себе будет держать защиту от MITM (Сначала на DSA, потом переведу на ECDSA (реально сложно для меня пока)) и некоторую маршрутизацию с помощью специальных реле (что бы у юзеров планшеты не лагали).
Установка - pastebin run 1xudmTa7
Выберите в установщике TabletOS и канал обновлений "Stable".
В дальнейшем система будет уведомлять о обновлениях, при получении оного нужно будет зайти в настройки (контекстное меню в левом нижнем углу экрана) и там обновиться.
В случае, когда при обновлении бросает ошибку - посмотрите изменения, там будут инструкции по ручному обновлению или переустановке системы. Если и это невозможно. переустановите систему. Данные должны сохраниться, а вот система - обновиться.-
9
-
1
-
1
-
Еще раз обновил утилиту)
1. Как говорил ECS, теперь временный файлик находится на диске. По умолчанию - /usr/cryptednote/temp.crtnt, + использую computer.pullSignal
2. Заменил gpu.set на функцию write (стащил из другой своей программы
), которая стирает и пишет на последней записанной строке
И предыдущие изменения:
3. Поддерживает большие файлы
4. Появился флаг --execute (-x), который расшифровывает и вызывает файл без его записи на диск.
5. Файлы программы перенесены в /usr/cryptednote и это можно изменить в коде.
Из-за записи на загрузочный диск упала безопасность - в случае принудительного выключения устройства или (хуже) вытаскивания диска расшифованный файл так и останется лежать. Так что используем планшеты и желательно в безопасных местах)
-
Чутка обновил утилиту. Из изменений - заметки перенесены в/usr/cryptednote (легко меняется в коде, если надо все вернуть) и поддерживает огромные (реально огромные файлы вплоть до свободной ОЗУ) файлы. Но с последним проблемы, оно как-то не так записывает расшифрованный файл в /tmp/, обрезает его почему-то.
Установка тем же методом.
Про поддержку огромный файлов - они вызывали ошибку TLWY, пришлось делать цикл (спасибо за блочность алгоритма) и вставлять os.sleep(0).
P.s. там в коде можно найти gpu.set вместо term.write - это мне было лень делать функцию переноса курсора на начало строки)
UPD: еще флаг --execute сделал (или -x), расшифровывает файл и запускает его. Расшифрованный код никуда не записывается, он остается только в ОЗУ
-
И какая в этом польза, если доступ к ключу внутри Lua всё равно уже потерян, а другого доступа в OpenComputers нет и не предвидится?Я рассчитывал на то, что если админам понадобится ключ - они пойдут в кеш сервера и пойдут его искать там. Ну раз у луа такая логика, значит придется удалить этот участок кода..
P.s. и переменные можно вообще не обнулять получается? нет смысла?
Почему 35 итераций достаточно для гарантированного удаления ключа?При выключенной буферизации все изменения переменных будут моментально записаны на диск сервера. Если это HHD, то 35 (уточняется) итераций как раз будет достаточно для полной перезаписи информации (как оказалось, не информация перезаписывается, а ссылка на нее). А если SSD, то Trim удалит остаточные данные.
-
Откуда инфа?
Из какого-то канала Telegram. Подтвердить инфу не могу, увы(
Лишним не будет - выполняется моментально. os.sleep чисто для наблюдения процесса поставил, иначе ввел пароль и сразу к файлу
-
@@HeroBrine1st, можешь пояснить назначение этого хитрого участка кода?
print("Перезапись ключа в ОЗУ 35 раз") for i = 1, 35 do psk = string.random(psk:len()) end print("Удаление ключа из ОЗУ") psk = nilОЗУ компа на хост-мащине хранится в ее ПЗУ. Для полной перезаписи с удалением информации нужно 35 итераций.
Если включена буферизация, это не поможет, но если отключена - вполне рабочая вещь.
К слову, о мануале при первом запуске утилиты и продолжению по клику. Я сделал.
-
Установка - pastebin get wmAj3hcP /bin/cryptednote.lua
Библиотека - pastebin get uDnh4RLi /lib/crypt.lua
Альтернативный вариант установки (выберите там CryptedNote, это мой установщик на все мои проги :) ) - pastebin run 1xudmTa7
Использование:
cryptednote name [options]
Опции:
- --rewrite; -w - перезапись файла
- --execute; -x - исполнение файла без записи на диск
Пароль закрыт точками. Зашифрованные файлы хранятся в /usr/cryptednote (легко меняется в коде).
Если файл редактируется, он находится в /usr/cryptednote/temp.crtnt (в нешифровнном виде).
-
6
-
Ответ - http://prntscr.com/jjvx97
Код:
local RSA = {} local bigint = require("libbigint") function method2(b, e, m) if type(b) == "number" then b = bigint(b) os.sleep(0) end if e == 0 then return 1 elseif e == 1 then os.sleep(0) return b elseif e % 2 == 1 then os.sleep(0) return (method2(b, e - 1, m) * b) % m else os.sleep(0) local x = method2(b, e / 2, m) return (x*x) % m end end local modulePow = method2 local function fermaTest(p) local a for i = 2, math.huge do if i%p ~= 0 then a = i break end end return modulePow(a,p-1,p)==bigint(1) end local function generatePrime() local prime = 4 while not fermaTest(prime) do prime = math.random(0xFFFFFF,0xFFFFFFFFFF) end return prime end function RSA.getkey() rsa_e = 0 rsa_p = generatePrime() rsa_q = generatePrime() while rsa_q == rsa_p do rsa_q = generatePrime() end rsa_n = rsa_p*rsa_q rsa_phi = (rsa_p-1)*(rsa_q-1) while rsa_e == 0 do local prime = generatePrime() if rsa_phi%prime > 0 then rsa_e = prime end end for i = 2, rsa_phi/2 do if ((i*rsa_phi)+1)%rsa_e == 0 then rsa_d = ((i*rsa_phi)+1)/rsa_e break end end local public = {rsa_e,rsa_n} local private = {rsa_d,rsa_n} return private, public end function RSA.encrypt(number,pE,pN) return modulePow(number,pE,pN) end function RSA.decrypt(number,sD,sN) return modulePow(number,sD,sN) end local private, public = RSA.getkey() print(table.unpack(private)) print(table.unpack(public)) local num1 = RSA.encrypt(4,table.unpack(public)) print(num1) print(RSA.decrypt(num1,table.unpack(private))) return RSAВсе так же, как и без bigint - число получилось совсем другим.
Лично я думаю, что дело в тесте на простоту, поскольку тест Ферма - вероятностный тест и он можешь только лишь подтвердить, составное ли ему дали число, но опровергнуть - нет.
UPD. использовал третий метод + бинарник луа. результат тот же - http://prntscr.com/jjw0m9
-
Натыкал. жду ответа третью минуту.
а, ща исправим (не хочу плодить сообщения)
-
Однако ошибка все равно происходит. Причем там, где обычная арифметика справляется на ура.
local RSA = {} local bigint = require("libbigint") function method2(b, e, m) if type(b) == "number" then b = bigint(b) end if e == 0 then return 1 elseif e == 1 then return b elseif e % 2 == 1 then return (method2(b, e - 1, m) * b) % m else local x = method2(b, e / 2, m) return (x*x) % m end end local modulePow = method2 local function fermaTest(p) local a for i = 2, math.huge do if i%p ~= 0 then a = i break end end return modulePow(a,p-1,p)==1 end local function generatePrime() local prime = 4 while not fermaTest(prime) do prime = math.random(0xFF,0xFFF) end return prime end function RSA.getkey() rsa_e = 0 rsa_p = generatePrime() rsa_q = generatePrime() while rsa_q == rsa_p do rsa_q = generatePrime() end rsa_n = rsa_p*rsa_q rsa_phi = (rsa_p-1)*(rsa_q-1) while rsa_e == 0 do local prime = generatePrime() if rsa_phi%prime > 0 then rsa_e = prime end end for i = 2, rsa_phi/2 do if ((i*rsa_phi)+1)%rsa_e == 0 then rsa_d = ((i*rsa_phi)+1)/rsa_e break end end local public = {rsa_e,rsa_n} local private = {rsa_d,rsa_n} return private, public end function RSA.encrypt(number,pE,pN) return modulePow(number,pE,pN) end function RSA.decrypt(number,sD,sN) return modulePow(number,sD,sN) end local private, public = RSA.getkey() print(table.unpack(private)) print(table.unpack(public)) local num1 = RSA.encrypt(4,table.unpack(public)) print(num1) print(RSA.decrypt(num1,table.unpack(private))) return RSAИ сама ошибка - http://prntscr.com/jj3jml
76 строка, затем 31 и ошибка происходит в рекурсивном методе method2.
Вот же ответ обычной арифметики (Удалил строки с 5й по 7ю) за ~0.3 секунды - http://prntscr.com/jj3kme
-
Пример кода можно?
Кажется, я понял, в чем ошибка. Рекурсивный метод вызывает сам себя, а с ним вызывается и преобразование числа(уже таблицы) в bigint-таблицу. Вот тут и происходит ошибка.
-
А что не так с bigint? По тестировал. Вроде всё нормально
Жалуется на то, что получило значение, отличное от числа. Не знаю, как это фиксить, ибо я передаю число.
-
Это будет целочисленная арифметика. Какие нужны операции и нужны ли отрицательные числа?
Нужны три операции: умножение, возведение в квадрат и взятие остатка от деленияОтрицательные числа не нужны.
-
Так может тебе помочь написать длинную арифметику? На подобии метачисел, только на основе таблиц, а не строк?
Я бы не отказался
-
Длинную арифметику написать не смог. https://github.com/OpenPrograms/Fingercomp-Programs/blob/master/libbigint/bigint.lua не слушается.
Зато есть генератор простого числа на тесте Ферма. И у него сильно ограничен диапазон из-за отсутствия длинной арифметики.
Раскомментировав последние строки, получите код для проверки алгоритма.
local RSA = {} function method2(b, e, m) if e == 0 then return 1 elseif e == 1 then return b elseif e % 2 == 1 then return (method2(b, e - 1, m) * b) % m else local x = method2(b, e / 2, m) return (x*x) % m end end local modulePow = method2 local function fermaTest(p) local a for i = 2, math.huge do if i%p ~= 0 then a = i break end end return modulePow(a,p-1,p)==1 end local function generatePrime() local prime = 4 while not fermaTest(prime) do prime = math.random(0xFF,0xFFF)--вот тут можно указать диапазон простого числа. end return prime end function RSA.getkey() rsa_e = 0 rsa_p = generatePrime() rsa_q = generatePrime() while rsa_q == rsa_p do rsa_q = generatePrime() end rsa_n = rsa_p*rsa_q rsa_phi = (rsa_p-1)*(rsa_q-1) while rsa_e == 0 do local prime = generatePrime() if rsa_phi%prime > 0 then rsa_e = prime end end for i = 2, rsa_phi/2 do if ((i*rsa_phi)+1)%rsa_e == 0 then rsa_d = ((i*rsa_phi)+1)/rsa_e break end end local public = {rsa_e,rsa_n} local private = {rsa_d,rsa_n} return private, public end function RSA.encrypt(number,pE,pN) return modulePow(number,pE,pN) end function RSA.decrypt(number,sD,sN) return modulePow(number,sD,sN) end -- local private, public = RSA.getkey() -- print(table.unpack(private)) -- print(table.unpack(public)) -- local num1 = RSA.encrypt(4096,table.unpack(public)) -- print(num1) -- print(RSA.decrypt(num1,table.unpack(private))) return RSA -
Использовав третий метод в сравнении ECS (4й уже для lua 5.3) я нашел странную вещь - при больших числах выходное значение дешифрования отлично от входного значения шифрования.
Вот код:
local RSA = {} local primes = { 11995003,11995019,11995031,11995057,11995079,11995091,11995129,11995147,11995157,11995187,11995201, 11995229,11995261,11995279,11995303,11995337,11995339,11995343,11995367,11995369,11995381,11995391, 11995427,11995447,11995453,11995457,11995469,11995499,11995507,11995513,11995537,11995547,11995567, 11995573,11995619,11995639,11995651,11995661,11995691,11995717,11995721,11995751,11995757,11995759, 11995769,11995787,11995799,11995813,11995817,11995831,11995843,11995847,11995849,11995873,11995883, 11995889,11995891,11995909,11995927,11995957,11995961,11995981,11996003,11996009,11996021,11996069, 11996081,11996099,11996107,11996113,11996119,11996123,11996143,11996147,11996161,11996167,11996191, 11996197,11996207,11996209,11996249,11996261,11996267,11996279,11996291,11996297,11996323,11996329, 11996359,11996377,11996381,11996393,11996447,11996449,11996507,11996531,11996533,11996539,11996557, 11996573,11996591,11996599,11996617,11996627,11996629,11996651,11996681,11996689,11996693,11996701, 11996711,11996729,11996741,11996753,11996767,11996773,11996791,11996821,11996833,11996837,11996851, 11996857,11996909,11996911,11996927,11996939,11996987,11996993,11997049,11997059,11997061,11997071, 11997107,11997109,11997137,11997157,11997179,11997199,11997233,11997247,11997269,11997277,11997299, 11997311,11997319,11997343,11997347,11997383,11997397,11997409,11997437,11997443,11997449,11997463, 11997481,11997523,11997533,11997547,11997551,11997553,11997577,11997593,11997599,11997611,11997613, 11997617,11997637,11997647,11997649,11997659,11997679,11997691,11997751,11997787,11997829,11997841, 11997847,11997863,11997877,11997893,11997901,11997913,11997917,11997919,11997929,11997943,11997959, 11997977,11997991,11998009,11998013,11998031,11998033,11998043,11998067,11998121,11998123,11998127, 11998153,11998171,11998183,11998187,11998201,11998213,11998223,11998297,11998303,11998369,11998381, 11998391,11998439,11998487,11998501,11998507,11998513,11998529,11998541,11998577,11998589,11998601, 11998607,11998621,11998661,11998673,11998681,11998697,11998711,11998717,11998733,11998739,11998741, 11998751,11998759,11998769,11998807,11998813,11998817,11998843,11998859,11998927,11998933,11998949, 11998951,11998967,11998979,11999027,11999111,11999129,11999153,11999159,11999171,11999173,11999177, 11999179,11999233,11999257,11999291,11999293,11999303,11999311,11999321,11999329,11999333,11999381, 11999423,11999443,11999461,11999489,11999513,11999527,11999531,11999551,11999563,11999653,11999657, 11999681,11999683,11999699,11999719,11999723,11999747,11999749,11999761,11999777,11999789,11999791, 11999797,11999831,11999837,11999843,11999857,11999879,11999903,11999927,11999929,11999941,11999987, } local primes_start = 1 -- начальный индекс рандомизации rsa_p и rsa_q local function modulePow(b, e, m) local result = 1 b = b % m while e > 0 do if e % 2 == 1 then e, result = e - 1, (result * b) % m else e, b = e / 2, (b * b) % m end end return result end function RSA.getkey() rsa_e = 0 rsa_p = primes[math.random(primes_start,#primes)] rsa_q = rsa_p while rsa_q == rsa_p do rsa_q = primes[math.random(primes_start,#primes)] end rsa_n = rsa_p*rsa_q rsa_phi = (rsa_p-1)*(rsa_q-1) while rsa_e == 0 do local prime = primes[math.random(1,#primes)] if rsa_phi%prime > 0 then rsa_e = prime end end for i = 2, rsa_phi/2 do if ((i*rsa_phi)+1)%rsa_e == 0 then rsa_d = ((i*rsa_phi)+1)/rsa_e break end end local public = {rsa_e,rsa_n} local private = {rsa_d,rsa_n} return private, public end function RSA.encrypt(number,pE,pN) return modulePow(number,pE,pN) end function RSA.decrypt(number,sD,sN) return modulePow(number,sD,sN) end local private,public = RSA.getkey() local num = RSA.encrypt(65536,public[1],public[2]) print(num) print(RSA.decrypt(num,private[1],private[2])) return RSAИ выход в opencomputers (lua 5.2) - http://prntscr.com/je2nnp
(после вызова команды первое число - зашифрованное число, второе - расшифрованное)
Шифровал я число 65536. А получил совершенно другие числа.
Попробую второй метод, если тоже не получится - надо будет уменьшать числа в таблице.
UPD: с вторым методом так же
UPD2: с простыми числами 3855000-3859999 все так же. При уменьшении до 1-1000 все становится нормально.
-
@@HeroBrine1st а зачем тебе статичная таблица простых чисел, если можно легко написать генератор этих чисел? И будет у тебя сколько хочешь таких чисел. Генерация не займёт много времени.
Как раз проблема в их генерации. Пользуясь решетом кого-то там я не добивался высоких скоростей. Поэтому я сделал таблицу, которая заметно увеличила скорость загрузки библиотеки.
На крайняк можно в /boot/ записать require("RSA") конечно, но это уже вмешательство в openos
-
Немного погуглив, я заметил, что существуют онлайн-сервисы разложения числа на множители. Вставив туда число вида 42894984343598, разложило примерно за полминуты.
То есть можно просто записать сниффером все, включая обмен ключами (я для чего и пишу библиотеку - для коммуникации внутри сети Zn, отсеивая атаку man in-the-middle), а затем в таком сервисе разложить число, получить нужный множитель и найти секретный ключ.
И тут встает вопрос: потянет ли OC числа, которые не потянут такие сервисы? Нет.
Вот тут можно закончить оптимизацию алгоритма. Для сетевых интерфейсов внутри игры этого более, чем достаточно.
-
Попробовал от 990000 до 1000000 использовать простые числа. Шифровка - нормально, дешифровка - too long without yielding.
Поставил os.sleep(0) - получил зависнувший сервер (из опенкомпов, а не хост)
UPD: от 50000 до 100000 - все так же








TabletOS
в Операционные системы
Опубликовано: · Изменено пользователем HeroBrine1st
85% - заряд батареи. Хочу найти иконку батареи, да не весь юникод поддерживается(