I think this one should be very secure, at least I will challenge anyone here to make an algorithm to retrieve keys from encrypted files, good luck!

Code: Select all
;Joakim's Encryption Algorithm v1 (JEA1)
;
;I am no encryption expert but I tried to make an algorithm
;which is simple and will make fetching the key impossible.
EnableExplicit
Structure JEA1_state ;a structure to keep the current state
encrypt.l ;wheter to encrypt or decrypt
key.l ;pointer to key
keyLen.l ;length of key
randomSeed.l ;status of seed
keyPos.l ;status of key pos
EndStructure
Procedure.l JEA1_random(seed.l) ;used for random number generation
Protected rnd_w.l, rnd_z.l
rnd_w = seed: rnd_z = seed+1 ;this can be experimented with
rnd_z = 36969 * (rnd_z & 65535) + (rnd_z >> 16)
rnd_w = 18000 * (rnd_w & 65535) + (rnd_w >> 16)
ProcedureReturn (rnd_z << 16) + rnd_w; /* 32-bit result */
EndProcedure
Procedure JEA1_start(*key,keyLen,encrypt,*state.JEA1_state) ;reset encryption state
Protected keyPos
*state\key = *key
*state\keyLen = keyLen
*state\encrypt = encrypt
*state\randomSeed = 0
For keyPos=0 To keyLen
*state\randomSeed + JEA1_random(*state\randomSeed+PeekB(*key+keyPos)+1)
Next
*state\keyPos = 0
EndProcedure
Procedure JEA1_crypt(*mem,memLen.i,*state.JEA1_state) ;process memory block
Protected memPos.i, randomByte.b, byteRead.b
For memPos=0 To memLen-1
byteRead = PeekB(*mem+memPos)
randomByte = JEA1_random(*state\randomSeed) >> 16
PokeB(*mem+memPos,byteRead!randomByte)
If *state\encrypt
*state\randomSeed + JEA1_random(*state\randomSeed+PeekB(*state\key+*state\keyPos)+byteRead)
Else
*state\randomSeed + JEA1_random(*state\randomSeed+PeekB(*state\key+*state\keyPos)+byteRead!randomByte)
EndIf
*state\keyPos + 1
If *state\keyPos > *state\keyLen: *state\keyPos = 0: EndIf
Next
EndProcedure
Procedure JEA1_cryptFile(*key,keyLen,file$,encrypt=1,fileBufferSize=4096)
Protected result=#True,file,filePos.q,fileLen.q,*fileBuffer,bytesRead,state.JEA1_state
file = OpenFile(#PB_Any,file$)
If file
fileLen = Lof(file)
If fileBufferSize > fileLen: fileBufferSize = fileLen: EndIf
FileBuffersSize(file,0) ;we use our own buffer
*fileBuffer = AllocateMemory(fileBufferSize)
JEA1_start(*key,keyLen,encrypt,@state)
Repeat
bytesRead = ReadData(file,*fileBuffer,fileBufferSize) ;at end bytesRead <= fileBufferSize
If bytesRead
JEA1_crypt(*fileBuffer,bytesRead,@state)
FileSeek(file,filePos) ;seek back
WriteData(file,*fileBuffer,bytesRead)
filePos + bytesRead
Else
result = #False: Break
EndIf
Until filePos = fileLen
FreeMemory(*fileBuffer)
CloseFile(file)
Else
result = #False
EndIf
ProcedureReturn result
EndProcedure
Code: Select all
;Example of use
Procedure JEA1_cryptMemory(password$,*memory,size,encrypt) ;here we use a string as key
Protected state.JEA1_state
JEA1_start(@password$,Len(password$),encrypt,@state)
JEA1_crypt(*memory,size,@state)
EndProcedure
Procedure.s memoryToHex(address,length) ;returns a string containing the hex representation of a memory area
Protected result$, i
For i=0 To length-1
result$ + RSet(Hex(PeekB(address+i),#PB_Byte),2,"0");+" "
Next
ProcedureReturn RTrim(result$)
EndProcedure
Define string1$ = "hello encryption world!"
Define string1Length = Len(string1$)
Define string2$ = "Hello encryption world!" ;notice the small difference?
Define string2Length = Len(string2$)
JEA1_cryptMemory("password",@string1$,string1Length,1)
Debug memoryToHex(@string1$,string1Length)+" / "+string1$
JEA1_cryptMemory("password",@string2$,string2Length,1)
Debug memoryToHex(@string2$,string2Length)+" / "+string2$ ;notice the big difference?
JEA1_cryptMemory("password",@string1$,string1Length,0)
Debug string1$
JEA1_cryptMemory("password",@string2$,string2Length,0)
Debug string2$
;Now something funny
JEA1_cryptMemory("password",@string1$,string1Length,0) ;See what I did?
Debug memoryToHex(@string1$,string1Length)+" / "+string1$
JEA1_cryptMemory("password",@string1$,string1Length,1) ;A hint: this was 0 before
Debug string2$
End
JEA1_cryptFile(@"hello world",11,OpenFileRequester("","","",0),1)