I am currently testing Lockbox3, and have run into a problem trying to do a simple string encryption & decryption using the XXTEA cipher. I'm using Delphi 10.1 Berlin and installed the latest version of Lockbox3 using GetIt! My test app is targeted for Win32 (VCL).
The issue is that the encryption works fine, but when I attempt to decrypt the string, an exception is thrown : "No mapping for the Unicode character exists in the target multi-byte code page.". I'm not sure what the issue is?
procedure TForm1.btnEncryptClick(Sender: TObject);
var
PlainText : string;
CipherText : string;
CryptoLib : TCryptographicLibrary;
Codec : TCodec;
begin
try
CryptoLib := TCryptographicLibrary.Create(nil);
Codec := TCodec.Create(nil);
Codec.CryptoLibrary := CryptoLib;
Codec.StreamCipherId := 'native.XXTEA.Large.Littleend';
Codec.ChainMode := 'native.CBC';
Codec.Password := 'password';
PlainText := Edit1.Text;
Codec.EncryptString( PlainText, CipherText, Tencoding.UTF8 );
Codec.Burn;
finally
Codec.Free;
CryptoLib.Free;
Edit2.Text := CipherText;
end;
end;
procedure TForm1.btnDecryptClick(Sender: TObject);
var
PlainText : string;
CipherText : string;
CryptoLib : TCryptographicLibrary;
Codec : TCodec;
begin
try
CryptoLib := TCryptographicLibrary.Create(nil);
Codec := TCodec.Create(nil);
Codec.CryptoLibrary := CryptoLib;
Codec.StreamCipherId := 'native.XXTEA.Large.Littleend';
Codec.ChainMode := 'native.CBC';
Codec.Password := 'password';
CipherText := Edit2.Text;
Codec.DecryptString( PlainText, CipherText, Tencoding.UTF8 );
Codec.Burn;
finally
Codec.Free;
CryptoLib.Free;
Edit1.Text := PlainText;
end;
end;
There are two issues. The first is that there is a defect in the XXTEA decryptor. If you can't wait for the fix to be published, I have posted a code delta that you can apply and recompile for an immediate solution. I am a bit surprised that there are no unit tests for XXTEA. Everything else in this library has plenty of unit tests, so I will work on that too.
The second issue is that the codec property names that you should set when doing it at runtime are slightly different from the design-time property names. (
ChainModeIdnotChainMode). The difference was made to make design-time property configuration easier.Any way, I did some testing on Lockbox-3 v3.7.0 . The home site can be found at http://lockbox.seanbdurkin.id.au/HomePage and the source code from https://github.com/SeanBDurkin/tplockbox . I tested with Delphi 10.2 Tokyo; Target=Win32.
Listing one gives the test program (a one-file console program), and Listing two gives the fix. The fix is an update to method procedure TXXTEA_LargeBlock_LE_Decryptor.End_Decrypt() which can be found in unit TPLB3.XXTEA . The GetIt version will have slightly different unit names. That being said, in relation to XXTEA, it might be safer to wait until unit tests have been published.
Also, if any one wants to help out by contributing Known-Answer-Tests (KATs), that would be good for all.
Listing One: A Test program
Listing Two: The fix
The next version will be 3.8.0 and will include the XXTEA fix and XXTEA unit tests. I can't give a schedule for it.