Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   AES-Encryption zwischen Delphi und Rest der Welt (https://www.delphipraxis.net/188025-aes-encryption-zwischen-delphi-und-rest-der-welt.html)

Benutzername12345 25. Jan 2016 11:10

Delphi-Version: XE

AES-Encryption zwischen Delphi und Rest der Welt
 
Hallo Delphi-Praxis-Community,

suche nun schon seit mehreren Stunden nach einer Lösung zu einem (meiner Meinung nach simplen) Problem, konnte bisher aber leider nichts finden und wende mich nun verzweifelt an euch :)

Eigentliches Ziel ist folgendes:
Wir arbeiten mit einem C#-Webservice der derzeit die Daten unverschlüsselt an die aufrufende Stelle zurückgibt. Da der Webservice allerdings nicht für die Öffentlichkeit bestimmt ist wollen wir diesen mit AES Rjindael verschlüsseln.
Mein Kollege hat schon irgendwo aus dem Internet eine Verschlüsselung kopiert. Diese kann zwischen C# Webservice und C# Anwendung kommunizieren. Da er selbst aber keine genaue Ahnung hat was da passiert, dachte ich, bevor ich die Verschlüsselung am Webservice nun anpasse, stelle ich sicher, dass Delphi erstmal irgendwas ver- und entschlüsselt, dass einem Allgemein kompatiblen Standard entspricht. Delphi ist aus Erfahrung immer etwas weniger flexibel, daher mein Gedanke: "Wenn ich was finde, bei dem es mit Delphi klappt, klappt das dann höchstwahrscheinlich auch in C#"

Also habe ich mir einen Online-Encrypter gesucht ( https://www.tools4noobs.com/online_tools/encrypt/ )
mit der Prämisse: In Delphi einen verschlüsselten String zu generieren, den ich dort nachstellen kann.

Habe nun bereits mehrere verschiedene Lösungen und Libraries durchprobiert und nutze derzeit DEC mit folgendem Code (vermutlich irgendwo von Stackoverflow kopiert)

Delphi-Quellcode:
function CCFDecrypt(const CCF: Binary; const Password: Binary): Binary;
begin
  with TCipher_Rijndael.Create do
    try
      Mode := cmCFB8;
      Init(Password, #0, $00);
      result := DecodeBinary(CCF, TFormat_MIME64);
    finally
      Free;
    end;
end;

function CCFEncrypt(const CCF: Binary; const Password: Binary): Binary;
begin
  with TCipher_Rijndael.Create do
    try
      Mode := cmCFB8;
      Init(Password, #0, $00);
      result := EncodeBinary(CCF, TFormat_MIME64);
    finally
      Free;
    end;
end;
dazu diesen Aufruf:
Delphi-Quellcode:
var
  Password, Data: Binary;
begin
  Password := 'asd';
  Data := CCFEncrypt('asd', Password);
  Data := CCFDecrypt(Data, Password);
Der verschlüsselte Text "asd" mit dem Password "asd" ergibt den String "htz5"
nun schaffe ich es aber nicht, auch nicht mit anderen Modes in Delphi, einen String zusammenzubauen den ich in dem Onlinetool genauso generieren kann.

Ich weiß nicht was ich falsch mache aber habe das Gefühl gehörig auf dem Schlauch zu stehen.

Grüße

Sir Rufo 25. Jan 2016 11:20

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Wenn du das Gleiche mit etwas Gleichem bearbeitest/umwandelst, kommt auch das Gleiche heraus.

Jede Verschlüsselung/Komprimierung arbeitet mit einer Bytefolge.

Alles muss also vorher in so eine Bytefolge rein und da hat der Frosch die Locken.

Was denn für eine Kodierung bei dem String? ANSI, UTF8, UTF16, ... da muss man sich auf das Gleiche einigen :stupid:

gammatester 25. Jan 2016 11:38

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Zusätzlich zum vorherigen Beitrag:

Wie wird denn der AES-Schlüssel aus dem Passwort abgeleitet? Welche Schlüsselgröße wird überhaupt benutzt (128,192 oder 256 Bit)?

Ich finde keine Angaben dazu in Deiner Frage.

mjustin 25. Jan 2016 11:58

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Wenn die Daten nur während der Übertragung verschlüsselt sein sollen, würde ich Transport Layer Security verwenden: wenn der Webservice HTTP basiert ist, einfach auf HTTPS umstellen.

pertzschc 25. Jan 2016 12:28

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Zitat:

Zitat von mjustin (Beitrag 1328097)
Wenn die Daten nur während der Übertragung verschlüsselt sein sollen, würde ich Transport Layer Security verwenden: wenn der Webservice HTTP basiert ist, einfach auf HTTPS umstellen.

Manchmal liegt das offensichtliche im Verborgenen - danke für den Hinweis, eh sich jetzt wieder eine große DEC Diskussion ausbreitet.

Benutzername12345 25. Jan 2016 12:43

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Zitat:

Zitat von mjustin (Beitrag 1328097)
Wenn die Daten nur während der Übertragung verschlüsselt sein sollen, würde ich Transport Layer Security verwenden: wenn der Webservice HTTP basiert ist, einfach auf HTTPS umstellen.

Wir hatten erst eine HTTPS Verschlüsselung allerdings hilft das ja nur gegen man-in-the-middle Attacken. Wir wollen aber auch sicherstellen, dass jemand der zufällig den Webservice findet und zufällig mit korrekten Parametern aufruft, mit dem Ergebnis nichts anfangen kann (geht dabei um rohe Datenbankzugriffe). Sowohl Webservice als auch die angebotenen Funktionen haben zwar unleserliche Namen allerdings "security through obscurity is no security"

Zitat:

Zitat von gammatester (Beitrag 1328096)
Zusätzlich zum vorherigen Beitrag:

Wie wird denn der AES-Schlüssel aus dem Passwort abgeleitet? Welche Schlüsselgröße wird überhaupt benutzt (128,192 oder 256 Bit)?

Ich finde keine Angaben dazu in Deiner Frage.

Wie der Schlüssel abgeleitet wird, weiß ich nicht. Wie finde ich das raus?
Die Schlüsselgröße, habe ich online gelesen, ist bei DEC 128 Bit


Zitat:

Zitat von Sir Rufo (Beitrag 1328093)
Wenn du das Gleiche mit etwas Gleichem bearbeitest/umwandelst, kommt auch das Gleiche heraus.

Jede Verschlüsselung/Komprimierung arbeitet mit einer Bytefolge.

Alles muss also vorher in so eine Bytefolge rein und da hat der Frosch die Locken.

Was denn für eine Kodierung bei dem String? ANSI, UTF8, UTF16, ... da muss man sich auf das Gleiche einigen :stupid:

Bin mir nicht ganz sicher, ob ich dich richtig verstehe aber bei beiden (online Tool und Delphi) ist das Ergebnis ein Base64 String

gammatester 25. Jan 2016 13:07

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Zitat:

Zitat von Benutzername12345 (Beitrag 1328104)
Zitat:

Zitat von gammatester (Beitrag 1328096)
Zusätzlich zum vorherigen Beitrag:

Wie wird denn der AES-Schlüssel aus dem Passwort abgeleitet? Welche Schlüsselgröße wird überhaupt benutzt (128,192 oder 256 Bit)?

Ich finde keine Angaben dazu in Deiner Frage.

Wie der Schlüssel abgeleitet wird, weiß ich nicht. Wie finde ich das raus?
Die Schlüsselgröße, habe ich online gelesen, ist bei DEC 128 Bit

Du must doch zumindest beim Online-Algorithmus die Schlüssellänge auswählen. (Dort gibt es Rijndael-128, 192, 256. Ich nehme an daß damit AES-xxx gemeint sein soll). Im übrigen muß es schon Verdacht erregen, daß ein Quasi-Stream-Modus wie CFB-8, der Text beliebiger Länge verarbeiten kann, aus 3 Zeichen plötzlich 4 macht. Entweder gleiche Länge oder Vielfaches von 16. Oder ist Deine Angabe "htz5" in Base-64? Umso deutlicher wird es, alles in Bytes zu kommunizieren.

Im übrigen wäre ich skeptisch, wenn gesagt wird uses the mcrypt_encrypt() in PHP ohne daß das genauer spezifiziert ist. In dem PHP manual link wird gesagt, daß, wenn eine Schlüssellänge nicht unterstützt wird, false geliefert wird. Ein 24-Bit Schlüssel a la ASCII "asd" kann nun garantiert nicht benutzt werden. Also ...???

Da Du CFB-8 benutzen willst, hast Du noch ein anderes Problem: Dieser Modus benutzt einen IV (Initialisierungs-Vektor), ich sehe keine Möglichkeit der Eingabe (und das bedeutet noch mehr implizite Annahmen).

Sir Rufo 25. Jan 2016 13:20

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Zitat:

Zitat von Benutzername12345 (Beitrag 1328104)
Bin mir nicht ganz sicher, ob ich dich richtig verstehe aber bei beiden (online Tool und Delphi) ist das Ergebnis ein Base64 String

Und was gibst du da rein?

Im Web ist UTF8 üblich in Delphi UTF16 :stupid:

mjustin 25. Jan 2016 13:33

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
...

Benutzername12345 25. Jan 2016 13:35

AW: AES-Encryption zwischen Delphi und Rest der Welt
 
Vorweg: Es klappt nun, trotzdem noch Antworten zu allen Fragen.


Zitat:

Zitat von Sir Rufo (Beitrag 1328108)
Und was gibst du da rein?

Im Web ist UTF8 üblich in Delphi UTF16 :stupid:

Hab den Code angepasst mit UTF8Decode bei den Parametern. Allerdings selbes Ergebnis

Zitat:

Zitat von gammatester (Beitrag 1328106)
Du must doch zumindest beim Online-Algorithmus die Schlüssellänge auswählen. (Dort gibt es Rijndael-128, 192, 256. Ich nehme an daß damit AES-xxx gemeint sein soll). Im übrigen muß es schon Verdacht erregen, daß ein Quasi-Stream-Modus wie CFB-8, der Text beliebiger Länge verarbeiten kann, aus 3 Zeichen plötzlich 4 macht. Entweder gleiche Länge oder Vielfaches von 16. Oder ist Deine Angabe "htz5" in Base-64? Umso deutlicher wird es, alles in Bytes zu kommunizieren.

Ist alles Base64

Zitat:

Zitat von gammatester (Beitrag 1328106)
Im übrigen wäre ich skeptisch, wenn gesagt wird uses the mcrypt_encrypt() in PHP ohne daß das genauer spezifiziert ist. In dem PHP manual link wird gesagt, daß, wenn eine Schlüssellänge nicht unterstützt wird, false geliefert wird. Ein 24-Bit Schlüssel a la ASCII "asd" kann nun garantiert nicht benutzt werden. Also ...???

Habe jetzt mal das Tool probiert: http://aes.online-domain-tools.com/

Zitat:

Zitat von gammatester (Beitrag 1328106)
Da Du CFB-8 benutzen willst, hast Du noch ein anderes Problem: Dieser Modus benutzt einen IV (Initialisierungs-Vektor), ich sehe keine Möglichkeit der Eingabe (und das bedeutet noch mehr implizite Annahmen).

Danke. Der Initialisierungsvektor ist bei dem neuen Tool veränderbar.
DEC bietet bei Init als zweitem Parameter
Delphi-Quellcode:
Init(Password, #0, $00);
die Möglichkeit diesen zu setzen.

Lasse mir jetzt alles als Hexvalue statt Base64 ausgeben (da das zweite Tool nur Hex anbietet)
Tool gibt bei Eingabe: Text "asd" Password "617364" (Hexwert von asd) und IV von #0 dem Wert 86dcf9 aus.
Delphi mit den eingangs verwendeten Parametern ebenfalls. Ich vermute also, der Code war die ganze Zeit richtig, das Tool mit dem ich die Richtigkeit prüfen wollte war einfach nur nutzlos :)

Danke euch allen für das (in einem Delphi-Forum) immens schnelle Feedback und schönen Tag


Edit:
Zitat:

Zitat von mjustin (Beitrag 1328110)
Verstehe ich es richtigt: der Webservice ist öffentlich und ohne Authentifizierung erreichbar, nur die Daten sollen verschlüsselt werden? Sobald die Verschlüsselung geknackt ist, müssen dann ja alle Clients erst einmal offline gehen, bis eine neue Lösung gefunden ist ;)

Leider ja.
Haben damals (bei der Erstentwicklung des Webservice) auch Authentifizierungsmethoden gesucht. Allerdings konnte ich damals absolut nichts finden, das kompatibel war zwischen c# REST-Webservice und Delphi Anwendung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 1 von 2  1 2      

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