![]() |
Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Hallo,
ich hoffe hier benutzt jemand Lockbox 3 zur Datenverschlüsselung und kann mir bei meinem Problem weiterhelfen. Ich möchte Daten in AES und CBC Mode verschlüsseln und dann mit der PHP Funktion mcrypt_cbc() wieder entschlüsseln. Das ist die Lockbox Komponente:
Delphi-Quellcode:
Beim Klick auf eine Schltfläche soll eine Zeichenkette mit einem Passwort verschlüsselt werden.
object Codec1: TCodec
AsymetricKeySizeInBits = 1024 AdvancedOptions2 = [] CryptoLibrary = CryptographicLibrary1 Left = 496 Top = 40 StreamCipherId = 'native.StreamToBlock' BlockCipherId = 'native.AES-192' ChainId = 'native.CBC' end object CryptographicLibrary1: TCryptographicLibrary Left = 568 Top = 40 end
Delphi-Quellcode:
Ich erhalte z.B. die Base64kodierte zeichenkette: yMvS0IobfNR179gFFvyOE5+/cvm1bo1q+JfZ9WnFRtA=
procedure TfrmMain.Button1Click(Sender: TObject);
var base64Ciphertext : AnsiString; plaintext: String; begin plaintext := 'LockBox3Test'; Codec1.Cipher := 'native.AES-128' Codec1.Password := 'MeinPasswort123'; Codec1.EncryptString( plaintext, base64Ciphertext); boxCipherTextOut.Text := base64Ciphertext; end; Diese soll in den ersten 8 Bytes (Zeichen) den Initialisierungsvektor IV beinhalten. In Lockbox wird dieser aus Sicherheitsgründen ja zufällig erzeugt. Mein PHP Skript sieht jetzt folgendermaßen aus:
Delphi-Quellcode:
Leider erhalte ich nicht die ursprüngliche Zeichenkette.
<?php
$pwd = 'MeinPasswort123'; $cipherText = 'yMvS0IobfNR179gFFvyOE5+/cvm1bo1q+JfZ9WnFRtA='; $iv = substr ( $cipherText, 0, 8 ); $encryptedcbc = mcrypt_cbc(MCRYPT_RIJNDAEL_128, $pwd, $cipherText, MCRYPT_DECRYPT, $iv); echo 'CBC encrypted: '.base64_encode($encryptedcbc); ?> Was mache ich falsch? Habe ich beim Auslesen des IV einen Denkfehler? Besten Dank für jede Unterstützung. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Ohne auf die speziellen Implentationen einzugehen: In Deine Codebeispielen geistern zwei verschiedene Schlüssellängen herrum: 128 und 192 Bit. Versuch's mal überall mit derselben Länge.
|
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Zitat:
|
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Und auch noch ob man mit 8-Bit Ansi oder 8-Bit UTF-8 oder 16-Bit UTF-16 Codierten strings arbeitet.
Bei XE2 ist ein Character = 2 Byte. Die Frage ist ob Lockbox 3 schon das berücksichtigt oder hier noch mist baut. Und auch ob und wie PHP das erwartet. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Zitat:
Dazu kommen noch eventuell unterschiedliche Paddingversion bei CBC, wenn die Textlänge kein Vielfaches der Blocklänge ist. Außerdem muß ein IV 16 Bytes lang sein, da ist mit 8 Zeichen des Base64-Strings nichts zu machen. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Besten Dank für Eure schnellen Meinungen.
Zitat:
Zitat:
Sean, der Enwtickler von Lockbox schrieb folgendes: Zitat:
|
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Das mit dem IV ist Unsinn. Es gibt bei AES keine 8-Byte IVs! Irgendwo müssen noch 8 weitere Bytes herkommen: entweder 0, Sequenznummer oä.
Wenn ich Dich richtig verstehe, kannst Du auf PHP-Seite nichst ändern und willst die Delphi-Seite dazu bringen, kompatible Ciphertexte zu erstellen. Dazu ist es notwendig genau zu wissen, was die PHP-Seite macht. Abgesehen von Little/Big-Endian, Unicode etc hast Du schon auf Byteebene zu klären: - Wie wird ein Passwort in einen 128 bzw 192 Bit-Schlüssel überführt? Hashfunktion (wenn ja welche?) oder KDF (welche?) - Welches Padding wird werwendet wenn die Textlänge kein Vielfaches von 16 ist. Oder wird Ciphertext-Stealing verwendet? Das DEC-artige Umschalten auf CFB-8 scheint mir wieder selbstgestrickt und nicht-standard. - In welcher Form wird der IV erwartet. Erst wenn das alles geklärt ist, kannst Du auf Delphi-Seite anfangen. Notfalls halt IV, Padding und Schlüssel zu Fuß behandeln. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Zitat:
Delphi-Quellcode:
if Length(MeinPasswort) <= 16 then
Codec1.BlockCipherId := 'native.AES-128' else if Length(MeinPasswort) <= 24 then Codec1.BlockCipherId := 'native.AES-192' else Codec1.BlockCipherId := 'native.AES-256'; Zitat:
In PHP sehe ich, dass ZeroPadding verwendet wird. Zitat:
![]() |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Zitat:
Zitat:
Zitat:
Also ist entweder LB grundsätzlich nicht für Deine Aufgabe geeignet (was ich mir aber nicht so richtig vorstellen kann), oder Du mußt Dich stark in das Produkt einarbeiten.:( Vielleicht sind ja einige Spezialisten dafür im Forum. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Danke für Deine Bemühung, mir zu helfen. Bitte, eines noch: folgendes habe ich noch bei StackOverflow gefunden:
![]() Zitat:
Zitat:
Was ist "CFB-8 bit and treat as key-streaming"? Besten Dank. |
AW: Lockbox 3: Daten verschlüsseln und in PHP entschlüsseln
Zur IV-Problematik: Offensichtlich soll ein Feature verkauft werden: "Wir machen das automatisch für Sie, darum müssen Sie sich nicht kümmern". Problem ist nur das verschiedene Implementationen unterschiedliche Vorstellungen von Arbeitserleichterungen haben und sich nicht um Standards sorgen. Entweder es gelingt Dir den verwendenen IV zu ermittelt/setzen oder Du kannst den CBC-Modus für Deine Zwecken nicht verwenden. Punkt.
Zum Padding: Der reine CBC-Modus kann nur verwendet werden, wenn die Textlänge gleich der Blocklänge ist (für AES sind das 16 Bytes). Wenn nicht muß aufgefüllt werden (padding) oder eine andere Methode verwenden werden. Das ![]() Am einfachsten scheint mir, wenn Du einen Text 'manuell' mit #0-Bytes füllst auf ein Vielfaches von 16 (und mindestens 32 Bytes), also Textlängen von 32, 48, 64, ... verwendest. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz