; **************************************************************************** ; * By PBFrance : http://www.pbfrance.com/?url=source&cmd=viewer&val=73 ; **************************************************************************** Procedure.i _EncBuffer(*input_, *Output) If (MemorySize(*input_) >= 16) And (MemorySize(*input_) = MemorySize(*Output)) If AESEncoder(*input_, *Output, MemorySize(*input_), ?ENC_Key, 256, ?ENC_InitVect, #PB_Cipher_CBC) ProcedureReturn #True EndIf EndIf ProcedureReturn #False ; AES cant encrypt a memory block with size < 16 EndProcedure Procedure.i _DecBuffer(*input_, *Output) If (MemorySize(*input_) >= 16) And (MemorySize(*input_) = MemorySize(*Output)) If AESDecoder(*input_, *Output, MemorySize(*input_), ?ENC_Key, 256, ?ENC_InitVect, #PB_Cipher_CBC) ProcedureReturn #True EndIf EndIf ProcedureReturn #False ; AES cant encrypt a memory block with size < 16 EndProcedure Procedure.s EncString(in.s) Protected paddStr.s, wrd.s, out.s, *p, *mb0, *mb1, *mb2, n0, n1, n2 If in = "" : ProcedureReturn "" : EndIf Restore ENC_PaddingB64 Read.s paddStr ; we always padd as input_ could be too short n0 = StringByteLength(paddStr) + StringByteLength(in) + SizeOf(Character) *mb0 = AllocateMemory(n0) : *p = *mb0 CopyMemoryString(@paddStr, @*p) CopyMemoryString(@in) ; encrypting using AES n1 = n0 *mb1 = AllocateMemory(n1) _EncBuffer(*mb0, *mb1) ; encoding encrypted buffer using Base64 to mask \0 if any (needed for PeekS()) n2 = n1 * 1.4 *mb2 = AllocateMemory(n2) Base64Encoder(*mb1, n1, *mb2, n2) ; encrypted buffer is now ready for PeekS() out = PeekS(*mb2) FreeMemory(*mb0) FreeMemory(*mb1) FreeMemory(*mb2) ProcedureReturn out EndProcedure Procedure.s DecString(in.s) ; decrypts a string encrypted with EncString() Protected paddStr.s, wrd.s, out.s, *mb1, *mb2, n0, n1, n2 If in = "" : ProcedureReturn "" : EndIf ; decode encrypted string using Base64 --> encrypted-buffer n0 = StringByteLength(in) *mb1 = AllocateMemory(n0) n1 = Base64Decoder(@in, n0, *mb1, n0) *mb1 = ReAllocateMemory(*mb1, n1) ; adjust size fo encrypted-buffer! n2 = n1 *mb2 = AllocateMemory(n2) _DecBuffer(*mb1, *mb2) wrd = PeekS(*mb2) Restore ENC_PaddingB64 Read.s paddStr If Mid(wrd, 1, Len(paddStr)) = paddStr out = Mid(wrd, Len(paddStr)+1) EndIf FreeMemory(*mb1) FreeMemory(*mb2) ProcedureReturn out EndProcedure str$="Bonjour tout le monde" Debug EncString(str$) Debug decstring(EncString(str$)) DataSection ENC_Key: Data.s "7j#bJT+IJAYeQP86Vp6ewa8YxfBHRR*j" ; Clé de cryptage ENC_InitVect: Data.b $8C,$0D,$4E,$ED,$67,$96,$FB,$F0,$D3,$72,$87,$35,$3E,$BE,$42,$A2 ; Vecteur d'initialisation ENC_PaddingB64: Data.s "c1e39477b19d95223577a457960959be693060b0c683ec7aaf127d87807c6e02" EndDataSection