Eigener Kryptoalgorithmus

#1
Hallo, ich würde hier gerne meinen Algorithmus vorstellen.
Ich behaupte nicht ein Profi zu sein und, dass der Algorithmus hochprofessionell ist. Es ist einer meiner ersten Gehversuche was das anbelangt. Harte Kritik ist erwünscht aber bitte sachlich. Womöglich blamiere ich mich auch aber das Risiko gehe ich ein.
Man kann ihn ja gemeinsam verbessern.

Er ist bewusst in einer einfachen Struktur geschaffen um sehr performancestark zu sein.
Ziel ist es sowohl sicher als auch schnell zu sein.
Daher wurde zumindest in der ersten Version auf S-Boxen verzichtet.

Der Klartextblock mit 128 bit wird in jeder Runde variabel (schlüsselabhängig) "bit geshifted", und zwar in dem die Zahl um die bitweise verschoben wird berechnet wird in dem der Schlüssel modulo 128 genommen wird.
Danach wird der Block in 16 Teile a 8 bit zerlegt und schlüsselbasiert neu geordnet. Das passiert in dem die Nummern der Postionen mit einem Hash-Algorithmus gehasched werden und das Ergebnis modulo 16 genommen wird. Dabei werden die Standardwerte des Hash-Alogorithmus durch den Schlüssel ersetzt. Ohne Schlüssel sollte es nicht möglich sein die ursprüngliche Ordnung widerherzustellen.
Danach wird der wiederzusammengesetzte Block mit dem Schlüssel "gexored" um durch Informationsverlust weitere Sicherheit herzustellen.
Jede einzelne Routine ist schlüsselabhängig.

Die Rundenanzahl ist beliebig wählbar sollte aber mindestens zehn Runden in der Standardversion bzw. Anwendung haben.

Keyshedule:

Der Schlüssel wird jede Runde mit einer Hashfunktion gehashed bei der der Schlüssel die Standardwerte des Hashalgorithmus ersetzt.
Damit sollte es unmöglich sein selbst bei Kenntnis eines Rundenschlüssels Schlüssel vorheriger Runden oder zukünftiger Runden vorherzusagen. Alternativ kann der Schlüssel auch selbst die Verschlüsselungsroutine durchlaufen, was aber Perfomance kosten würde.

In zukünftigen Versionen kann der Algorithmus um S-Boxen erweitert werden und zwar variable 16 S-Boxen die jede Runde schlüsselabhängig geändert werden bzw. wird auch deren Position schlüsselabhängig jede Runde geändert.

Mir ist bewusst, dass der Algortithmus sehr einfach ist, das ist aber bewusst so. Er kann wie gesagt erweitert werden.
 

Chromatin

Moderator
Mitarbeiter
#2
Kannst du das ganze auch in Code packen?

Basic, C/C++, Perl, PHP, Python oder so?
 

SchwarzeBeere

Moderator
Mitarbeiter
#3
1. "in dem der Schlüssel modulo 128 genommen wird" - du meinst wohl eher 2^128?
2. Ich frage mich, wie die Entschlüsselung funktionieren soll, denn durch die Hash-Funktion kannst du die zweite Transposition nicht mehr rückgängig machen...
3. Das xor am Ende bringt nichts. Je nach Implementierung wären womöglich sogar Seitenkanalangriffe denkbar, die zur Kompromittierung des Schlüssels führen könnten.
4. Ich sehe hier nur Transposition, jedoch keine Subsitution...
5. "Sollte aber mindestens 10 Runden"... Warum gerade 10? Wie kommst darauf?
6. Die Performance hängt von vielen Faktoren ab, z.B. auch von der Möglichkeit zur Parallelisierung. Deine Hauptaufgabe ist das Hashen, wobei die Hashes wieder auf eine Zielmenge von 16 mögliche Werte reduziert werden. Bei den kryptographisch sicheren Algorithmen würde also viel umsonst gearbeitet werden. Bei nicht sicheren Algorithmen wäre auch deiner hier nutzlos.
7. usw...

Hier fehlt leider alles. Eine mathematische Beschreibung, ein Beweis der Korrekheit, ein Nachweis der Sicherheit und der Geschwindigkeit, Haufenweise Annahmen (wie muss beispielsweise die Hashfunktion beschaffen sein?), usw. Oder auch nur eine Definition von "sicher" und "performancestark".

Es es gibt einen Grund, warum man niemals ein eigenes Kryptosystem entwerfen sollte.
 
Zuletzt bearbeitet:
#4
Hallo,

danke für deine Kritik auch wenn ich sie nicht ganz nachvollziehen kann.

