Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi LockBox3 String AES Verschlüsselung - Fehler in der Bereichsprüfung (https://www.delphipraxis.net/191397-lockbox3-string-aes-verschluesselung-fehler-der-bereichspruefung.html)

TUX_der_Pinguin 11. Jan 2017 10:18

LockBox3 String AES Verschlüsselung - Fehler in der Bereichsprüfung
 
Hallo,

wenn ich eine Anwendung mit eingeschalteter Bereichsprüfung kompiliere (Debug) erhalte ich immer die Meldung "Fehler bei der Bereichsprüfung" beim Versuch einen Text zu ver- oder entschlüsseln. Kompiliere ich die Anwendung ohne Bereichsprüfung (Release) dann funktioniert alles einwandfrei und ich kann einen Text verschlüsseln und auch wieder entschlüsseln und erhalte den richtigen Text.

Bei der Komponente handelt es sich um die über Getit verfügbare Komponente LockBox 3.5.1 und als Entwicklungsumgebung wird Delphi 10.1 Berlin Update 2 eingesetzt.

Ich haben mir eine Unit gebaut in der ich Funktionen zum ver- und entschlüsseln bereitstelle, in der Anwendung wird nur die entsprechende Funktion aufgerufen mit dem entsprechenden zu ver- oder entschlüsselnden Text sowie dem Passwort. Stutzig hat mich auch gemacht das die Passwort Länge ebenfalls zu einem Fehler führen kann, "Intergerüberlauf" wenn das Passwort länger oder kürzer als 16 Zeichen ist. Das aber lässt sich ja umgehen indem man einfach ein 16-Stelliges Passwort angibt. Aber der erste Fehler ist sehr frustrierend den zum Testen würde ich gerne die Anwendung im Debug Modus mit eingeschalteter Bereichsprüfung kompilieren.

Hat jemand von diesem Problem schon gehört und eine Idee für einen Workaround oder gar einen Fix?

Delphi-Quellcode:
unit uHandlingCrypt;

interface

function EncryptString(Str, PassPhrase: String): String;
function DecryptString(Str, PassPhrase: String): String;

implementation

uses
  uTPLb_CryptographicLibrary,
  uTPLb_Codec,
  System.SysUtils;

function EncryptString(Str, Passphrase: String): String;
var
  CryptLib: TCryptographicLibrary;
  Codec: TCodec;

begin
  //init
  result := EmptyStr;

  CryptLib := TCryptographicLibrary.Create(nil);
  try
    Codec := TCodec.Create(nil);
    try
      Codec.CryptoLibrary := CryptLib;
      Codec.StreamCipherId := 'native.StreamToBlock';
      Codec.BlockCipherId := 'native.AES-256';
      Codec.ChainModeId := 'native.ECB';
      Codec.Password := PassPhrase;
      Codec.EncryptString(Str, result, TEncoding.UTF8); //<--hier wird der Fehler in der Bereichsprüfung ausgelöst
    finally
      Codec.Free;
    end;{try..finally}
  finally
    CryptLib.Free;
  end;{try..finally}

end;

function DecryptString(Str, PassPhrase: String): String;
var
  CryptLib: TCryptographicLibrary;
  Codec: TCodec;

begin
  //init
  result := EmptyStr;

  CryptLib := TCryptographicLibrary.Create(nil);
  try
    Codec := TCodec.Create(nil);
    try
      Codec.CryptoLibrary := CryptLib;
      Codec.StreamCipherId := 'native.StreamToBlock';
      Codec.BlockCipherId := 'native.AES-256';
      Codec.ChainModeId := 'native.ECB';
      Codec.Password := PassPhrase;
      Codec.DecryptString(result, Str, TEncoding.UTF8); //<--hier wird der Fehler in der Bereichsprüfung ausgelöst
    finally
      Codec.Free;
    end;{try..finally}
  finally
    CryptLib.Free;
  end;{try..finally}

end;

end.

TUX_der_Pinguin 11. Jan 2017 10:57

AW: LockBox3 String AES Verschlüsselung - Fehler in der Bereichsprüfung
 
Beholfen habe ich mir jetzt dadurch das ich in der Unit 'uTPLb_StreamUtils' von LockBox in der Funktion 'Stream_to_Base64' die Bereichsprüfung deaktiviert habe.

Delphi-Quellcode:
function Stream_to_Base64(ASource: TStream; const ATransform: TBytes = nil): TBytes;
var
  pThreeBytes: packed array[ 0..2 ] of byte;
  iBytesRead: integer;
  P, j, i: integer;
  pBase64Transform: TBytes;
begin
{$IFDEF DEBUG}
  {$RANGECHECKS OFF}
{$ENDIF}
  pBase64Transform := ATransform;
  if pBase64Transform = nil then
     pBase64Transform := AnsiBytesOf(Base64Chars);
  SetLength(Result, (ASource.Size + 2) div 3 * 4);
  ASource.Position := 0;
  P := 0;
  repeat
    iBytesRead := ASource.Read( pThreeBytes, 3);
    if iBytesRead = 0 then break;
    for j := iBytesRead to 2 do
      pThreeBytes[j] := 0;
    for j := 0 to iBytesRead do
      begin
      result[ P ] := pBase64Transform[ ( pThreeBytes[0] shr 2) + 0];
      Inc( P);
      for i := 0 to 1 do
        pThreeBytes[i] := (pThreeBytes[i] shl 6) + (pThreeBytes[i+1] shr 2);
      pThreeBytes[ 2] := pThreeBytes[ 2] shl 6
      end
  until iBytesRead < 3;
  if iBytesRead > 0 then
    for j := iBytesRead to 2 do
      begin
      result[P] := Ord('=');
      Inc( P)
      end
{$IFDEF DEBUG}
  {$RANGECHECKS ON}
{$ENDIF}
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz