Verschlüsselungsalgorithmen

Hi!

Ich habe vor ein Computerprogramm zu entwickeln (Client/Server), bei dem alle Daten verschlüsselt übertragen werden (da es sich um potentiell sensitive Daten handelt).

Der Server soll die Daten (es handelt sich um Dateien) zudem verschlüsselt in einer Datenbank speichern.

Der Algorithmus sollte als relativ sicher gelten (also so 128bit aufwärts) und mit public-private-key Verfahren arbeiten. Zudem sollte er für große Datenmengen geeignet sein und einigermassen schnell sein (on the fly ein paar Megabyte unter Umständen verschlüsseln).

Habe mir mal ein paar Sachen angeschaut, bei RSA hieß es, dass er eher für kleine Messages benutzt wird. Aber ich hab nichts wirklich alternatives gefunden. Was eignet sich? Ich suche eine Seite mit Erklärung der Algorithmen und source-code bzw. pseudocode. Ich möchte aus verschiedenen Gründen nicht auf eine fertige Bibliothek zugreifen.

Grüße
Bruno

Hi!

Ich habe vor ein Computerprogramm zu entwickeln
(Client/Server), bei dem alle Daten verschlüsselt übertragen
werden (da es sich um potentiell sensitive Daten handelt).

Der Server soll die Daten (es handelt sich um Dateien) zudem
verschlüsselt in einer Datenbank speichern.

Dann achte darauf, daß Du im ECB (Electronic Code Book) Mode verschlüsselst.

Der Algorithmus sollte als relativ sicher gelten (also so
128bit aufwärts) und mit public-private-key Verfahren
arbeiten.

Warum muß es unbedingt asymmetrische Kryptographie sein?
(Bei asymm. Krypt. wäre ein 128bit Schlüssel btw. eher niedlich)

Gerade bei einer Datenbankanwendung, bei der die Daten ja auch wieder in die andere Richtung müssen, belastest Du Dich bzw. den Server da mit _erheblichem_ Rechnaufwand! Ich würde da dringend zu einem symmetrischen Algorithmus raten, also nicht public key Kryptographie, sondern shared secret. Bei Bedarf können wir das Thema gern vertiefen…

Zudem sollte er für große Datenmengen geeignet sein
und einigermassen schnell sein (on the fly ein paar Megabyte
unter Umständen verschlüsseln).

Für diesen Zweck ist wirklich ein symmetrischer Algorithmus besser geeignet. Standard ist hier AES, mit bis zu 256bit Schlüssellänge.

Habe mir mal ein paar Sachen angeschaut, bei RSA hieß es, dass
er eher für kleine Messages benutzt wird. Aber ich hab nichts
wirklich alternatives gefunden. Was eignet sich?

Also, wenn Du unbedingt was asymm. haben möchtest, wäre ein Blick auf Rabin public key encryption, ElGamal public k.enc. oder auch Chor-Rivest knapsack enc. vielleicht hilfreich. Leider wirst Du auch bei diesen Probleme mit Durchsatz und großen Datenmengen (Ciphertext ist ~ doppelt so groß wie plain text!) bekommen.

Ich suche
eine Seite mit Erklärung der Algorithmen und source-code bzw.
pseudocode. Ich möchte aus verschiedenen Gründen nicht auf
eine fertige Bibliothek zugreifen.

Du willst dieses Buch: http://www.amazon.de/exec/obidos/ASIN/0849385237/qid…

Als PDF bekommst Du es auch hier: http://www.docvalde.net/docs/002.rar
Benutzen und weitergeben in elektronischer Form ist erlaubt, Ausdruck und Binden ist verboten.

AES bzw. Rijndael (so heisst der Algorithmus) steht da noch nicht drin, dafür müsstest Du woanders nachschauen.

Gruß,

Doc.

Der Algorithmus sollte als relativ sicher gelten (also so
128bit aufwärts) und mit public-private-key Verfahren
arbeiten. Zudem sollte er für große Datenmengen geeignet sein
und einigermassen schnell sein (on the fly ein paar Megabyte
unter Umständen verschlüsseln).

