>>> f=open("MD.py",'r') >>> m=f.read() >>> h(m) '3AC65C70484C014F7541E74C42E902EB14D376FE5D8CBA215BC834EDE2BEDB7F' >>>
Ein Problem gibt es doch! Wenn der zweite
Zeiger um genau eine Position weitergedreht ist, im
Vergleich zum ersten Zeiger und auf die Eins, den Wert 1,
zeigt. Was passiert dann?
Der erste Zeiger wird weitergedreht, zeigt dann ebenfalls
auf die Eins. Der zweite Zeiger wird
dann einen Schritt weitergedreht (Die Eins!).
Die Karten werden
getauscht und was ist passiert? Der zweite Zeiger ist
wieder genau eine Position weitergedreht und zeigt
auch erneut auf die Eins. Uups - daran ändert sich
jetzt nichts mehr. Nach nur N x (N-1) Schritten, wenn
wir N Karten haben, wiederholt sich alles.
Wir können RC4 noch perfektionieren, indem wir den ersten Zeiger nicht regelmäßig umlaufen lassen sondern dafür sorgen, dass bereits der erste Zeiger scheinbar völlig regellos umherspringt. Ja, wir bauen einen zweistufigen RC4. Wir benutzen den RC4-Algorithmus also zunächst nur dazu, um scheinbar völlig zufällig erscheinende Position des ersten Zeigers i zu berechnen. Dieser zweistufige RC4 ist endgültig unknackbar.
Aber auch bereits mit einer winzigen Änderung kann der RC4-Algorithmus wesentlich verbesset werden. Mit einer zusätzlichen Vertauschung. Wir drehen den zweiten Zeiger jetzt erneut und zwar auf die Position, auf die er nach der Drehung zeigt (j = s[j]). Dank dieser kleinen Änderung, können die kurzen Zyklen nicht mehr auftreten. Dieser abgeänderte Algorithmus ist als VMPC bekannt. Wenn wir mit beiden Zeigern in der gleichen Position starten, zum Beispiel beide null, ist auch RC4 kaum noch knackbar. Aber bei VMPC können wir, mit völlig beliebigen zufällig gewählten Positionen der Zeiger starten. Wie das scheinbar zufällige One-Time-Pad aus den Zeigerposition und den Werten auf die sie zeigen berechnet wird, ist nicht entscheidend. Wir könnten auch ganz schlicht die Position des zweiten Zeigers verwenden. Mein Tipp, wir nehmen RC4, besser noch VMPC mit der zusätzlichen Vertauschung als Vorlage und machen es noch ein winziges Bisschen komplizierter - fertig ist die perfekte Chiffre. Tatsächlich unknackbar, wenn das Passwort nicht mehrfach verwendet wird. Wenn Details des Verfahrens unbekannt sind, kann die Chiffre auch mit noch so viel Rechenpower niemals geknackt werden.
#include <stdio.h> #include <string.h> #define N 256 main(int argn, char **argv){ int s[N]; int klen,t,i,j=0; int w=3, c; if (argn != 2){ fprintf(stderr, "usage: cat file | ./a.out password\n"); return 0; } klen = strlen(argv[1]); for (i=0;i < N; i++) s[i] = (i + klen) % N; for (i=0;i < N; i++){ j = (j + s[i] + argv[1][i % klen]) % N; t = s[i] + s[j]; s[i] = t - s[i]; s[j] = t - s[j]; } i = s[0]; j = s[0] + s[1]; while ((c = fgetc(stdin)) != -1){ i = (i + w) % N; j = (j + s[i]) % N; j = s[j]; if (i == 3) w = (w + 2) % N; t = s[i]; s[i] = s[j]; s[j] = t; printf("%c", c ^ t); } }
#include <stdio.h> #include <string.h> #define N 256 #define ROUNDS 13 main(int argn, char **argv){ int s[N]; int klen,t,i,j=0; int r,c; if (argn != 2){ fprintf(stderr, "usage: cat file | ./a.out password\n"); return 0; } klen = strlen(argv[1]); for (i=0;i < N; i++) s[i] = (i + klen) % N; for (r=0; r < ROUNDS; r++) { for (i=0;i<N; i++){ j = (j + s[i] + argv[1][i % klen]) % N; t = s[i] + s[j]; s[i] = t - s[i]; s[j] = t - s[j]; } } i = s[0]; j = s[0]; while ((c = fgetc(stdin)) != -1){ i = (i + 1) % N; j = s[(j + s[i]) % N]; t = s[i] + s[j]; s[i] = t - s[i]; s[j] = t - s[j]; printf("%c", c ^ s[t % N]); } }
Meine Tankstelle
Quelldatei 5.c
Wir können einen deterministischen Pseudo-Zufallsgenerator auch benutzen zufällige, jedenfalls zufällig erscheinende, Substituition zu berechnen.
Wir können auch die Verkablung in Rotormaschinen wie der bekannten ENIGMA auch durch einen solchen Zufallsgenerator bestimmen, ebenso die Rotorstellungen. Damit erhalten wir eine wahrhaft extrem sichere Verschlüsselung, sogar mit Prüfsumme.
Mit Javascript wird auf dem eigenen Endgerät, zum Beispiel Smartphone, ver- und wieder entschlüsselt. Perfekt - Ende-zu-Ende - was dazwischen passiert ist egal, weil die Nachricht nicht entschlüsselt werden kann.
Einfach irgendwo im Internet herunterladen,
leicht modifizieren, fertig ist die perfekte Chiffre,
die keiner knackt. Nein - die NSA schon gar nicht, wenn jeder seine eigene Variante von
RC4/Spritz benutzt.
Das One-Time-Pad ist eine Zufallsfolge und wird aus einem nur einmalig zu verwendenden Schlüssel erzeugt. Der „Klartext“ wird Zeichen für Zeichen mit der Zufallsfolge verknüpft, um die Daten zu verschlüsseln.
Das Verfahren berechnet eine zufällig gewählte Vertauschung der Reihenfolge oder Substitution der Zahlen 0 bis 255. Diese „S-Box” wird in einem ersten Schritt aus dem geheimen Schlüssel berechnet und anschließend zur Berechnung der Zufallsfolge verwendet. Nach jedem Berechnungsschritt werden zwei Werte der „S-Box” vertauscht. Für die Besetzung der „S-Box” und die Werte zweier weiterer Variablen gibt es praktisch unbegrenzt viele Möglichkeiten etwa zwei hoch eintausendsiebenhundert, weit mehr Möglichkeiten als wir uns überhaupt vorstellen können, mehr als es Atome im Sonnensystem gibt.
Das Passwort kann aus der gesamten Nachricht und
der Zeit in Sekunden, zur Vereinfachung auch
Stunden oder Tage, seit einem festen Zeitpunkt berechnet
weren. Dazu könnte eine Hashfunktion benutzt werden, aufzurufen auf
der Linux-Console mit sha1sum.
Wird RC4 oder Spritz mit diesem
einmaligen Passwort als Schlüssel benutzt, ist das Verfahren
entsprechend bekannter Analysen absolut sicher.
Es gibt auch noch quasi beliebig viele Möglichkeiten noch Details an dem Verfahren zu variieren.
Die Sicherheit wird dadurch keinesfalls negativ beeinflusst, vorausgesetzt
die Chiffre ist NICHT komprmierbar. Bei
Geheimhaltung der im Einzelfall benutzen Variante bleibt das
Verfahren sogar dann sicher, wenn das Passwort dem Hacker bekannt ist.
Durch Verschlüsselung können die Daten im Internet preiswert und einfach gespeichert werden ohne die Datensicherheit zu gefährden, obgleich die von vermeintlichen Experten oft in Abrede gestellt wird. Die Festplatte des Rechners wird damit gar nicht mehr zwingend benötigt. Der flüchtige Arbeitsspeicher, der beim Ausschalten des Rechners automatisch gelöscht wird, reicht vollkommen aus. Ideal sind Linux-Systeme (Ubuntu oder Knoppix), die von der nicht beschreibaren CD oder DVD gestartet werden.
Es wird häufig bezweifelt, dass es wirklich sichere Verschlüsselung möglich sei und besondere Spezialprogramme erfordere. Eindeutig Unsinn - das Einmalblock- oder One-Time-Pad-Verfahren ist sogar absolut mathematisch beweisbar sicher. Bei diesem Verfahren wird ein einmaliger und rein zufälliger geheimer Schlüssel ebenso lang wie die Nachricht verwendet. Dieser eventuell sehr lange Schlüssel, eine Zufallsfolge, kann aus einem wesentlich kürzeren Passwort berechnet werden. Zur Berechnung der Zufallsfolge können relativ einfache WWWCrypt 2.0-Varianten benutzt werden. Wird das Passwort nur einmalig benutzt und bleibt geheim, ist ein solches Verfahren wirklich sicher.
Trotz seiner Einfachheit kann diese Software kaum noch wesentlich
verbessert werden. Die Berechnung ist auf jeder Hardware extrem schnell,
meist wesentlich schneller als die Datenübertragung. Die Zufallswerte
ändern sich mit der Nachricht. Ein Passwort könnte sogar mehrfach
verwendet werden. Maximale Sicherheit wird mit einer individuellen, in
wenigen Details modifizierten, Software erreicht, wenn diese Details
geheim bleiben. Mit einer solchen Software kann durch Ende-zu-Ende-Verschlüsselung maximale Sicherheit erreicht werden zu sehr geringen Kosten.
ubuntu@ubuntu:~$ sha1sum arc4.c aa4e0edec3ad925cd5c75be71ffb8f6d025b350c rc4.c ubuntu@ubuntu:~$ gcc arc4.c ubuntu@ubuntu:~$ cat arc4.c | ./a.out pw123 > r ubuntu@ubuntu:~$ cat r | ./a.out pw123 D > arc4.copy ubuntu@ubuntu:~$ diff arc4.c arc4.copy ubuntu@ubuntu:~$ gzip arc4.copy ubuntu@ubuntu:~$ ls -l arc4.c* -rw-r--r-- 1 ubuntu ubuntu 1590 2011-03-15 15:53 arc4.c -rw-r--r-- 1 ubuntu ubuntu 692 2011-03-17 17:58 arc4.copy.gz ubuntu@ubuntu:~$ gzip r ubuntu@ubuntu:~$ ls -l r.gz -rw-r--r-- 1 ubuntu ubuntu 1615 2011-03-17 17:58 r.gz
Externe Links
Externer Link (Javascript)
![]() |