Advertisement
HPWebcamAble

SquidDev's AES API (Compressed)

Jun 28th, 2015
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.86 KB | None | 0 0
  1. -- SquidDev's AES API
  2. -- http://www.computercraft.info/forums2/index.php?/topic/18930-aes-encryption/
  3.  
  4. -- Compressed with Lua Minifier to reduce its size
  5. -- 26,623 bytes -> 13,886 bytes (47.84%!)
  6. -- Impossible for a human to read, but dat compression doe
  7. -- https://mothereff.in/lua-minifier
  8.  
  9. local function a(b)local c=setmetatable({},{__index=getfenv()})setfenv(b,c)local d=b()if d~=nil then return d end;return c end;bit=a(function()local floor=math.floor;local e=2^32;local lshift,rshift;local function rshift(f,g)if g<0 then return lshift(f,-g)end;return floor(f%e/2^g)end;local function lshift(f,g)if g<0 then return rshift(f,-g)end;return f*2^g%e end;return{bnot=bit.bnot,band=bit.band,bor=bit.bor,bxor=bit.bxor,rshift=rshift,lshift=lshift}end)gf=a(function()local bxor=bit.bxor;local lshift=bit.lshift;local h=0x100;local i=0xff;local j=0x11b;local k={}local l={}local function add(m,n)return bxor(m,n)end;local function sub(m,n)return bxor(m,n)end;local function invert(o)if o==1 then return 1 end;local p=i-l[o]return k[p]end;local function mul(m,n)if m==0 or n==0 then return 0 end;local p=l[m]+l[n]if p>=i then p=p-i end;return k[p]end;local function q(m,n)if m==0 then return 0 end;local p=l[m]-l[n]if p<0 then p=p+i end;return k[p]end;local function r()for s=1,h do print("log(",s-1,")=",l[s-1])end end;local function t()for s=1,h do print("exp(",s-1,")=",k[s-1])end end;local function u()local f=1;for s=0,i-1 do k[s]=f;l[f]=s;f=bxor(lshift(f,1),f)if f>i then f=sub(f,j)end end end;u()return{add=add,sub=sub,invert=invert,mul=mul,div=dib,printLog=r,printExp=t}end)util=a(function()local bxor=bit.bxor;local rshift=bit.rshift;local band=bit.band;local lshift=bit.lshift;local sleepCheckIn;local function byteParity(byte)byte=bxor(byte,rshift(byte,4))byte=bxor(byte,rshift(byte,2))byte=bxor(byte,rshift(byte,1))return band(byte,1)end;local function getByte(v,x)if x==0 then return band(v,0xff)else return band(rshift(v,x*8),0xff)end end;local function putByte(v,x)if x==0 then return band(v,0xff)else return lshift(band(v,0xff),x*8)end end;local function bytesToInts(y,z,h)local A={}for s=0,h-1 do A[s]=putByte(y[z+s*4],3)+putByte(y[z+s*4+1],2)+putByte(y[z+s*4+2],1)+putByte(y[z+s*4+3],0)if h%10000==0 then sleepCheckIn()end end;return A end;local function intsToBytes(A,B,C,h)h=h or#A;for s=0,h do for D=0,3 do B[C+s*4+3-D]=getByte(A[s],D)end;if h%10000==0 then sleepCheckIn()end end;return B end;local function E(y)local F=""for s,byte in ipairs(y)do F=F..string.format("%02x ",byte)end;return F end;local function G(H)local type=type(H)if type=="number"then return string.format("%08x",H)elseif type=="table"then return E(H)elseif type=="string"then local y={string.byte(H,1,#H)}return E(y)else return H end end;local function padByteString(H)local I=#H;local J=math.random(0,255)local K=math.random(0,255)local L=string.char(J,K,J,K,getByte(I,3),getByte(I,2),getByte(I,1),getByte(I,0))H=L..H;local M=math.ceil(#H/16)*16-#H;local N=""for s=1,M do N=N..string.char(math.random(0,255))end;return H..N end;local function O(H)local random={string.byte(H,1,4)}if random[1]==random[3]and random[2]==random[4]then return true end;return false end;local function unpadByteString(H)if not O(H)then return nil end;local I=putByte(string.byte(H,5),3)+putByte(string.byte(H,6),2)+putByte(string.byte(H,7),1)+putByte(string.byte(H,8),0)return string.sub(H,9,8+I)end;local function xorIV(H,iv)for s=1,16 do H[s]=bxor(H[s],iv[s])end end;local P,Q,time=os.queueEvent,coroutine.yield,os.time;local R=time()local function sleepCheckIn()local S=time()if S-R>=0.03 then R=S;P("sleep")Q("sleep")end end;return{byteParity=byteParity,getByte=getByte,putByte=putByte,bytesToInts=bytesToInts,intsToBytes=intsToBytes,bytesToHex=E,toHexString=G,padByteString=padByteString,properlyDecrypted=O,unpadByteString=unpadByteString,xorIV=xorIV,sleepCheckIn=sleepCheckIn}end)aes=a(function()local putByte=util.putByte;local getByte=util.getByte;local T='rounds'local U="type"local V=1;local W=2;local X={}local Y={}local Z={}local _={}local a0={}local a1={}local a2={}local a3={}local a4={}local a5={}local a6={0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x80000000,0x1b000000,0x36000000,0x6c000000,0xd8000000,0xab000000,0x4d000000,0x9a000000,0x2f000000}local function a7(byte)mask=0xf8;result=0;for s=1,8 do result=bit.lshift(result,1)parity=util.byteParity(bit.band(byte,mask))result=result+parity;lastbit=bit.band(mask,1)mask=bit.band(bit.rshift(mask,1),0xff)if lastbit~=0 then mask=bit.bor(mask,0x80)else mask=bit.band(mask,0x7f)end end;return bit.bxor(result,0x63)end;local function a8()for s=0,255 do if s~=0 then inverse=gf.invert(s)else inverse=s end;mapped=a7(inverse)X[s]=mapped;Y[mapped]=s end end;local function a9()for aa=0,255 do byte=X[aa]Z[aa]=putByte(gf.mul(0x03,byte),0)+putByte(byte,1)+putByte(byte,2)+putByte(gf.mul(0x02,byte),3)_[aa]=putByte(byte,0)+putByte(byte,1)+putByte(gf.mul(0x02,byte),2)+putByte(gf.mul(0x03,byte),3)a0[aa]=putByte(byte,0)+putByte(gf.mul(0x02,byte),1)+putByte(gf.mul(0x03,byte),2)+putByte(byte,3)a1[aa]=putByte(gf.mul(0x02,byte),0)+putByte(gf.mul(0x03,byte),1)+putByte(byte,2)+putByte(byte,3)end end;local function ab()for aa=0,255 do byte=Y[aa]a2[aa]=putByte(gf.mul(0x0b,byte),0)+putByte(gf.mul(0x0d,byte),1)+putByte(gf.mul(0x09,byte),2)+putByte(gf.mul(0x0e,byte),3)a3[aa]=putByte(gf.mul(0x0d,byte),0)+putByte(gf.mul(0x09,byte),1)+putByte(gf.mul(0x0e,byte),2)+putByte(gf.mul(0x0b,byte),3)a4[aa]=putByte(gf.mul(0x09,byte),0)+putByte(gf.mul(0x0e,byte),1)+putByte(gf.mul(0x0b,byte),2)+putByte(gf.mul(0x0d,byte),3)a5[aa]=putByte(gf.mul(0x0e,byte),0)+putByte(gf.mul(0x0b,byte),1)+putByte(gf.mul(0x0d,byte),2)+putByte(gf.mul(0x09,byte),3)end end;local function ac(ad)local ae=bit.band(ad,0xff000000)return bit.lshift(ad,8)+bit.rshift(ae,24)end;local function af(ad)return putByte(X[getByte(ad,0)],0)+putByte(X[getByte(ad,1)],1)+putByte(X[getByte(ad,2)],2)+putByte(X[getByte(ad,3)],3)end;local function expandEncryptionKey(ag)local ah={}local ai=math.floor(#ag/4)if ai~=4 and ai~=6 and ai~=8 or ai*4~=#ag then print("Invalid key size: ",ai)return nil end;ah[T]=ai+6;ah[U]=V;for s=0,ai-1 do ah[s]=putByte(ag[s*4+1],3)+putByte(ag[s*4+2],2)+putByte(ag[s*4+3],1)+putByte(ag[s*4+4],0)end;for s=ai,(ah[T]+1)*4-1 do local ae=ah[s-1]if s%ai==0 then ae=ac(ae)ae=af(ae)local x=math.floor(s/ai)ae=bit.bxor(ae,a6[x])elseif ai>6 and s%ai==4 then ae=af(ae)end;ah[s]=bit.bxor(ah[s-ai],ae)end;return ah end;local function aj(ad)local ak=getByte(ad,3)local al=getByte(ad,2)local am=getByte(ad,1)local an=getByte(ad,0)return putByte(gf.add(gf.add(gf.add(gf.mul(0x0b,al),gf.mul(0x0d,am)),gf.mul(0x09,an)),gf.mul(0x0e,ak)),3)+putByte(gf.add(gf.add(gf.add(gf.mul(0x0b,am),gf.mul(0x0d,an)),gf.mul(0x09,ak)),gf.mul(0x0e,al)),2)+putByte(gf.add(gf.add(gf.add(gf.mul(0x0b,an),gf.mul(0x0d,ak)),gf.mul(0x09,al)),gf.mul(0x0e,am)),1)+putByte(gf.add(gf.add(gf.add(gf.mul(0x0b,ak),gf.mul(0x0d,al)),gf.mul(0x09,am)),gf.mul(0x0e,an)),0)end;local function ao(ad)local ak=getByte(ad,3)local al=getByte(ad,2)local am=getByte(ad,1)local an=getByte(ad,0)local ap=bit.bxor(an,am)local aq=bit.bxor(al,ak)local ar=bit.bxor(ap,aq)ar=bit.bxor(ar,gf.mul(0x08,ar))w=bit.bxor(ar,gf.mul(0x04,bit.bxor(am,ak)))ar=bit.bxor(ar,gf.mul(0x04,bit.bxor(an,al)))return putByte(bit.bxor(bit.bxor(an,ar),gf.mul(0x02,bit.bxor(ak,an))),0)+putByte(bit.bxor(bit.bxor(am,w),gf.mul(0x02,ap)),1)+putByte(bit.bxor(bit.bxor(al,ar),gf.mul(0x02,bit.bxor(ak,an))),2)+putByte(bit.bxor(bit.bxor(ak,w),gf.mul(0x02,aq)),3)end;local function expandDecryptionKey(ag)local ah=expandEncryptionKey(ag)if ah==nil then return nil end;ah[U]=W;for s=4,(ah[T]+1)*4-5 do ah[s]=aj(ah[s])end;return ah end;local function as(at,ag,au)for s=0,3 do at[s]=bit.bxor(at[s],ag[au*4+s])end end;local function av(aw,ax)ax[0]=bit.bxor(bit.bxor(bit.bxor(Z[getByte(aw[0],3)],_[getByte(aw[1],2)]),a0[getByte(aw[2],1)]),a1[getByte(aw[3],0)])ax[1]=bit.bxor(bit.bxor(bit.bxor(Z[getByte(aw[1],3)],_[getByte(aw[2],2)]),a0[getByte(aw[3],1)]),a1[getByte(aw[0],0)])ax[2]=bit.bxor(bit.bxor(bit.bxor(Z[getByte(aw[2],3)],_[getByte(aw[3],2)]),a0[getByte(aw[0],1)]),a1[getByte(aw[1],0)])ax[3]=bit.bxor(bit.bxor(bit.bxor(Z[getByte(aw[3],3)],_[getByte(aw[0],2)]),a0[getByte(aw[1],1)]),a1[getByte(aw[2],0)])end;local function ay(aw,ax)ax[0]=putByte(X[getByte(aw[0],3)],3)+putByte(X[getByte(aw[1],2)],2)+putByte(X[getByte(aw[2],1)],1)+putByte(X[getByte(aw[3],0)],0)ax[1]=putByte(X[getByte(aw[1],3)],3)+putByte(X[getByte(aw[2],2)],2)+putByte(X[getByte(aw[3],1)],1)+putByte(X[getByte(aw[0],0)],0)ax[2]=putByte(X[getByte(aw[2],3)],3)+putByte(X[getByte(aw[3],2)],2)+putByte(X[getByte(aw[0],1)],1)+putByte(X[getByte(aw[1],0)],0)ax[3]=putByte(X[getByte(aw[3],3)],3)+putByte(X[getByte(aw[0],2)],2)+putByte(X[getByte(aw[1],1)],1)+putByte(X[getByte(aw[2],0)],0)end;local function az(aw,ax)ax[0]=bit.bxor(bit.bxor(bit.bxor(a2[getByte(aw[0],3)],a3[getByte(aw[3],2)]),a4[getByte(aw[2],1)]),a5[getByte(aw[1],0)])ax[1]=bit.bxor(bit.bxor(bit.bxor(a2[getByte(aw[1],3)],a3[getByte(aw[0],2)]),a4[getByte(aw[3],1)]),a5[getByte(aw[2],0)])ax[2]=bit.bxor(bit.bxor(bit.bxor(a2[getByte(aw[2],3)],a3[getByte(aw[1],2)]),a4[getByte(aw[0],1)]),a5[getByte(aw[3],0)])ax[3]=bit.bxor(bit.bxor(bit.bxor(a2[getByte(aw[3],3)],a3[getByte(aw[2],2)]),a4[getByte(aw[1],1)]),a5[getByte(aw[0],0)])end;local function aA(aw,ax)ax[0]=putByte(Y[getByte(aw[0],3)],3)+putByte(Y[getByte(aw[3],2)],2)+putByte(Y[getByte(aw[2],1)],1)+putByte(Y[getByte(aw[1],0)],0)ax[1]=putByte(Y[getByte(aw[1],3)],3)+putByte(Y[getByte(aw[0],2)],2)+putByte(Y[getByte(aw[3],1)],1)+putByte(Y[getByte(aw[2],0)],0)ax[2]=putByte(Y[getByte(aw[2],3)],3)+putByte(Y[getByte(aw[1],2)],2)+putByte(Y[getByte(aw[0],1)],1)+putByte(Y[getByte(aw[3],0)],0)ax[3]=putByte(Y[getByte(aw[3],3)],3)+putByte(Y[getByte(aw[2],2)],2)+putByte(Y[getByte(aw[1],1)],1)+putByte(Y[getByte(aw[0],0)],0)end;local function encrypt(ag,aB,aC,B,C)aC=aC or 1;B=B or{}C=C or 1;local at={}local aD={}if ag[U]~=V then print("No encryption key: ",ag[U])return end;at=util.bytesToInts(aB,aC,4)as(at,ag,0)local aE=util.sleepCheckIn;local au=1;while au<ag[T]-1 do av(at,aD)as(aD,ag,au)au=au+1;av(aD,at)as(at,ag,au)au=au+1 end;aE()av(at,aD)as(aD,ag,au)au=au+1;ay(aD,at)as(at,ag,au)return util.intsToBytes(at,B,C)end;local function decrypt(ag,aB,aC,B,C)aC=aC or 1;B=B or{}C=C or 1;local at={}local aD={}if ag[U]~=W then print("No decryption key: ",ag[U])return end;at=util.bytesToInts(aB,aC,4)as(at,ag,ag[T])local aE=util.sleepCheckIn;local au=ag[T]-1;while au>2 do az(at,aD)as(aD,ag,au)au=au-1;az(aD,at)as(at,ag,au)au=au-1;if au%32==0 then aE()end end;aE()az(at,aD)as(aD,ag,au)au=au-1;aA(aD,at)as(at,ag,au)return util.intsToBytes(at,B,C)end;a8()a9()ab()return{ROUNDS=T,KEY_TYPE=U,ENCRYPTION_KEY=V,DECRYPTION_KEY=W,expandEncryptionKey=expandEncryptionKey,expandDecryptionKey=expandDecryptionKey,encrypt=encrypt,decrypt=decrypt}end)buffer=a(function()local function new()return{}end;local function addString(aF,aG)table.insert(aF,aG)for s=#aF-1,1,-1 do if#aF[s]>#aF[s+1]then break end;aF[s]=aF[s]..table.remove(aF)end end;local function toString(aF)for s=#aF-1,1,-1 do aF[s]=aF[s]..table.remove(aF)end;return aF[1]end;return{new=new,addString=addString,toString=toString}end)ciphermode=a(function()local public={}function public.encryptString(ag,H,aH)local iv=iv or{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}local aI=aes.expandEncryptionKey(ag)local aJ=buffer.new()for s=1,#H/16 do local aK=(s-1)*16+1;local aL={string.byte(H,aK,aK+15)}aH(aI,aL,iv)buffer.addString(aJ,string.char(unpack(aL)))end;return buffer.toString(aJ)end;function public.encryptECB(aI,aL,iv)aes.encrypt(aI,aL,1,aL,1)end;function public.encryptCBC(aI,aL,iv)util.xorIV(aL,iv)aes.encrypt(aI,aL,1,aL,1)for D=1,16 do iv[D]=aL[D]end end;function public.encryptOFB(aI,aL,iv)aes.encrypt(aI,iv,1,iv,1)util.xorIV(aL,iv)end;function public.encryptCFB(aI,aL,iv)aes.encrypt(aI,iv,1,iv,1)util.xorIV(aL,iv)for D=1,16 do iv[D]=aL[D]end end;function public.decryptString(ag,H,aH)local iv=iv or{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}local aI;if aH==public.decryptOFB or aH==public.decryptCFB then aI=aes.expandEncryptionKey(ag)else aI=aes.expandDecryptionKey(ag)end;local aM=buffer.new()for s=1,#H/16 do local aK=(s-1)*16+1;local aL={string.byte(H,aK,aK+15)}iv=aH(aI,aL,iv)buffer.addString(aM,string.char(unpack(aL)))end;return buffer.toString(aM)end;function public.decryptECB(aI,aL,iv)aes.decrypt(aI,aL,1,aL,1)return iv end;function public.decryptCBC(aI,aL,iv)local aN={}for D=1,16 do aN[D]=aL[D]end;aes.decrypt(aI,aL,1,aL,1)util.xorIV(aL,iv)return aN end;function public.decryptOFB(aI,aL,iv)aes.encrypt(aI,iv,1,iv,1)util.xorIV(aL,iv)return iv end;function public.decryptCFB(aI,aL,iv)local aN={}for D=1,16 do aN[D]=aL[D]end;aes.encrypt(aI,iv,1,iv,1)util.xorIV(aL,iv)return aN end;return public end)AES128=16;AES192=24;AES256=32;ECBMODE=1;CBCMODE=2;OFBMODE=3;CFBMODE=4;local function aO(aP,aQ)local aR=aQ;if aQ==AES192 then aR=32 end;if aR>#aP then local aS=""for s=1,aR-#aP do aS=aS..string.char(0)end;aP=aP..aS else aP=string.sub(aP,1,aR)end;local aT={string.byte(aP,1,#aP)}aP=ciphermode.encryptString(aT,aP,ciphermode.encryptCBC)aP=string.sub(aP,1,aQ)return{string.byte(aP,1,#aP)}end;function encrypt(aP,H,aQ,aU)assert(aP~=nil,"Empty password.")assert(aP~=nil,"Empty data.")local aU=aU or CBCMODE;local aQ=aQ or AES128;local ag=aO(aP,aQ)local aV=util.padByteString(H)if aU==ECBMODE then return ciphermode.encryptString(ag,aV,ciphermode.encryptECB)elseif aU==CBCMODE then return ciphermode.encryptString(ag,aV,ciphermode.encryptCBC)elseif aU==OFBMODE then return ciphermode.encryptString(ag,aV,ciphermode.encryptOFB)elseif aU==CFBMODE then return ciphermode.encryptString(ag,aV,ciphermode.encryptCFB)else return nil end end;function decrypt(aP,H,aQ,aU)local aU=aU or CBCMODE;local aQ=aQ or AES128;local ag=aO(aP,aQ)local aW;if aU==ECBMODE then aW=ciphermode.decryptString(ag,H,ciphermode.decryptECB)elseif aU==CBCMODE then aW=ciphermode.decryptString(ag,H,ciphermode.decryptCBC)elseif aU==OFBMODE then aW=ciphermode.decryptString(ag,H,ciphermode.decryptOFB)elseif aU==CFBMODE then aW=ciphermode.decryptString(ag,H,ciphermode.decryptCFB)end;result=util.unpadByteString(aW)if result==nil then return nil end;return result end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement