Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Verbindung verschlüsseln ( RSA + AES ) (https://www.delphipraxis.net/166606-verbindung-verschluesseln-rsa-aes.html)

jokerfacehro 21. Feb 2012 15:02


Verbindung verschlüsseln ( RSA + AES )
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe eine kleine Lib erstellt namens CryptConn.

Diese dient zur verschlüsselten Übertragung von Daten per Delphi zu PHP und umgekehrt.

Es wird vor dem Senden ein zufälliger AES-Schlüssel generiert. Mit diesem wird der Text verschlüsselt
und der Schlüssel wird RSA-verschlüsselt mitgeschickt.

Verwendet wurde: AES-CBC 128Bit Key mit Padding und RSA-OAEP mit einem leeren Init-Hash (kann leicht geändert werden)


In der Delphi-Unit wurde ein Standard-Random verwendet, dieses kann aber leicht ausgetauscht werden.
In der PHP-Unit wurde ein relativ sicherer Random-Algo verwendet.


Folgende Libs wurden verwendet:

Delphi:

- DEC von negaH
(SHA1, AES, Base64)

- BigInteger von F. Rienhardt aka peanut (editiert von mir)
->Basis 256 hinzugefügt
(RSA)


PHP:

- SecurePHPLib



Weitere Angaben:


Der AES Schlüssel hat eine feste Länge von 128Bit.
Der RSA-Algo ist auf Delphi-Seite fest für Längen <= 20 Zeichen gestaltet ( kann aber leicht für beliebige Längen modifiziert werden).

Auf PHP-Seite gibt es keine Einschränkungen.


Für jeden Aufruf wird ein neuer AES-Schlüssel generiert.

Die RSA-Schlüssel müssen vorher ausgetauscht werden.
Im PHP-Script sind die Schlüssel Base64-kodiert um sie im Quelltext unter zubringen und sind im PKCS1-Format.

Es können beliebige Formate genutzt werden (einfach mal in die RSA.php schauen).


Die RSA-Schlüssel in der Delphi-Unit liegen als BigInteger ( e, d, n) vor.
Andere Formate müssen selber implementiert werden ;)


PHP-Seitig können vorinstallierte Libs wie mcrypt etc. genutzt werden, sind aber nicht notwendig.

Hauptsächlich wurden Teile der securePHPLib nach Delphi übertragen.



Edit: Ihr könnt die Lib frei verwenden und abändern. Sie ist sicherlich noch nicht perfekt. Falls jemand diese erweitert, bitte hier reinposten, damit alle etwas davon haben :)

Edit 2: Fehler mit Randomize, Random und XOR korrigiert


Keywords: RSA , AES , Verschlüsselung , Kodierung , Encode , Encryption

gammatester 22. Feb 2012 09:14

AW: Verbindung verschlüsseln ( RSA + AES )
 
Ein paar Bemerkungen zu CryptConn
  • Randomize wird bei jeder AES-Schlüsselerzeugung aufgerufen und auch sonst noch einige Male! Das ist kontraproduktiv und vermindert die eh schon schlechte Sicherheit.
  • Selbst wenn random optimal wäre, ist der AES-Schlüssel nicht zufällig: Es müßte zumindest char(random(256)) heißen!
  • Es wird keine Möglichkeit gegeben, andere als den fixen RSA-Schüssel zu erzeugen. Wozu also die ganze RSA-Verschlüsselei?
und zu BigInt
  • Die reingehackte Initialisierung mit Basis 256 ist im besten Fall falsch, kann aber auch crashen, weil immer mindestens 4 Bytes verarbeitet werden: 1 (base 256) -> '16777216'
  • 2 und 5 sind abgeblich nicht prim!
  • 2^3 mod(-10) hängt (in BarrettReduction)
  • 3^(-1) mod 10 gibt 3, richtig ist 7
  • x.gcd(0) hängt
  • etc

jokerfacehro 22. Feb 2012 09:59

AW: Verbindung verschlüsseln ( RSA + AES )
 
Zitat:

Randomize wird bei jeder AES-Schlüsselerzeugung aufgerufen und auch sonst noch einige Male! Das ist kontraproduktiv und vermindert die eh schon schlechte Sicherheit.
Danke für die Info. Wie gesagt, ist die externe RandomLib von DEC dabei.


Zitat:

Selbst wenn random optimal wäre, ist der AES-Schlüssel nicht zufällig: Es müßte zumindest char(random(256)) heißen!
wurde von vornherein gesagt, dass die Delphi-Random-Funktion nicht sicher ist.


Delphi-Quellcode:
char(random(256))
ist falsch, da der Wertebereich von 0 bis 255 geht.


Zitat:

Es wird keine Möglichkeit gegeben, andere als den fixen RSA-Schüssel zu erzeugen. Wozu also die ganze RSA-Verschlüsselei?
Von Schlüsselgenerierung habe ich nichts gesagt.
Diese ist aber leicht mit der securePHPLib zu bewerkstelligen.

Die eingetragenen Schlüssel sind nur Beispielwerte zum Testen.


Zitat:

Die reingehackte Initialisierung mit Basis 256 ist im besten Fall falsch, kann aber auch crashen, weil immer mindestens 4 Bytes verarbeitet werden: 1 (base 256) -> '16777216'
Die Funktion ist so aus der securePHPLib übernommen.



Danke für die Info. Für die weiteren Sachen habe ich gerade keine Zeit.

gammatester 22. Feb 2012 10:14

AW: Verbindung verschlüsseln ( RSA + AES )
 
Zitat:

Zitat von jokerfacehro (Beitrag 1152273)
Delphi-Quellcode:
char(random(256))
ist falsch, da der Wertebereich von 0 bis 255 geht.

Nein, Dein random(255) ist falsch, weil es nur Werte von 0 .. 254 liefert. Es kommen also nicht alle möglichen Werte 0 .. 255 vor!

jokerfacehro 22. Feb 2012 10:22

AW: Verbindung verschlüsseln ( RSA + AES )
 
:oops: da steht wirklich nur < Range in der Hilfe, hatte das überlesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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