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

Еще один топорный алгоритм шифрования

Рекомендуемые сообщения

Если надо зашифровать сообщение, но не хватает ресурсов, можно использовать XOR.

Но нельзя использовать короткий циклический ключ, XOR хорош, когда можно получить рандомный ключ, равный длине сообщения.

Если в math.random нету дыр, то можно использовать его.

Функция подгоняет длину ключа к длине сообщения и прогоняет через XOR.

local function encrypt(message, key)
  unicode = require('unicode')
  nKey = ''
  for i = 1, unicode.len(key) do
    nKey = nKey..key:byte(i) -- переводим ключ в number
  end

  math.randomseed(tonumber(nKey)) -- засеиваем генератор ключом

  tKey = {}
  sNewKey = ''
  for j = 1, unicode.len(message) do
    tKey[j] = ''
    while unicode.len(tKey[j]) ~= unicode.len(message.byte(j)) do
      tKey[j] = tKey[j]..math.random(0, 9) -- создаем рандомный код для ключа
    end
    sNewKey = sNewKey..unicode.char(bit32.bxor(message:byte(j), tKey[j])) -- записваем результат
  end
  return sNewKey
end

Пример использования:

a = encrypt('сообщение', 'ключ') -- шифруем

print(encrypt(a, 'ключ')) -- расшифровываем

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пытался прикрутить брутфорс, выяснил, что средствами OpenComputers ломать бессмысленно.

Из-за того, что мощность процессора регулируется не замедлением реальных тактов, а жесткими фризами, то даже на самой мощной железяке выходит примерно так:

  алфавит 92 символа - 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !?@#$%^&*()_+=-*/[]{}:;'".,<>

 

время перебора:

  1 символ = 0.42 секунд
  2 символа = 39 секунд
  3 = около получаса
  4 = больше трех дней
  5 = почти год

 

Если брутить голым lua, то скорость возрастает где-то в 2000 раз.

 

А если в ключе использовать рандомные символы юникода, то ломать вообще бессмысленно (при длине пароля не меньше 10 символов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А вне системы его использовать можно?

Есть ли он в виде отдельной библиотеки?

 

Судя вот по этому:

https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala

библиотека врезана в мод. Поэтому достать не получится, но, потенциально можно использовать и за пределами OpenOS (но в пределах OC).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Стандартная библиотека UTF-8 работает аналогично, можно просто заменить 'unicode' на 'utf8'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А где её взять-то, 'utf8'? Ссылку можете дать?

Есть примеры  асимметричного шифрования на Lua?

Изменено пользователем computercraft

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А где её взять-то, 'utf8'? Ссылку можете дать?

Есть примеры  асимметричного шифрования на Lua?

'utf8' — стандартная библиотека для lua 5.3 и выше. http://www.lua.org/manual/5.3/manual.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть примеры  асимметричного шифрования на Lua?

Вроде как дата-карта умеет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что есть "дата-карта"?

Это карта для компьютера из OpenComputers предоставляет несколько видов шифрования/кодирования

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зачем подбирать ключ, если можно подобрать пару псевдорандомных значений и восстановить ключ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Какое такое значение? Ключ служит затравкой для ГПСЧ, для каждого символа генератор выдает новое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Какое такое значение? Ключ служит затравкой для ГПСЧ, для каждого символа генератор выдает новое значение.

У тя есть math.randomseed(tonumber(nKey))

А затем math.random(0, 9)

 

Не надо подбирать целиком ключ, достаточно сид подобрать, не?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не понимат.

Ключ это и есть сид, сид задает генератор, при каждом обращении к генератору он выдает новое значение, которое ксорится с кодом символа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не понимат.

Ключ это и есть сид, сид задает генератор, при каждом обращении к генератору он выдает новое значение, которое ксорится с кодом символа.

math.randomseed(key) для одного и того же key выдаст одинаковую последовательность псевдослучайных чисел. Точнее дальнейшая функция math.random()

Изменено пользователем Jet

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В этом весь смысл алгоритма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В этом весь смысл алгоритма.

Но в этом его слабость. Будет времечко - напишу ломалку под него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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