Перейти к содержимому

HeroBrine1st

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

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

  • Посещение

  • Победитель дней

    21

Сообщения, опубликованные пользователем HeroBrine1st


  1. Выкатил обновление. Свайпов нету (слишком сложно, а я обновление хотел выпустить сегодня).

    Добавлено:
    1. Показатель оперативной памяти в строке состояния
    2. Обработчик малого количества оперативной памяти
    3. "Расположение файла" у ярлыков
    4. Ярлыки теперь работают и для контекстного меню
    5. Блокировка системы паролем

     
    Изменено:
    1. Вложенные контекстные меню подсвечиваются (вы это можете видеть на скриншотах выше - зеленым подсвечивается)
    2. Большинство программ (в том числе контекстное меню) реагируют не на нажатие, а на отпускание кнопки мыши
    3. Незначительные изменения системы обновлений
     
    Исправлено:
    1. OS.lua могла неверно думать о количестве элементов на рабочем столе
    2. Дублирование ошибки системы обновлений

    P.s. нужна помощь с алгоритмом свайпа. Я не до конца понимаю, как мне рассчитать координаты одновременно двух страниц.

    Screenshot_1.png

    • Нравится 2

  2. Не тестировал от слова совсем, однако быстрого выключения не наблюдал.

    Там DoubleBuffering должна оптимизировать работу с gpu, а соотвественно и основное потребление энергии. Операций CPU в конфиге не видел, вроде и не должен потреблять энергию.

     

    UPD: Проверил, примерно 1% в минуту без апгрейдов на батарею кушает в простое


  3. Репозиторий с кодом - https://github.com/HeroBrine1st/TabletOS

    Прошу не углубляться в мой код.

    Есть неполная документация - https://github.com/HeroBrine1st/TabletOS/wiki

     

    P.s. система юзает DoubleBuffering от ECS, можно юзать его библиотеку GUi.lua (ее скачать надо)

    UPD2: Скриншоты -

     


  4. Еще раз обновил утилиту)

     

    1. Как говорил ECS, теперь временный файлик находится на диске. По умолчанию - /usr/cryptednote/temp.crtnt, + использую computer.pullSignal

    2. Заменил gpu.set на функцию write (стащил из другой своей программы :) ), которая стирает и пишет на последней записанной строке

    И предыдущие изменения:

    3. Поддерживает большие файлы

    4. Появился флаг --execute (-x), который расшифровывает и вызывает файл без его записи на диск.

    5. Файлы программы перенесены в /usr/cryptednote и это можно изменить в коде.

     

    Из-за записи на загрузочный диск упала безопасность - в случае принудительного выключения устройства или (хуже) вытаскивания диска расшифованный файл так и останется лежать. Так что используем планшеты и желательно в безопасных местах)


  5. Чутка обновил утилиту.  Из изменений - заметки перенесены в/usr/cryptednote (легко меняется в коде, если надо все вернуть) и поддерживает огромные (реально огромные файлы вплоть до свободной ОЗУ) файлы. Но с последним проблемы, оно как-то не так записывает расшифрованный файл в /tmp/, обрезает его почему-то.

    Установка тем же методом.

     

    Про поддержку огромный файлов - они вызывали ошибку TLWY, пришлось делать цикл (спасибо за блочность алгоритма) и вставлять os.sleep(0).

    P.s. там в коде можно найти gpu.set вместо term.write - это мне было лень делать функцию переноса курсора на начало строки)

     

    UPD: еще флаг --execute сделал (или -x), расшифровывает файл и запускает его. Расшифрованный код никуда не записывается, он остается только в ОЗУ


  6. И какая в этом польза, если доступ к ключу внутри Lua всё равно уже потерян, а другого доступа в OpenComputers нет и не предвидится?

    Я рассчитывал на то, что если админам понадобится ключ - они пойдут в кеш сервера и пойдут его искать там. Ну раз у луа такая логика, значит придется удалить этот участок кода..

    P.s. и переменные можно вообще не обнулять получается? нет смысла?

     

     

    Почему 35 итераций достаточно для гарантированного удаления ключа?

    При выключенной буферизации все изменения переменных будут моментально записаны на диск сервера. Если это HHD, то 35 (уточняется) итераций как раз будет достаточно для полной перезаписи информации (как оказалось, не информация перезаписывается, а ссылка на нее). А если SSD, то Trim удалит остаточные данные.


  7. @@HeroBrine1st, можешь пояснить назначение этого хитрого участка кода?

    	print("Перезапись ключа в ОЗУ 35 раз")
    	for i = 1, 35 do
    		psk = string.random(psk:len())
    	end
    	print("Удаление ключа из ОЗУ")
    	psk = nil

     

    ОЗУ компа на хост-мащине хранится в ее ПЗУ. Для полной перезаписи с удалением информации нужно 35 итераций.

    Если включена буферизация, это не поможет, но если отключена - вполне рабочая вещь.

     

    К слову, о мануале при первом запуске утилиты и продолжению по клику. Я сделал.


  8. Установка - pastebin get wmAj3hcP /bin/cryptednote.lua

    Библиотека - pastebin get uDnh4RLi /lib/crypt.lua

    Альтернативный вариант установки (выберите там CryptedNote, это мой установщик на все мои проги :) ) - pastebin run 1xudmTa7

    Использование:

    cryptednote name [options]

    Опции:

    1.  --rewrite; -w - перезапись файла
    2.  --execute; -x - исполнение файла без записи на диск

    Пароль закрыт точками. Зашифрованные файлы хранятся в /usr/cryptednote (легко меняется в коде).

    Если файл редактируется, он находится в /usr/cryptednote/temp.crtnt (в нешифровнном виде).

     

    Код - https://pastebin.com/wmAj3hcP

    • Нравится 6

  9. Ответ - 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


  10. Однако ошибка все равно происходит. Причем там, где обычная арифметика справляется на ура.

     

     

    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


  11. Пример кода можно?

    Кажется, я понял, в чем ошибка. Рекурсивный метод вызывает сам себя, а с ним вызывается и преобразование числа(уже таблицы) в bigint-таблицу. Вот тут и происходит ошибка.


  12. А что не так с bigint? По тестировал. Вроде всё нормально

    Жалуется на то, что получило значение, отличное от числа. Не знаю, как это фиксить, ибо я передаю число.


  13. Это будет целочисленная арифметика. Какие нужны операции и нужны ли отрицательные числа?

     

     

    Нужны три операции: умножение, возведение в квадрат и взятие остатка от деления

    Отрицательные числа не нужны.


  14. Длинную арифметику написать не смог. 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
    

     

     


  15. Использовав третий метод в сравнении 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 все становится нормально.


  16. @@HeroBrine1st а зачем тебе статичная таблица простых чисел, если можно легко написать генератор этих чисел? И будет у тебя сколько хочешь таких чисел. Генерация не займёт много времени.

    Как раз проблема в их генерации. Пользуясь решетом кого-то там я не добивался высоких скоростей. Поэтому я сделал таблицу, которая заметно увеличила скорость загрузки библиотеки.

    На крайняк можно в /boot/ записать require("RSA") конечно, но это уже вмешательство в openos


  17. Немного погуглив, я заметил, что существуют онлайн-сервисы разложения числа на множители. Вставив туда число вида 42894984343598, разложило примерно за полминуты.

     

    То есть можно просто записать сниффером все, включая обмен ключами (я для чего и пишу библиотеку - для коммуникации внутри сети Zn, отсеивая атаку man in-the-middle), а затем в таком сервисе разложить число, получить нужный множитель и найти секретный ключ.

    И тут встает вопрос: потянет ли OC числа, которые не потянут такие сервисы? Нет.

     

    Вот тут можно закончить оптимизацию алгоритма. Для сетевых интерфейсов внутри игры этого более, чем достаточно.


  18. Попробовал от 990000 до 1000000 использовать простые числа. Шифровка - нормально, дешифровка - too long without yielding.

    Поставил os.sleep(0) - получил зависнувший сервер (из опенкомпов, а не хост)

    UPD: от 50000 до 100000 - все так же

×
×
  • Создать...