delphidelphi-2010lockbox-3

Which version of LockBox3 works under Delphi2010?


As I am looking for AES-128 encryption, I'd like to get Lockbox3 running on Delphi2010.

The first problem here: What/where are the official sources?

The sources from https://sourceforge.net/projects/tplockbox/ don't hold packages for Delphi2010 and also simply don't compile (loads of errors).

https://code.google.com/archive/p/tplockbox/ is not maintained anymore and points to https://github.com/SeanBDurkin/tplockbox.

I downloaded the sources from github, I think in V3.6.3 (version is nowhere mentioned in the sources, right?). The packages can be installed, but e.g. the MakeSampleKey example doesn't compile, as EncryptString doesn't work with AnsiStrings (umfmMakeSampleKey.pas, line 216).

I have then created a project and used the source from the OP of How to AES-128 encrypt a string using a password in Delphi and decrypt in C#?

I changed CipherText from AnsiString to String. The code compiles, but when I run it, it crashes with "Integer overflow" in TPLB3.SHA1.pas, line 264.

Is LockBox3 still maintained and is it usable for Delphi2010? If yes, then how? What do I do wrong? Thx!

Edit: There's another GitHub project hosting LockBox3, namely https://github.com/TurboPack/LockBox3 The recent sources from there do NOT compile under Delphi2010. (see comments under OP for a short list of problems)

Edit: Here's some code I try to use (and fail) - i post it here as I don't manage to post it formatted into a comment:

function LockBox3_EncryptText_AES_128(input: string; password: string): string;
var
  Codec: TCodec;
  CipherText: String;
begin
  Codec := TCodec.Create(nil);
  try
    Codec.CryptoLibrary := TCryptographicLibrary.Create(Codec);
    Codec.StreamCipherId := BlockCipher_ProgID;
    Codec.BlockCipherId := Format(AES_ProgId, [128]);
    Codec.ChainModeId := CBC_ProgId;
    Codec.Password := Password;
    Codec.EncryptString(input, CipherText);
    Result := string(CipherText);
  finally
    Codec.Free;
  end;
end;

