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

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

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

Вроде понял в чем дело. Bigint некорректно выполняет сравнение длинного целого с обычным числом. Например, если сделать так:

bi=require("bigint")
a=bi(1)
=a==1

в результате получим false.

Вот твоя прога и зацикливается на строке №31, поскольку в строке №26 всегда имеем false.

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

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


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

Натыкал. жду ответа третью минуту.

а, ща исправим (не хочу плодить сообщения)

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

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


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

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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×