Какая версия LockBox3 работает под Delphi2010?

Поскольку я ищу шифрование AES-128, я хотел бы, чтобы Lockbox3 работал на Delphi2010.

Первая проблема здесь: какие/где официальные источники?

Источники из https://sourceforge.net/projects/tplockbox/ не содержат пакеты для Delphi2010 и тоже просто не компилируется (куча ошибок).

https://code.google.com/archive/p/tplockbox/ больше не поддерживается и указывает на https://github.com/SeanBDurkin/tplockbox.

Скачал исходники с github, кажется в V3.6.3 (версия нигде не упоминается в исходниках, да?). Пакеты могут быть установлены, но, например. пример MakeSampleKey не компилируется, поскольку EncryptString не работает с AnsiString (umfmMakeSampleKey.pas, строка 216).

Затем я создал проект и использовал источник из OP Как AES-128 зашифровать строку с помощью пароля в Delphi и расшифровать в C#?

Я изменил CipherText с AnsiString на String. Код компилируется, но когда я его запускаю, происходит сбой с "целочисленным переполнением" в TPLB3.SHA1.pas, строка 264.

Поддерживается ли LockBox3 и можно ли его использовать для Delphi2010? Если да, то как? Что я делаю неправильно? Спасибо!

Редактировать: есть еще один проект GitHub, в котором размещен LockBox3, а именно https://github.com/TurboPack/LockBox3 Последние исходники оттуда НЕ компилируются под Delphi2010. (см. комментарии под OP для краткого списка проблем)

Редактировать: Вот код, который я пытаюсь использовать (и терпит неудачу) — я публикую его здесь, так как мне не удается опубликовать его в формате комментария:

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;

person ralfiii    schedule 19.08.2016    source источник
comment
Исходники с Github собираются под все поддерживаемые версии Delphi, и, поскольку это текущий репозиторий кода (как видите, последний раз он обновлялся около месяца назад), вам стоит посмотреть там. Больше нет отдельных пакетов для каждой версии IDE, и не было уже целую вечность. Версия на Github отлично работает в Сиэтле и Берлине, что означает, что она отлично работает со строками Unicode.   -  person Ken White    schedule 19.08.2016
comment
Только что проверил Github, и инструкции по установке находятся прямо на странице по адресу github.com/TurboPack/LockBox3 - прокрутите страницу вниз, чтобы прочитать содержимое файла readme.txt.   -  person Ken White    schedule 19.08.2016
comment
Кен, вы указываете на другой репозиторий Github. (/TurboPack/LockBox3 против /SeanBDurkin/tplockbox) Я попробовал этот репозиторий до того, как опубликовал свой первоначальный запрос. Теперь я проверил снова. Я проверил исходники с github.com/TurboPack/LockBox3.git/trunk. Я добавил требуемые пути поиска и попытался скомпилировать LockBox3VCLDD.dpk. Он завершается с ошибкой [MSBuild Fehler] 0 ist ein ungültiger Wert für den DebugInformation-Parameter der DCC-Aufgabe. Der DebugInformation-Parameter gehört zum System.Boolean-Typ. Еще раз: я использую Delphi2010. Какую версию Delphi вы пробовали?   -  person ralfiii    schedule 24.08.2016
comment
Кстати: когда я удаляю все двоичные файлы, которые могут помешать компиляции пакета, он останавливается с неизвестным идентификатором TEncoding.ANSI в модуле uTPLb_StrUtils.pas.   -  person ralfiii    schedule 24.08.2016
comment
Да, я знаю, что указываю на другой репозиторий. У меня эта версия установлена ​​в D2007, XE, XE8, 10 Seattle и 10.1 Berlin. Если он работает со всеми из них (которые являются как ANSI, так и Unicode), я не вижу причин, по которым он не будет работать с 2010 годом. недопустимый параметр и ожидалось логическое значение. Обычно полезно (поскольку это англоязычный сайт) предоставить перевод ошибки, когда это возможно.)   -  person Ken White    schedule 24.08.2016
comment
Кен: После удаления файлов .dproj ошибка MSBuild исчезла. Он сказал, что 0 является недопустимым значением для Debuginfo-параметра вывода dcc. Параметр debuginfo относится к типу system.boolean. Вы скомпилировали под D2007??? В ряде случаев требуется TEncoding.ANSI. И не все из них можно исправить, как это предлагается в stackoverflow.com/questions/26000177/ Кроме того, во многих местах директива {$IF Compilierversion...} закрывается не {$IFEND], а {$ENDIF }. У меня работает под 10.1Berlin, не под D2010   -  person ralfiii    schedule 24.08.2016
comment
Я действительно desparate об этой проблеме. Я настроил новую виртуальную машину, установил Delphi2010 и скопировал туда исходники LockBox. Я запустил TeamViewer на этой виртуальной машине. Кен или кто-нибудь еще: Не могли бы вы взглянуть и посмотреть, не найдете ли вы причину всего этого? ID/пин-код: 973 132 244/8195. Ты был бы моим героем...   -  person ralfiii    schedule 24.08.2016
comment
Здесь мы не проводим личных консультаций; это на самом деле не так, как этот сайт работает. Все действия должны выполняться здесь, чтобы они приносили пользу будущим пользователям.   -  person Ken White    schedule 24.08.2016
comment
Это логично! Я, естественно, буду публиковать все выводы здесь позже - на благо будущих пользователей. Я просто думаю, что вам (или кому-то другому) будет легче найти проблему или подсказать мне, куда идти, если я предоставлю вам возможность лично проверить, что происходит на моей машине. Это мысль, стоящая за VM.   -  person ralfiii    schedule 25.08.2016