Solution

  • I maintain LockBox 3 at http://lockbox.seanbdurkin.id.au/HomePage .

    The repo is at https://github.com/SeanBDurkin/tplockbox .

    Yes, it works for D2010.


    Update

    This works for me, with Delphi 2010 and TPLB3 version 3.6.3

    program LB3Demo_D2010;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      TPLB3.Codec in '..\ExternalLibraries\TPLB3\run\TPLB3.Codec.pas',
      TPLB3.CryptographicLibrary in '..\ExternalLibraries\TPLB3\run\TPLB3.CryptographicLibrary.pas',
      TPLB3.BlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.BlockCipher.pas',
      TPLB3.StreamToBlock in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamToBlock.pas',
      TPLB3.Decorators in '..\ExternalLibraries\TPLB3\run\TPLB3.Decorators.pas',
      TPLB3.StreamCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamCipher.pas',
      TPLB3.StreamUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.StreamUtils.pas',
      TPLB3.Random in '..\ExternalLibraries\TPLB3\run\TPLB3.Random.pas',
      TPLB3.IntegerUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.IntegerUtils.pas',
      TPLB3.Compatibility in '..\ExternalLibraries\TPLB3\run\TPLB3.Compatibility.pas',
      TPLB3.Asymetric in '..\ExternalLibraries\TPLB3\run\TPLB3.Asymetric.pas',
      TPLB3.CodecIntf in '..\ExternalLibraries\TPLB3\run\TPLB3.CodecIntf.pas',
      TPLB3.BaseNonVisualComponent in '..\ExternalLibraries\TPLB3\run\TPLB3.BaseNonVisualComponent.pas',
      TPLB3.Hash in '..\ExternalLibraries\TPLB3\run\TPLB3.Hash.pas',
      TPLB3.HashDsc in '..\ExternalLibraries\TPLB3\run\TPLB3.HashDsc.pas',
      TPLB3.AES in '..\ExternalLibraries\TPLB3\run\TPLB3.AES.pas',
      TPLB3.Base64 in '..\ExternalLibraries\TPLB3\run\TPLB3.Base64.pas',
      TPLB3.CBC in '..\ExternalLibraries\TPLB3\run\TPLB3.CBC.pas',
      TPLB3.Constants in '..\ExternalLibraries\TPLB3\run\TPLB3.Constants.pas',
      TPLB3.ECB in '..\ExternalLibraries\TPLB3\run\TPLB3.ECB.pas',
      TPLB3.MD5 in '..\ExternalLibraries\TPLB3\run\TPLB3.MD5.pas',
      TPLB3.SimpleBlockCipher in '..\ExternalLibraries\TPLB3\run\TPLB3.SimpleBlockCipher.pas',
      TPLB3.I18n in '..\ExternalLibraries\TPLB3\run\TPLB3.I18n.pas',
      TPLB3.CFB_8Bit in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_8Bit.pas',
      TPLB3.CFB_Block in '..\ExternalLibraries\TPLB3\run\TPLB3.CFB_Block.pas',
      TPLB3.CTR in '..\ExternalLibraries\TPLB3\run\TPLB3.CTR.pas',
      TPLB3.OFB in '..\ExternalLibraries\TPLB3\run\TPLB3.OFB.pas',
      TPLB3.PCBC in '..\ExternalLibraries\TPLB3\run\TPLB3.PCBC.pas',
      TPLB3.SHA1 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA1.pas',
      TPLB3.SHA2 in '..\ExternalLibraries\TPLB3\run\TPLB3.SHA2.pas',
      TPLB3.SVN_Keywords in '..\ExternalLibraries\TPLB3\run\TPLB3.SVN_Keywords.pas',
      TPLB3.BinaryUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.BinaryUtils.pas',
      TPLB3.PointerArithmetic in '..\ExternalLibraries\TPLB3\run\TPLB3.PointerArithmetic.pas',
      TPLB3.CipherUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.CipherUtils.pas',
      TPLB3.RSA_Engine in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Engine.pas',
      TPLB3.RSA_Primitives in '..\ExternalLibraries\TPLB3\run\TPLB3.RSA_Primitives.pas',
      TPLB3.HugeCardinal in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinal.pas',
      TPLB3.HugeCardinalUtils in '..\ExternalLibraries\TPLB3\run\TPLB3.HugeCardinalUtils.pas',
      TPLB3.MemoryStreamPool in '..\ExternalLibraries\TPLB3\run\TPLB3.MemoryStreamPool.pas',
      TPLB3.DES in '..\ExternalLibraries\TPLB3\run\TPLB3.DES.pas',
      TPLB3.BlowFish in '..\ExternalLibraries\TPLB3\run\TPLB3.BlowFish.pas',
      TPLB3.TDES in '..\ExternalLibraries\TPLB3\run\TPLB3.TDES.pas',
      TPLB3.TwoFish in '..\ExternalLibraries\TPLB3\run\TPLB3.TwoFish.pas',
      TPLB3.XXTEA in '..\ExternalLibraries\TPLB3\run\TPLB3.XXTEA.pas',
      TPLB3.DCP.twofish_Modified in '..\ExternalLibraries\TPLB3\run\TPLB3.DCP.twofish_Modified.pas';
    
    const
      /// <remarks>Set isProduction to True for a production environment.
      ///  For a production environment, we want to randomize the PRNG at start-up,
      ///  for security reasons. For a test environment, we may way to set the seed
      ///  to be a fixed known value, for purposes of reproducibility and possibly
      ///  KAT alignment.
      /// </remarks>
      isProduction: boolean = False;
      Seed_ForNonProduction: int64 = 1;
    
    function LockBox3_EncryptText_AES_128( input: string; password: string): string;
    var
      Codec: TCodec;
    begin
      Codec := TCodec.Create( nil);
      try
        Codec.CryptoLibrary  := TCryptographicLibrary.Create(Codec);
        Codec.StreamCipherId := BlockCipher_ProgID;
        Codec.BlockCipherId  := Format(AES_ProgId, [128]);
        Codec.ChainModeId    := CBC_ProgId;
        Codec.Password       := Password;
        Codec.EncryptString( input, result);
        Codec.Burn
      finally
        Codec.Free
      end
    end;
    
    var
      input, output: string;
      password: string;
    begin
      try
        if isProduction then
            TRandomStream.Instance.Randomize
          else
            TRandomStream.Instance.Seed := Seed_ForNonProduction;
        input    := 'Hello world';
        WriteLn( 'Compiler = ', Format( '%.1f', [CompilerVersion]));
        WriteLn( 'Plaintext = "' + input + '"');
        password := 'my-secret';
        WriteLn( 'Password (' + {$IFDEF UNICODE} 'UTF-16' {$ELSE} 'UTF-8' {$ENDIF} + ') = "' + password + '"');
        WriteLn( 'Seed = ', TRandomStream.Instance.Seed);
        output   := LockBox3_EncryptText_AES_128( input, password);
        Writeln( 'Ciphertext (encoded as base64) = "' + output + '"');
        WriteLn( 'Press enter to terminate.');
        Readln;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    

    Output

    When run, the output yields ...

    Compiler = 21.0
    Plaintext = "Hello world"
    Password (UTF-16) = "my-secret"
    Seed = 1
    Ciphertext (encoded as base64) = "AQAAAAAAAADCpkdd/g8fyEuojQ=="