1. Nein ich meine modulo 128
2. Doch ist sie meines Erachtens wenn ich mich nicht irre.
3.Warum? AES zum Beispiel verwendet auch XOR am Ende. Das hat auch seinen Sinn nämlich Informationsverlust.
4.Inzwischen habe ich den Algorithmus um die AES S-Box erweitert.
5. Erhöhte Rundenzahlen erhöhen, wie du ja sicher weisst, die Sicherheit. Die Sicherheit der Verfahren greiffen vor allem bei mehreren Runden. 10 Runden sind meines Erachtens das Minimum um ein Mindestmass an Sicherheit zu gewährleisten. Ich werde darauf gerne noch näher eingehen.
6.Ich glaube du hast da etwas falsch verstanden. Die Hashfunktion dient in der zweiten Routine nur der sicheren und ohne Schlüssel unumkehrbaren Zuordnung.

Zum letzten Punkt: Ja da hast du Recht. Wie gesagt es ist ein erster Gehversuch. Ich versuche das "nachzuliefern".

Auch deinem letzten Satz kann ich nicht zustimmen.

Ich würde mich freuen, wenn mehr Leute Ihre eigenen Algorithmen veröffentlichen würden.
Dadurch kann man lernen und sich gemeinsam an Kryptoanalyse und Verbesserung versuchen.

Liebe Grüsse

P.S.: Wie gesagt ich behaupte kein Profi zu sein
 
Zuletzt bearbeitet:

SchwarzeBeere

Moderator
Mitarbeiter
#5
Also ich versuche mal den Ansatz einer verständlichen Beschreibung. Bitte korrigier mich, wenn ich irgendwo falsch liege:

Eingaben:
- p als Element aus N "Plaintext", p = b[0], b[1], ... , b 128 Bit lang
- k als Element aus N "Symmetrischer Schlüssel", 128 Bit lang
- h(x) ist eine kryptographische Hashfunktion

0) c = b
1) x = c >> (k mod 128 ), es gibt 128 mögliche Ergebnisse, Spezialfall: k mod 128 = 0 -> kein Shift
2) x = x[0], x[1], ..., x[15] wobei jedes x[j], j=0...15 ein Byte groß ist.
3) x_neu = x[h(0) mod 16], ..., x[h(15) mod 16], es gibt 2^16 mögliche Ergebnisse
Mir ist nicht klar, was du mit den Standardwerten des Hash-Algorithmus meinst. Auch lässt sich das nun nicht mehr rückgängig machen, d.h. Du kommst nicht von x_neu auf x. Ganz davon abgesehen kannst du nicht ausschließen, dass h(x)!=h(y) für x!=y und x, y aus der Eingabemenge, wie sie auch immer aussehen mag. Whatever, weiter im Text.
4) c = x_neu xor k, und nein, AES macht das nicht so.
5) Beginne bei 1) bis 10 Runden durchlaufen wurden.

So. Und wie genau funktioniert jetzt die Entschlüsselung? Und warum soll das sicher/effizient sein?
 
Zuletzt bearbeitet:
#6
Hallo,

danke für deine Antwort.

Warum ich denke, dass es eine gewisse Sicherheit bietet:

Ich habe den Algorithmus um ein "Whitening" am Anfang jeder Runde durch XORen mit dem Teil-/bzw. Rundenschlüssel erweitert.

Das verhindert teilweise Verschlüsselung.

Die schlüsselabhängige Rotation stellt neben der S-Box den nicht-linearen teil dar.

(3 bit pro byte für die Verschiebung und ein bit um die Richtung des shifts zu bestimmen).

Die AES-S-Box stellt neben der Rotation den nicht-linearen Teil der Operation dar.

Die AES S-Box, da sie von Profis entwickelt wurde und meines Wissens gegen lineare und differientielle Kryptoanalyse gehärtet ist (so zumindest der Anspruch).

Die schlüsselbasierte Transposition ist meines Erachtens so wichtig, da Sie Zusammenhänge im Klartext bitweise zerreisst, und gleichzeitig statistisch gesehen jedes byte von jedem anderen abhängig macht und das in jeder Runde.

Wenn es keinen shortcut gibt bietet das eine Sicherheit bzw. Komplexität von 128x127x126........(leider bin ich nicht in der Lage die Komplexität zu berechnen, vielleicht kann mir jemand helfen).

Danach wird der Block gexored, was eine Sicherheit/Komplexität von 2^128 bzw. 128 bit darstellt.

Effizient soll das ganze sein, da es in der Regel auf Standardoperationen des Prozessors beruht.

Liebe Grüsse

P.S.: Mit den Standartwerten meine ich die beispielweise bei md5 die 4 32 bit Wörter ABCD.
 
Zuletzt bearbeitet:
Oben