Advertisement
killer64

encrypt

Oct 11th, 2012
2,940
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.31 KB | None | 0 0
  1. local function zfill(N)
  2.     N=string.format("%X",N)
  3.     Zs=""
  4.     if #N==1 then
  5.         Zs="0"
  6.     end
  7.     return Zs..N
  8. end
  9.  
  10. local function serializeImpl(t)
  11.     local sType = type(t)
  12.     if sType == "table" then
  13.         local lstcnt=0
  14.         for k,v in pairs(t) do
  15.             lstcnt = lstcnt + 1
  16.         end
  17.         local result = "{"
  18.         local aset=1
  19.         for k,v in pairs(t) do
  20.             if k==aset then
  21.                 result = result..serializeImpl(v)..","
  22.                 aset=aset+1
  23.             else
  24.                 result = result..("["..serializeImpl(k).."]="..serializeImpl(v)..",")
  25.             end
  26.         end
  27.         result = result.."}"
  28.         return result
  29.     elseif sType == "string" then
  30.         return string.format("%q",t)
  31.     elseif sType == "number" or sType == "boolean" or sType == "nil" then
  32.         return tostring(t)
  33.     elseif sType == "function" then
  34.         local status,data=pcall(string.dump,t)
  35.         if status then
  36.             return 'func('..string.format("%q",data)..')'
  37.         else
  38.             error()
  39.         end
  40.     else
  41.         error()
  42.     end
  43. end
  44.  
  45. local function split(T,func)
  46.     if func then
  47.         T=func(T)
  48.     end
  49.     local Out={}
  50.     if type(T)=="table" then
  51.         for k,v in pairs(T) do
  52.             Out[split(k)]=split(v)
  53.         end
  54.     else
  55.         Out=T
  56.     end
  57.     return Out
  58. end
  59.  
  60. local function serialize( t )
  61.     t=split(t)
  62.     return serializeImpl( t, tTracking )
  63. end
  64.  
  65. local function unserialize( s )
  66.     local func, e = loadstring( "return "..s, "serialize" )
  67.     local funcs={}
  68.     if not func then
  69.         return e
  70.     end
  71.     setfenv( func, {
  72.         func=function(S)
  73.             local new={}
  74.             funcs[new]=S
  75.             return new
  76.         end,
  77.     })
  78.     return split(func(),function(val)
  79.         if funcs[val] then
  80.             return loadstring(funcs[val])
  81.         else
  82.             return val
  83.         end
  84.     end)
  85. end
  86.  
  87. local function sure(N,n)
  88.     if (l2-n)<1 then N="0" end
  89.     return N
  90. end
  91.  
  92. local function splitnum(S)
  93.     Out=""
  94.     for l1=1,#S,2 do
  95.         l2=(#S-l1)+1
  96.         CNum=tonumber("0x"..sure(string.sub(S,l2-1,l2-1),1) .. sure(string.sub(S,l2,l2),0))
  97.         Out=string.char(CNum)..Out
  98.     end
  99.     return Out
  100. end
  101.  
  102. local function wrap(N)
  103.     return N-(math.floor(N/256)*256)
  104. end
  105.  
  106. function checksum(S,num)
  107.     local sum=0
  108.     for char in string.gmatch(S,".") do
  109.         for l1=1,(num or 1) do
  110.             math.randomseed(string.byte(char)+sum)
  111.             sum=sum+math.random(0,9999)
  112.         end
  113.     end
  114.     math.randomseed(sum)
  115.     return sum
  116. end
  117.  
  118. local function genkey(len,psw)
  119.     checksum(psw)
  120.     local key={}
  121.     local tKeys={}
  122.     for l1=1,len do
  123.         local num=math.random(1,len)
  124.         while tKeys[num] do
  125.             num=math.random(1,len)
  126.         end
  127.         tKeys[num]=true
  128.         key[l1]={num,math.random(0,255)}
  129.     end
  130.     return key
  131. end
  132.  
  133. function encrypt(data,psw)
  134.     data=serialize(data)
  135.     local chs=checksum(data)
  136.     local key=genkey(#data,psw)
  137.     local out={}
  138.     local cnt=1
  139.     for char in string.gmatch(data,".") do
  140.         table.insert(out,key[cnt][1],zfill(wrap(string.byte(char)+key[cnt][2])),chars)
  141.         cnt=cnt+1
  142.     end
  143.     return string.sub(serialize({chs,table.concat(out)}),2,-3)
  144. end
  145.  
  146. function decrypt(data,psw)
  147.     local oData=data
  148.     data=unserialize("{"..data.."}")
  149.     if type(data)~="table" then
  150.         return oData
  151.     end
  152.     local chs=data[1]
  153.     data=data[2]
  154.     local key=genkey((#data)/2,psw)
  155.     local sKey={}
  156.     for k,v in pairs(key) do
  157.         sKey[v[1]]={k,v[2]}
  158.     end
  159.     local str=splitnum(data)
  160.     local cnt=1
  161.     local out={}
  162.     for char in string.gmatch(str,".") do
  163.         table.insert(out,sKey[cnt][1],string.char(wrap(string.byte(char)-sKey[cnt][2])))
  164.         cnt=cnt+1
  165.     end
  166.     out=table.concat(out)
  167.     if checksum(out or "")==chs then
  168.         return unserialize(out)
  169.     end
  170.     return oData,out,chs
  171. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement