You are not logged in.
Pages: 1
Hello,
I have to decrypt data which is crypt using OpenSSL library AES-CBC on a Linux system. Decryption will be on Windows. Plain text encrypt on Linux is: "The quick brown fox jumps over the lazy dog"
Below is my code for decryption:
function DecryptItAESCBC(const s: string; AKey, IV: Array of Byte; out Value: string): Boolean;
var
Aes: TAESCBC;
LocalIV: THash128;
Utf8String: RawByteString;
MyBytes: TBytes;
I: Integer;
begin
if s = EmptyStr then Exit(False);
for I := Low(LocalIV) to High(LocalIV) do LocalIV[I] := IV[I];
Aes := TAESCBC.Create(AKey, 256);
try
Aes.IV := LocalIV;
SetLength(Utf8String, 1024);
try
MyBytes := TNetEncoding.Base64.DecodeStringToBytes(s); // I confirm bytes are identical to crypt data on other end
Aes.Decrypt(Pointer(MyBytes), Pointer(Utf8String), 1024);
except
Value := EmptyStr;
Exit(False);
end;
Value := UTF8ToString(Utf8String);
finally
Aes.Free();
end;
Result := True;
end;
For test purpose simple Key and IV used. My code to call above function is:
procedure TForm1.Button1Click(Sender: TObject);
var
Key: TBytes;
IV: TBytes;
I: Integer;
Plain: string;
begin
SetLength(Key, 32);
SetLength(IV, 16);
for I := Low(Key) to High(Key) do Key[I] := I; // same Key used to crypt on other end
for I := Low(IV) to High(IV) do IV[I] := I; // same IV used to crypt on other end
if not DecryptItAESCBC(TFile.ReadAllText('Z:\b64crypt'), Key, IV, Plain) then
begin
Memo1.Lines.Add('Cannot decrypt!');
Exit();
end;
Memo1.Lines.Add('Plain text: ' + AnsiQuotedStr(Plain, '"'));
end;
What I read in memo is: "The quick brown fox jumps over the lazy dog#5#5#5#5#5'n'#$14#$E'9'" (without double quotes)
I could not find my mistake. I tested decryption using OpenSSL on Linux and it works just fine. On Windows, I read above 9 more characters and most of them are invisible.
Any help is appreciated.
Offline
You have a padding issue I guess.
See how padding works - in a nutshell, AES works on 16 bytes blocks, so you need to do something with your last bytes.
In your Aes.Decrypt() code, you uncypher 1000 bytes... this is not the way to do it!
Use a Aes method using padding algorithm, e.g. PKCS7.
Offline
You have a padding issue I guess.
See how padding works - in a nutshell, AES works on 16 bytes blocks, so you need to do something with your last bytes.In your Aes.Decrypt() code, you uncypher 1000 bytes... this is not the way to do it!
Use a Aes method using padding algorithm, e.g. PKCS7.
Exactly, changing one line and I can read same text on Windows.
Utf8String := Aes.DecryptPKCS7Buffer(Pointer(MyBytes), Length(MyBytes), False);
Thank you.
Offline
Pages: 1