olie305

base64

Sep 29th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.87 KB | None | 0 0
  1. function lsh(value,shift)
  2.     return (value*(2^shift)) % 256
  3. end
  4. function rsh(value,shift)
  5.     return math.floor(value/2^shift) % 256
  6. end
  7. function bit(x,b)
  8.     return (x % 2^b - x % 2^(b-1) > 0)
  9. end
  10. function lor(x,y)
  11.     result = 0
  12.     for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end
  13.     return result
  14. end
  15.  
  16. -- Encoding
  17. local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'}
  18. function encode(data)
  19.     local bytes = {}
  20.     local result = ""
  21.     for spos=0,string.len(data)-1,3 do
  22.         for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end
  23.         result = string.format('%s%s%s%s%s',result,base64chars[rsh(bytes[1],2)],base64chars[lor(lsh((bytes[1] % 4),4), rsh(bytes[2],4))] or "=",((#data-spos) > 1) and base64chars[lor(lsh(bytes[2] % 16,2), rsh(bytes[3],6))] or "=",((#data-spos) > 2) and base64chars[(bytes[3] % 64)] or "=")
  24.     end
  25.     return result
  26. end
  27.  
  28. -- Decoding
  29. local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil}
  30. function decode(data)
  31.     local chars = {}
  32.     local result=""
  33.     for dpos=0,string.len(data)-1,4 do
  34.         for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end
  35.         result = string.format('%s%s%s%s',result,string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),(chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",(chars[4] ~= nil) and string.char(lor(lsh(chars[3],6) % 192, (chars[4]))) or "")
  36.     end
  37.     return result
  38. end
  39.  
  40. tArgs = {...}
  41. EorD = tArgs[1]
  42. ForS = tArgs[2]
  43. tBE = tArgs[3]
  44. if not EorD or not ForS or not tBE then
  45.     error("Usage: Base64 <-E:-D> <-F:-S> <FileName:String>")
  46. end
  47.  
  48. if EorD == "-E" or EorD == "-e" then
  49.     if ForS == "-F" or ForS == "-f" then
  50.         if fs.exists(tBE) then
  51.             file = io.open(tBE, "r")
  52.             fileCont = file:read("*a")
  53.             file:close()
  54.             encoded = encode(fileCont)
  55.             encfile = io.open(tBE..".b64", "w")
  56.             encfile:write(encoded)
  57.             encfile:close()
  58.             print("Original File: "..tBE.." | Encoded File: "..tBE..".b64")
  59.         else
  60.             error("File "..tBE.." Doesn't Exist")
  61.         end
  62.     elseif ForS == "-S" or ForS == "-s" then
  63.         encoded = encode(tBE)
  64.         print("Original: "..tBE.." | Encoded: "..encoded)
  65.     else
  66.         error("I don't understand: "..ForS)
  67.     end
  68. elseif EorD == "-D" or EorD == "-d" then
  69.     if ForS == "-F" or ForS == "-f" then
  70.         if fs.exists(tBE) then
  71.             file = io.open(tBE, "r")
  72.             fileCont = file:read("*a")
  73.             file:close()
  74.             decoded = decode(fileCont)
  75.             decfile = io.open(tBE..".DECb64", "w")
  76.             decfile:write(decoded)
  77.             decfile:close()
  78.             print("Original File: "..tBE.." | Decoded File: "..tBE..".DECb64")
  79.         else
  80.             error("File "..tBE.." Doesn't Exist")
  81.         end
  82.     elseif ForS == "-S" or ForS == "-s" then
  83.         decoded = decode(tBE)
  84.         print("Original: "..tBE.." | Decoded: "..decoded)
  85.     else
  86.         error("I don't understand: "..ForS)
  87.     end
  88. else
  89.     error("I don't understand: "..EorD)
  90. end
Add Comment
Please, Sign In to add comment