Hello.
I am fail a Decrypt.
i need AES128 with fixed Key & IV. no SALT.
so, i customize UsageSample's AES256CBC Encrypt & Decrypt function like bottom.
my Encrypt function work very well. i confirm it make same result as my partner's result.
but, my Decrypt function always raise error. not wrong result, just can not make result.
(Key & IV is 16Character like '1234567890123456')
if original PlainText length < 32 then raise EDataLengthCryptoLibException.
(FbufOff <> blockSize(16) at TPaddedBufferedBlockCipher.Create)
if original PlainText length >= 32 then raise EInvalidCipherTextCryptoLibException.
(input array's Last is 0 or over16 at TPkcs7Padding.PadCount)
(decrypt function's input is cipheredText)
what is my mistake? what needs to be fixed?
------------------------------- my source code ( i don't know how make box, sorry) ----------------------
unit XorelCrypt;
interface
uses
System.SysUtils,
ClpIParametersWithIV, ClpIBufferedCipher, ClpCipherUtilities, ClpParametersWithIV,
ClpParameterUtilities, ClpConverters, ClpEncoders;
function XorelAESEncrypt( sPlain, sKey, sIV : string; out vCypher:string): boolean;
function XorelAESDecrypt( sCipher, sKey, sIV : string; out sPlain: string): Boolean;
implementation
function XorelAESEncrypt(sPlain, sKey, sIV: string; out vCypher:string): boolean;
var
PlainBytes, KeyBytes, IVBytes, BufBytes: TBytes;
KeyParametersWithIV: IParametersWithIV;
cipher: IBufferedCipher;
LBlockSize, LBufStart, Count: Int32;
begin
result := False;
vCypher := '';
PlainBytes := TConverters.ConvertStringToBytes( sPlain, TEncoding.UTF8);
KeyBytes := TConverters.ConvertStringToBytes( sKey, TEncoding.UTF8);
IVBytes := TConverters.ConvertStringToBytes( sIV, TEncoding.UTF8);
// remove Get Key & IV because it is Fixed.
cipher := TCipherUtilities.GetCipher('AES/CBC/PKCS7PADDING');
KeyParametersWithIV := TParametersWithIV.Create
(TParameterUtilities.CreateKeyParameter('AES', KeyBytes), IVBytes);
cipher.Init(True, KeyParametersWithIV); // init encryption cipher
LBlockSize := cipher.GetBlockSize;
System.SetLength(BufBytes, System.Length(PlainBytes) + LBlockSize);
LBufStart := 0;
Count := cipher.ProcessBytes(PlainBytes, 0, System.Length(PlainBytes), BufBytes,
LBufStart);
System.Inc(LBufStart, Count);
Count := cipher.DoFinal(BufBytes, LBufStart);
System.Inc(LBufStart, Count);
System.SetLength(BufBytes, LBufStart);
vCypher := TBase64.Encode( BufBytes);
result := True;
end;
function XorelAESDecrypt(sCipher, sKey, sIV: string; out sPlain: string): Boolean;
var
CipherBytes, KeyBytes, IVBytes, BufBytes : TBytes;
KeyParametersWithIV: IParametersWithIV;
cipher: IBufferedCipher;
LBufStart, LSrcStart, Count: Int32;
begin
result := False;
sPlain := '';
CipherBytes := TConverters.ConvertStringToBytes( sCipher, TEncoding.UTF8);
KeyBytes := TConverters.ConvertStringToBytes( sKey, TEncoding.UTF8);
IVBytes := TConverters.ConvertStringToBytes( sIV, TEncoding.UTF8);
// remove Get Key & IV because it is Fixed.
LSrcStart := 0;
cipher := TCipherUtilities.GetCipher('AES/CBC/PKCS7PADDING');
KeyParametersWithIV := TParametersWithIV.Create
(TParameterUtilities.CreateKeyParameter('AES', KeyBytes), IVBytes);
cipher.Init(False, KeyParametersWithIV); // init decryption cipher
System.SetLength(BufBytes, System.Length(CipherBytes));
LBufStart := 0;
Count := cipher.ProcessBytes(CipherBytes, LSrcStart, System.Length(CipherBytes)
- LSrcStart, BufBytes, LBufStart);
System.Inc(LBufStart, Count);
Count := cipher.DoFinal(BufBytes, LBufStart);
System.Inc(LBufStart, Count);
System.SetLength(BufBytes, LBufStart);
sPlain := TConverters.ConvertBytesToString( BufBytes, TEncoding.UTF8);
result := True;
end;
end.
Thanks & Regards,