Tiny Encryption Algorithm - Module
Posted: Tue May 26, 2015 12:18 am
Hello everyone,
A simple Tiny Encryption Algorithm module for light encryption duty. I'm also working on the XTEA or eXtended Tiny Encryption Algorithm version, I will post it here as soon as I can make it to work !
Have fun !
A simple Tiny Encryption Algorithm module for light encryption duty. I'm also working on the XTEA or eXtended Tiny Encryption Algorithm version, I will post it here as soon as I can make it to work !
Have fun !
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : TinyEncryptionAlgorithm - Module
; File Name : TinyEncryptionAlgorithm - Module.pb
; File version: 1.1.0
; Programming : OK
; Programmed by : StarBootics
; Date : 24-05-2015
; Last Update : 25-05-2015
; PureBasic code : V5.31
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DeclareModule TEA
Declare.s Encrypt(Key.s, Message.s)
Declare.s Decrypt(Key.s, Message.s)
EndDeclareModule
Module TEA
Structure Chars
CompilerIf #PB_Compiler_Unicode
Values.u[4]
CompilerElse
Values.a[8]
CompilerEndIf
EndStructure
Structure Key
Values.l[4]
EndStructure
Structure Block
Values.l[2]
EndStructure
#DELTA = 2654435769
Procedure Private_Encrypt(*Key.Key, *Block.Block)
Sum.l = 0
For RoundID = 0 To 31
Sum + #DELTA
*Block\Values[0] + ((*Block\Values[1] << 4) + *Key\Values[0]) ! (*Block\Values[1] + Sum) ! ((*Block\Values[1] >> 5) + *Key\Values[1])
*Block\Values[1] + ((*Block\Values[0] << 4) + *Key\Values[2]) ! (*Block\Values[0] + Sum) ! ((*Block\Values[0] >> 5) + *Key\Values[3])
Next
EndProcedure
Procedure Private_Decrypt(*Key.Key, *Block.Block)
Sum.l = $C6EF3720
For RoundID = 0 To 31
*Block\Values[1] - ((*Block\Values[0] << 4) + *Key\Values[2]) ! (*Block\Values[0] + Sum) ! ((*Block\Values[0] >> 5) + *Key\Values[3])
*Block\Values[0] - ((*Block\Values[1] << 4) + *Key\Values[0]) ! (*Block\Values[1] + Sum) ! ((*Block\Values[1] >> 5) + *Key\Values[1])
Sum - #DELTA
Next
EndProcedure
Procedure.s Encrypt(Key.s, Message.s)
Protected Block.Block, Keys.Key
Keys\Values[0] = Asc(Mid(Key, 1, 1))
Keys\Values[1] = Asc(Mid(Key, 2, 1))
Keys\Values[2] = Asc(Mid(Key, 3, 1))
Keys\Values[3] = Asc(Mid(Key, 4, 1))
*Ptr_Message.Chars = @Message
CharMax = Len(Message)
CompilerIf #PB_Compiler_Unicode
For CharID = 1 To CharMax Step 4
Block\Values[0] = *Ptr_Message\Values[0] << 16 | *Ptr_Message\Values[1]
Block\Values[1] = *Ptr_Message\Values[2] << 16 | *Ptr_Message\Values[3]
*Ptr_Message + SizeOf(Chars)
Private_Encrypt(Keys, Block)
Output.s + Chr((Block\Values[0] >> 16) & $FFFF)
Output.s + Chr(Block\Values[0] & $FFFF)
Output.s + Chr((Block\Values[1] >> 16) & $FFFF)
Output.s + Chr(Block\Values[1] & $FFFF)
Next
CompilerElse
For CharID = 1 To CharMax Step 8
Block\Values[0] = *Ptr_Message\Values[0] << 24 + *Ptr_Message\Values[1] << 16 + *Ptr_Message\Values[2] << 8 + *Ptr_Message\Values[3]
Block\Values[1] = *Ptr_Message\Values[4] << 24 + *Ptr_Message\Values[5] << 16 + *Ptr_Message\Values[6] << 8 + *Ptr_Message\Values[7]
*Ptr_Message + SizeOf(Chars)
Private_Encrypt(Keys, Block)
Output.s + Chr(Block\Values[0] >> 24 & $FF)
Output.s + Chr(Block\Values[0] >> 16 & $FF)
Output.s + Chr(Block\Values[0] >> 8 & $FF)
Output.s + Chr(Block\Values[0] & $FF)
Output.s + Chr(Block\Values[1] >> 24 & $FF)
Output.s + Chr(Block\Values[1] >> 16 & $FF)
Output.s + Chr(Block\Values[1] >> 8 & $FF)
Output.s + Chr(Block\Values[1] & $FF)
Next
CompilerEndIf
ProcedureReturn Output
EndProcedure
Procedure.s Decrypt(Key.s, Message.s)
Protected Block.Block, Keys.Key
Keys\Values[0] = Asc(Mid(Key, 1, 1))
Keys\Values[1] = Asc(Mid(Key, 2, 1))
Keys\Values[2] = Asc(Mid(Key, 3, 1))
Keys\Values[3] = Asc(Mid(Key, 4, 1))
*Ptr_Message.Chars = @Message
CharMax = Len(Message)
CompilerIf #PB_Compiler_Unicode
For CharID = 1 To CharMax Step 4
Block\Values[0] = *Ptr_Message\Values[0] << 16 | *Ptr_Message\Values[1]
Block\Values[1] = *Ptr_Message\Values[2] << 16 | *Ptr_Message\Values[3]
*Ptr_Message + SizeOf(Chars)
Private_Decrypt(Keys, Block)
Output.s + Chr((Block\Values[0] >> 16) & $FFFF)
Output.s + Chr(Block\Values[0] & $FFFF)
Output.s + Chr((Block\Values[1] >> 16) & $FFFF)
Output.s + Chr(Block\Values[1] & $FFFF)
Next
CompilerElse
For CharID = 1 To CharMax Step 8
Block\Values[0] = *Ptr_Message\Values[0] << 24 + *Ptr_Message\Values[1] << 16 + *Ptr_Message\Values[2] << 8 + *Ptr_Message\Values[3]
Block\Values[1] = *Ptr_Message\Values[4] << 24 + *Ptr_Message\Values[5] << 16 + *Ptr_Message\Values[6] << 8 + *Ptr_Message\Values[7]
*Ptr_Message + SizeOf(Chars)
Private_Decrypt(Keys, Block)
Output.s + Chr(Block\Values[0] >> 24 & $FF)
Output.s + Chr(Block\Values[0] >> 16 & $FF)
Output.s + Chr(Block\Values[0] >> 8 & $FF)
Output.s + Chr(Block\Values[0] & $FF)
Output.s + Chr(Block\Values[1] >> 24 & $FF)
Output.s + Chr(Block\Values[1] >> 16 & $FF)
Output.s + Chr(Block\Values[1] >> 8 & $FF)
Output.s + Chr(Block\Values[1] & $FF)
Next
CompilerEndIf
ProcedureReturn Output
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
Encrypted.s = TEA::Encrypt("PURE", "PureBasic V5.31")
Decrypted.s = TEA::Decrypt("PURE", Encrypted)
; Debug Encrypted
; Debug Decrypted
MessageRequester("TEA Encrypt", Encrypted)
MessageRequester("TEA Decrypt", Decrypted)
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<