Habe mir mal ein paar Sachen angeschaut, bei RSA hieß es, dass
er eher für kleine Messages benutzt wird. Aber ich hab nichts
wirklich alternatives gefunden. Was eignet sich? Ich suche
eine Seite mit Erklärung der Algorithmen und source-code bzw.
pseudocode. Ich möchte aus verschiedenen Gründen nicht auf
eine fertige Bibliothek zugreifen.

Hallo Bruno!

Schau mal hier:
Wo erhalte ich Grundlagen-Informationen zur Kryptografie? [FAQ:412]

Für das „Handbook of Applied Cryptography“ existieren auch Codebeispiele.

CU
Markus

[ergänzend zu den Hinweisen meiner kompetenten Vorschreiber…]

Ich habe vor ein Computerprogramm zu entwickeln
(Client/Server), bei dem alle Daten verschlüsselt übertragen
werden (da es sich um potentiell sensitive Daten handelt).

Der Server soll die Daten (es handelt sich um Dateien) zudem
verschlüsselt in einer Datenbank speichern.

Ok.

Der Algorithmus sollte als relativ sicher gelten (also so
128bit aufwärts)

Das ist kein gutes Kriteium für dis Sicherheit. Zahlen sind zwischen verschiedenen Algorithmen nicht sinnvoll vergleichbar…

Gängige asymmetrische Verfahren kann man bei 128 bit in der Pfeife rauchen…

und mit public-private-key Verfahren
arbeiten. Zudem sollte er für große Datenmengen geeignet sein
und einigermassen schnell sein (on the fly ein paar Megabyte
unter Umständen verschlüsseln).

Du könntest - analog wie bei PGP/PuPG ein public-key und ein symmetrisches Verfahren kombinieren: Hohe Geschwindigkeit bei gleichzeitig annehmbarer Rechenleistung.

Habe mir mal ein paar Sachen angeschaut, bei RSA hieß es, dass
er eher für kleine Messages benutzt wird. Aber ich hab nichts
wirklich alternatives gefunden. Was eignet sich? Ich suche
eine Seite mit Erklärung der Algorithmen und source-code bzw.
pseudocode.

http://www.gnupg.de/ USTL

Ich möchte aus verschiedenen Gründen nicht auf
eine fertige Bibliothek zugreifen.

Warum, wenn ich fragen darf?

Sebastian

Dann achte darauf, daß Du im ECB (Electronic Code Book) Mode
verschlüsselst.

Was ist das? Mir ist übrigens aufgefallen, dass das vielleicht sowieso keine gute Idee ist mit dem verschlüsselt abspeichern. Wenn dann der private key mal verloren geht, sind die Daten auch hinüber.

Gerade bei einer Datenbankanwendung, bei der die Daten ja auch
wieder in die andere Richtung müssen, belastest Du Dich bzw.
den Server da mit _erheblichem_ Rechnaufwand! Ich würde da
dringend zu einem symmetrischen Algorithmus raten, also nicht
public key Kryptographie, sondern shared secret. Bei Bedarf
können wir das Thema gern vertiefen…

Ja hast recht, die asynchrone Verschlüsselung macht nur Sinn zwischen den Clients und dem Applikations-Server.

Zudem sollte er für große Datenmengen geeignet sein
und einigermassen schnell sein (on the fly ein paar Megabyte
unter Umständen verschlüsseln).

Für diesen Zweck ist wirklich ein symmetrischer Algorithmus
besser geeignet. Standard ist hier AES, mit bis zu 256bit
Schlüssellänge.

Das habe ich mir mal angeschaut, sieht vielversprechend aus.

Warum, wenn ich fragen darf?

Das frage ich mich inzwischen auch :wink:
ich glaub so detailliert wollte ich mich dann doch nicht damit befassen um sowas selbst zu implementieren und ich habe zu AES auch schon offene Implementierungen gesehen, die man wohl einfach übernehmen kann.

Dann achte darauf, daß Du im ECB (Electronic Code Book) Mode
verschlüsselst.

