function getCrypt(key)

math.randomseed(key)

function getIndex(stringIn,tableOut)
   for k,v in ipairs(tableOut) do
       if stringIn == v then
           return k
       end
   end
   return false
end

function defChar()
   local charset = {}
   charset.lower = ' abcdefghijklmnopqrstuvwxyz'
   charset.upper = string.upper(charset.lower)
   charset.number = '0123456789'
   local fullcharset = charset.lower .. charset.upper .. charset.number
   local chartbl = {}
   for echChar in string.gmatch(fullcharset,'%Z') do
       table.insert(chartbl,echChar)
   end
   return chartbl
end

function ver(table, str)
   for k,v in ipairs(table) do
       if str == v then
           return true
       end
   end
   return false
end

local charset = defChar()
local cryptset = {}

for i=1,#charset do
   while true do
       local bct = string.char(math.random(33,126))
       if not ver(cryptset,bct) then
           table.insert(cryptset,bct)
           break
       end
   end
end

return charset, cryptset
end

function encrypt(str, key)

local alfabeto, encrypt = getCrypt(key)
local encryptedStr = ''
local strtbl = {}

for ecchi in string.gmatch(str, '%Z') do
   table.insert(strtbl, ecchi)
end

for k,v in ipairs(strtbl) do
   local jcheck = getIndex(v,alfabeto)
   if jcheck then
       encryptedStr = encryptedStr .. encrypt[jcheck]
   end
end

return encryptedStr

end

function decrypt(str, key)

local alfabeto, encrypt = getCrypt(key)
local decryptedStr = ''
local strtbl = {}

for ecchi in string.gmatch(str, '%Z') do
   table.insert(strtbl, ecchi)
end

for k,v in ipairs(strtbl) do
   local jcheck = getIndex(v,encrypt)
   if jcheck then
       decryptedStr = decryptedStr .. alfabeto[jcheck]
   end
end

return decryptedStr

end