Mesh Encryption

BlitzMax Forums/MiniB3D Module/Mesh Encryption

BLaBZ(Posted 2013) [#1]
I'm trying to load a RC4 encrypted .b3d file from a bank.

In TModel.bmx, the LoadAnimB3D method opens a stream like this -
file=OpenStream("littleendian::"+f_name$)


My modification is as follows -
'check for rc4 encryption
		If ExtractExt(f_name$).ToLower() = "b3dx"
			Local decrypted:String = RC4(LoadText(f_name$),RC4Key)
			Local bnk:TBank = LoadBank(decrypted)
			file=LittleEndianStream(CreateBankStream(bnk))
		Else
			file=OpenStream("littleendian::"+f_name$)
		EndIf


the RC4 method -
	Function RC4:String(inp:String, key:String)
	    Local S:Int[512 + Ceil(inp.Length *.55)]
	    Local i%, j%, t%, x%
	    Local outbuf@@ Ptr = Short Ptr(Varptr s[512])
	    
	    j = 0
	    For i = 0 To 255
	        S[i] = i
	        If j > (Key.length-1) Then
	            j = 0
	        EndIf
	        S[256+i] = key[j]&$ff
	        j:+ 1
	    Next
	    
	    j = 0
	    For i = 0 To 255
	        j = (j + S[i] + S[256+i]) & $ff
	        t = S[i]
	        S[i] = S[j]
	        S[j] = t
	    Next
	    
	    i = 0
	    j = 0
	    For Local x% = 0 To inp.Length-1
	        i = (i + 1) & $ff
	        j = (j + S[i]) & $ff
	        t = S[i]
	        S[i] = S[j]
	        S[j] = t
	        t = (S[i] + S[j]) & $ff
	        outbuf[x] = (inp[x] ~ S[t])
	    Next
	    
	    Return String.FromShorts(outbuf, inp.Length)
	End Function


I've been wrestling with this all day and just can't seem to get it working :/


BLaBZ(Posted 2013) [#2]
Got this to work, don't understand it but here it is:

Local decrypted:String = RC4(LoadText(f_name$),RC4Key)
			Local bnk:TBank = New TBank
			Local bnkStr:TBankStream = TBankStream.Create(bnk)
			bnkStr.WriteBytes(decrypted.ToCString(),decrypted.length)
			file=LittleEndianStream(CreateBankStream(bnk))