Was ist das? Mir ist übrigens aufgefallen, dass das vielleicht
sowieso keine gute Idee ist mit dem verschlüsselt abspeichern.
Wenn dann der private key mal verloren geht, sind die Daten
auch hinüber.

Es gibt bei eigentlich jedem Block Cipher verschiedene Operation Modes, in denen man den laufen lassen kann. Diese erhöhen teilweise nochmals die Sicherheit (das ist recht kompliziert, Details stehen in dem mehrfach genannten Buch). Das Prinzip ist, daß eben nicht unbedingt jeder Block mit dem vereinbarten Schlüssel verschlüsselt werden muß, sondern daß die Verschlüsselung eines Blockes von dem vorangegangenen Block abhängt. Das macht aber bei Datenbankanwendungen, bei denen man ja auf jeden Block einzeln, also unabhängig von den anderen, zugreifen können muß, keinen Sinn. Der „ECB Mode“ ist ganz einfache Verschlüsselung, so wie man sie sich zunächst vorstellt.

Gerade bei einer Datenbankanwendung, bei der die Daten ja auch
wieder in die andere Richtung müssen, belastest Du Dich bzw.
den Server da mit _erheblichem_ Rechnaufwand! Ich würde da
dringend zu einem symmetrischen Algorithmus raten, also nicht
public key Kryptographie, sondern shared secret. Bei Bedarf
können wir das Thema gern vertiefen…

Ja hast recht, die asynchrone Verschlüsselung macht nur Sinn
zwischen den Clients und dem Applikations-Server.

Selbst da nicht wirklich… Warum tust Du Dir diesen Aufwand an?
Der Server kann die Datenbank selbst symmetrisch verschlüsseln - kein Thema.

Für den Verkehr zw. Clients und Server scheint mir (je nach Sicherheitsbedarf) Sebastians Vorschlag wirklich der beste zu sein:

Dynamische Sitzungsschlüssel, die mittels RSA o.ä. ausgetauscht werden, und dann symm. Verschlüsselung mit 256bit-AES.

Du bekommst sonst spätestens im internen Netz >= 10MBit/s massive Performance-Probleme. Asymmetrische Verschlüsselung ist _langsam_. Richtig langsam, erst recht, wenn man’s in Software macht. Ich kann Dir jetzt leider keine Zahlen nennen, was für einen Durchsatz bspw. RSA auf einem handelsüblichen PC z.Zt. schafft, aber Du wirst da nicht glücklich mit. Aber Du kannst es ja mal ausprobieren, indem Du mit einer offenen lib mal 1GB Daten verschlüsselt und die Zeit misst.

Zudem sollte er für große Datenmengen geeignet sein
und einigermassen schnell sein (on the fly ein paar Megabyte
unter Umständen verschlüsseln).

Für diesen Zweck ist wirklich ein symmetrischer Algorithmus
besser geeignet. Standard ist hier AES, mit bis zu 256bit
Schlüssellänge.

Das habe ich mir mal angeschaut, sieht vielversprechend aus.

AES ist derzeit state-of-the-art bei den symm. Algorithmen.

However, viel Erfolg & Gruß,

Doc.

Warum, wenn ich fragen darf?

Das frage ich mich inzwischen auch :wink:

gut. denn nix ist einfacher, als einen an sich starken algorithmus durch implementationsfehler angreifbar zu machen - siehe wireless lan…

ich glaub so detailliert wollte ich mich dann doch nicht damit
befassen um sowas selbst zu implementieren und ich habe zu AES
auch schon offene Implementierungen gesehen, die man wohl
einfach übernehmen kann.

wobei aes nicht wirklich zu den public-key algorithmen zaehlt…
ausserdem waren da die cypherpunks gerade am jubeln, dass sie die funktion jetzt geschlossen darstellen koennen :wink:
im prinzip eine vereinfachung der brute-force attacke um viele groessenordnungen, hier allerdings noch nicht wirklich in regionen wo man sich sorgen machen muesste…

joachim

joachim