bb to bmx? could use some help with this
BlitzMax Forums/BlitzMax Programming/bb to bmx? could use some help with this
| ||
Could you guys help get the code correct?
Local key$="eje3ii44994594540"
EncryptFile("original.txt","encrypted.txt",key$)
DecryptFile("encrypted.txt","decrypted.txt",key$)
Function EncryptFile(in$,out$,k$)
Local filein:TStream = ReadFile(in$)
Local fileout:TStream = WriteFile(out$)
Local s$=""
While Not Eof(filein)
s$=s$+Chr(ReadByte( filein ))
Wend
Local backwards:Int=False
Local i
Local c$
Local a
Local j
Local kc$
Local ka
Local enc
For i%=1 To Len (s$)
c$=Mid(s$,i%,1)
a%=Asc(c$)
j%=i%
While j%>Len(k$)
j%=j%-Len(k$)
Wend
If backwards Then j%=Len(k$)-j%+1
If j=1 Then backwards=False
If j=Len(k) Then backwards=True
kc$=Mid(k$,j%,1)
ka%=Asc(kc$)
enc%=ka%+a%
WriteShort(fileout,enc)
Next
CloseFile filein
CloseFile fileout
End Function
Function DecryptFile(in$,out$,k$)
Local filein:TStream = ReadFile(in$)
Local fileout:TStream = WriteFile(out$)
Local backwards:Int=False
While Not Eof(filein)
Local i
Local s$
Local enc
Local j
Local kc$
Local ka
Local k
Local a
i=i+1
s$=s$+Chr(ReadByte( filein ))
enc%=ReadShort(filein)
j%=i%
While j%>Len(k$)
j%=j%-Len(k$)
Wend
If backwards Then j%=Len(k$)-j%+1
If j=1 Then backwards=False
If j=Len(k) Then backwards=True
kc$=Mid(k$,j%,1)
ka%=Asc(kc$)
a%=enc%-ka%
WriteByte fileout,a%
Wend
CloseFile filein
CloseFile fileout
End Function
|
| ||
Found some usable code for you on the forums:
Local key:String = "12345678"
Local filepath:String = "original.txt"
'create original.txt file if it does not exist
If (FileType(filepath) <> 1)
Local fh:TStream = WriteStream(filepath)
fh.WriteLine("abcdefghijklmnopqrstuvwxyz")
fh.Close()
EndIf
'encrypt
Local encrypted:TBank = Cipher.Encrypt (LoadBank(filepath), key)
encrypted.Save("encrypted.txt")
'decrypt
Local decrypted:TBank = Cipher.Decrypt (LoadBank("encrypted.txt"), key)
decrypted.Save("decrypted.txt")
Type Cipher
Function Encrypt:TBank(Bank:TBank, Key:String)
Local t:Int = 10, n:Int, ki:Int
Local Out:TBank = CreateBank(Bank.Size())
Local inptr:Byte Ptr = BankBuf(Bank)
Local outptr:Byte Ptr = BankBuf(Out)
For n=0 Until key.length
Select n Mod 2
Case 0 ; t:*key[n]
Case 1 ; t:+key[n]
EndSelect
t:Mod 360
Next
For n=0 Until Bank.Size()
outptr[n]=inptr[n]+Floor(Cos(t)*255)
t:+(inptr[n]*key[ki])+n
t:Mod 360+inptr[n]
ki:+1
If ki=>key.length ki=0
Next
Return Out
EndFunction
Function Decrypt:TBank(Bank:TBank, Key:String)
Local t:Int=10, n:Int, ki:Int
Local Out:TBank = CreateBank(Bank.Size())
Local inptr:Byte Ptr = BankBuf(Bank)
Local outptr:Byte Ptr = BankBuf(Out)
For n=0 Until key.length
Select n Mod 2
Case 0 ; t:*key[n]
Case 1 ; t:+key[n]
EndSelect
t:Mod 360
Next
For n=0 Until Bank.Size()
outptr[n]=inptr[n]-Floor(Cos(t)*255)
t:+(outptr[n]*key[ki])+n
t:Mod 360+outptr[n]
ki:+1
If ki=>key.length ki=0
Next
Return Out
EndFunction
EndType
|
| ||
| The code itself basically works (I just had to comment out the duplicate identifier 'k', which is passed as a parameter), but for whatever reason, it crashes while decrypting, on the ReadShort line -- presumably passing the end of the file, so it seems more of a logic error than any problem with your conversion. Can't really tell what it's meant to be doing, though, so can't help with that! I tried adding an Eof () check to the ReadByte and ReadString lines, which runs, but produces garbage in the output file. |
| ||
| Reads in DecryptFile must match up with writes in EncryptFile. You write a Short but try to read back a Byte and a Short. |