below is the problematic code of AES encryption with Base64 output.
The problem seems to be with AES part. when #PB_Cipher_ECB is used then it can be somehow make it nearly correct output by catching header and footer of data but otherwise the output is truncated and in both cases some trash data is added at end.
Here is the code itself:
Code: Select all
;{ bAES64
#hidrPAData = "#@!$%^&*()"
#futrPAData = "(*&^%$!@#"
#bAES64enc = 64
Procedure VectoriSalt(*salt, szalt)
Protected lup
If szalt > 0 And MemorySize(*salt) >= szalt
For lup = 0 To szalt - 1
PokeA(*salt + lup, Random(255,0))
Next
EndIf
EndProcedure
Procedure aesNCoder(*inData, Bits = 256, *K = 0, *Vector = 0)
Protected szIn = MemorySize(*inData), RET = #False
If *K = 0
*K = ?Key
EndIf
If *Vector = 0
*Vector = ?InitializationVector
EndIf
Define *outData = AllocateMemory(szIn)
If *outData
If AESEncoder(*inData, *outData, szIn, *K, Bits, *Vector, #PB_Cipher_ECB) ; *
Protected *tmp = AllocateMemory(szIn)
If *tmp
If AESDecoder(*outData, *tmp, szIn, *K, Bits, *Vector, #PB_Cipher_ECB) ; *
If CompareMemory(*inData, *tmp, szIn)
RET = *outData
Debug "1 " + szIn
EndIf
EndIf
FreeMemory(*tmp)
EndIf
EndIf
If RET = 0
FreeMemory(*outData)
EndIf
EndIf
ProcedureReturn RET
DataSection
Key:
Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
InitializationVector:
Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
EndProcedure
Procedure aesDCoder(*inData, Bits = 256, *K = 0, *Vector = 0)
Protected szIn = MemorySize(*inData), RET = #False
If *K = 0
*K = ?Key
EndIf
If *Vector = 0
*Vector = ?InitializationVector
EndIf
Define *outData = AllocateMemory(szIn)
If *outData
If AESDecoder(*inData, *outData, szIn, *K, Bits, *Vector, #PB_Cipher_ECB) ;*
*tmp = AllocateMemory(szIn)
If *tmp
If AESEncoder(*outData, *tmp, szIn, *K, Bits, *Vector, #PB_Cipher_ECB) ;*
If CompareMemory(*inData, *tmp, szIn)
RET = *outData
Debug "2 " + szIn
EndIf
EndIf
FreeMemory(*tmp)
EndIf
EndIf
If RET = 0
FreeMemory(*outData)
EndIf
EndIf
ProcedureReturn RET
DataSection
Key:
Data.b $06, $a9, $21, $40, $36, $b8, $a1, $5b, $51, $2e, $03, $d5, $34, $12, $00, $06
InitializationVector:
Data.b $3d, $af, $ba, $42, $9d, $9e, $b4, $30, $b4, $22, $da, $80, $2c, $9f, $ac, $41
EndDataSection
EndProcedure
Procedure bAES64enc(*inData, Bits = 256, *K = 0, *Vector = 0) ;inData - BinaryMem, outData - AESEnc&BasedEncMem
Protected szIn = MemorySize(*inData), RET = #False
Protected paDataLen = StringByteLength(#hidrPAData + #futrPAData, #PB_UTF8),
hidrLen = StringByteLength(#hidrPAData, #PB_UTF8),
futrLen = StringByteLength(#futrPAData, #PB_UTF8),
szinPAData = szIn + paDataLen
Protected *tmp = AllocateMemory(szinPAData)
If *tmp
PokeS(*tmp, #hidrPAData, hidrLen, #PB_UTF8|#PB_String_NoZero)
CopyMemory(*inData, *tmp + hidrLen, szIn)
PokeS(*tmp + hidrLen + szIn, #futrPAData, futrLen, #PB_UTF8|#PB_String_NoZero)
ShowMemoryViewer(*tmp, szinPAData)
CallDebugger
Define *AESenc = aesNCoder(*tmp, Bits, *K, *Vector)
If *AESenc
Protected szAESenc = MemorySize(*AESenc)
ShowMemoryViewer(*AESenc, szAESenc)
CallDebugger
*AESdecmp = aesDCoder(*AESenc, Bits, *K, *Vector)
If *AESdecmp
Protected szAESdecmp = MemorySize(*AESdecmp)
If szAESdecmp = szAESenc And CompareMemory(*AESdecmp, *tmp, szAESenc)
Protected BAESData$ = Base64Encoder(*AESenc, szinPAData, #PB_Cipher_NoPadding|#PB_Cipher_URL), szBAESData = StringByteLength(BAESData$, #PB_UTF8)
Debug BAESData$
Protected *bAESdecmp = AllocateMemory(szBAESData)
If *bAESdecmp
Protected szoutData = Base64Decoder(BAESData$, *bAESdecmp, szBAESData*2)
If CompareMemory(*bAESdecmp, *AESenc, szoutData) <> 0
Protected szbAESenc = StringByteLength(BAESData$, #PB_UTF8)
Protected *bAESenc = AllocateMemory(szbAESenc)
If *bAESenc
PokeS(*bAESenc, BAESData$, szbAESenc, #PB_UTF8|#PB_String_NoZero)
ShowMemoryViewer(*bAESenc, szbAESenc)
CallDebugger
RET = *bAESenc
Debug "3 " + szbAESenc
EndIf
EndIf
FreeMemory(*bAESdecmp)
EndIf
EndIf
FreeMemory(*AESdecmp)
EndIf
FreeMemory(*AESenc)
EndIf
FreeMemory(*tmp)
EndIf
ProcedureReturn RET
EndProcedure
Procedure bAES64dec(*inData, Bits = 256, *K = 0, *Vector = 0) ;inData - BasedMem, outData - BaseDec&AESDecMem
Protected szIn = MemorySize(*inData), RET = #False
ShowMemoryViewer(*inData, szIn)
CallDebugger
Protected paDataLen = StringByteLength(#hidrPAData + #futrPAData, #PB_UTF8),
hidrLen = StringByteLength(#hidrPAData, #PB_UTF8),
futrLen = StringByteLength(#futrPAData, #PB_UTF8),
szinPAData = szIn + paDataLen
Protected inData$ = PeekS(*inData, szIn, #PB_UTF8), szInData = StringByteLength(inData$, #PB_UTF8)
Protected *bAESdec = AllocateMemory(szInData)
If *bAESdec
Protected szoutData = Base64Decoder(inData$, *bAESdec, szInData*2)
If szoutData > 0
ShowMemoryViewer(*bAESdec, szoutData)
CallDebugger
Protected Base64Data$ = Base64Encoder(*bAESdec, szoutData, #PB_Cipher_NoPadding|#PB_Cipher_URL), szBase64Data = StringByteLength(Base64Data$, #PB_UTF8)
If inData$ = Base64Data$
Protected *AESdec = aesDCoder(*bAESdec, Bits, *K, *Vector)
If *AESdec
Protected szAESdec = MemorySize(*AESdec)
Protected *AESenc = aesNCoder(*AESdec, Bits, *K, *Vector)
If *AESenc
Protected szAESenc = MemorySize(*AESenc)
If CompareMemory(*AESenc, *bAESdec, szoutData)
Protected tmpHidr.s = PeekS(*AESdec, hidrLen, #PB_UTF8), tmpFutr.s = PeekS(*AESdec + szAESdec - futrLen, futrLen, #PB_UTF8)
If tmpHidr = #hidrPAData And tmpFutr = #futrPAData
Protected szRawData = szAESdec - paDataLen
Define *rawData = AllocateMemory(szRawData)
If *rawData
CopyMemory(*AESdec + hidrLen, *rawData, szRawData)
RET = *rawData
Debug "6 " + szRawData
EndIf
EndIf
ShowMemoryViewer(*AESdec, szoutData+100)
CallDebugger
EndIf
FreeMemory(*AESenc)
EndIf
FreeMemory(*AESdec)
EndIf
EndIf
EndIf
FreeMemory(*bAESdec)
EndIf
ProcedureReturn RET
EndProcedure
Procedure.s bAES64enxtring(rawString.s, Bits = 256, *K = 0, *Vector = 0) ;inData - BinaryMem, outData - AESEnc&BasedEncMem
Protected RET.s = ""
If rawString <> ""
Protected szrawString = StringByteLength(rawString, #PB_UTF8)
Protected *rawData = AllocateMemory(szrawString)
If *rawData
PokeS(*rawData, rawString, szrawString, #PB_UTF8|#PB_String_NoZero)
Protected szRawData = MemorySize(*rawData)
Protected *BAESenc = bAES64enc(*rawData, Bits, *K, *Vector)
If *BAESenc
Protected szBAESenc = MemorySize(*BAESenc)
Protected BAESenc$ = PeekS(*BAESenc, szBAESenc, #PB_UTF8)
Protected *BAESdecmp = bAES64dec(*BAESenc, Bits, *K, *Vector)
If *BAESdecmp
Protected szBAESdec = MemorySize(*BAESdecmp)
If szBAESdec = szRawData And CompareMemory(*BAESdecmp, *rawData, szRawData)
RET = BAESenc$
EndIf
FreeMemory(*BAESdecmp)
EndIf
FreeMemory(*BAESenc)
EndIf
FreeMemory(*rawData)
EndIf
EndIf
ProcedureReturn RET
EndProcedure
Procedure.s bAES64dextring(BAESenc.s, Bits = 256, *K = 0, *Vector = 0) ;inData - BasedMem, outData - BaseDec&AESDecMem
Protected RET.s = ""
If BAESenc <> ""
Protected szBAESenc = StringByteLength(BAESenc, #PB_UTF8)
Protected *BAESenc = AllocateMemory(szBAESenc)
If *BAESenc
PokeS(*BAESenc, BAESenc, szBAESenc, #PB_UTF8|#PB_String_NoZero)
Protected szBAESencData = MemorySize(*BAESenc)
Protected *BAESdec = bAES64dec(*BAESenc, Bits, *K, *Vector)
If *BAESdec
Protected szBAESdec = MemorySize(*BAESdec)
BAESdec.s = PeekS(*BAESdec, szBAESdec, #PB_UTF8)
Protected *BAESencmp = bAES64enc(*BAESdec, Bits, *K, *Vector)
If *BAESencmp
Protected szBAESencmp = MemorySize(*BAESencmp)
If szBAESencmp = szBAESencData And CompareMemory(*BAESencmp, *BAESenc, szBAESencmp)
RET = BAESdec
EndIf
FreeMemory(*BAESencmp)
EndIf
FreeMemory(*BAESdec)
EndIf
FreeMemory(*BAESenc)
EndIf
EndIf
ProcedureReturn RET
EndProcedure
;}
mystr.s = "somestring"
enxtr.s = bAES64enxtring(mystr)
dextr.s = bAES64dextring(enxtr)
Debug "enx: " + enxtr
End