Ответы (1)


Я поддерживаю LockBox 3 по адресу http://lockbox.seanbdurkin.id.au/HomePage .

Репозиторий находится по адресу https://github.com/SeanBDurkin/tplockbox.

Да, на D2010 работает.


Обновлять

У меня это работает с Delphi 2010 и TPLB3 версии 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.

Вывод

При запуске вывод дает...

Compiler = 21.0
Plaintext = "Hello world"
Password (UTF-16) = "my-secret"
Seed = 1
Ciphertext (encoded as base64) = "AQAAAAAAAADCpkdd/g8fyEuojQ=="
person Sean B. Durkin    schedule 01.09.2016
comment
Спасибо за помощь. Я знаю этот репозиторий и установил его. Однако мне не удается заставить его работать. Я попытался зашифровать некоторый текст с помощью кода из delphipraxis.net/185039- lockbox-3-string-verschluesseln.html Но в строке Codec.Password:=... я получаю исключение EIntOverflow в TSHA1_Hasher.Update (файл TPLB3.SHA1.pas). Как было предложено на вашем форуме, я отключил проверку переполнения в этом устройстве. Теперь код вылетает с ошибкой ERangeError при Codec.EncryptString в Stream_to_Base64 (модуль TPLB3.StreamUtils.pas, строка 310). Действительно ли отключение проверки диапазона — хорошая идея? - person ralfiii; 01.09.2016
comment
Пожалуйста, опубликуйте пример кода, который не работает. В вашем комментарии недостаточно информации для работы. - person Sean B. Durkin; 01.09.2016
comment
Я добавил код в исходное сообщение. Код взят из ссылки delphipraxis в моем предыдущем комментарии. Простой вызов метода с параметрами someText и somePassword приводит к сбою. - person ralfiii; 01.09.2016
comment
Спасибо, теперь это работает. Необходимо внести несколько изменений в исходный код ( {$R-}{$Q-} в SHA1.pas и StreamUtils.pas), чтобы избежать ошибок проверки диапазона и переполнения, тогда это, похоже, работает - person ralfiii; 26.09.2016
comment
Обновление: я выпустил LockBox 3.7.0. Он имеет все эти исправления, поддерживает предоставленные клиентом IV и имеет заголовки проектов для D10.1 Berlin и XE8. Перейдите на страницу github.com/SeanBDurkin/tplockbox. - person Sean B. Durkin; 17.11.2016