ubuntu@ubuntu:~$ echo "pwxABC_1" | sha1sum 4ef9dda1d4774b342b9af84d1ae2df8054e5d214 - ubuntu@ubuntu:~$ echo "pwxABC_2" | sha1sum 9334971f1dd7fff2e7152816d206ee60fb0c5d45 - ubuntu@ubuntu:~$ echo "pwxABC_3" | sha1sum 12b0c2a2e263cfcd5ded13eba15a92bcb20fc363 -
Daten, das heißt Texte, Bilder und beliebige Dokumente und Dateien können durch ein Verschlüsselungsverfahren gegen unberechtigtes Lesen und Kopieren und zugleich gegen Manipulationen zuverlässig geschützt werden. Die Daten werden dabei mittels eines Kennworts in eine nicht lesbare Form konvertiert, also verschlüsselt. Entschlüsselt, also wieder lesbar gemacht werden können die Dokumente nur bei Kenntnis des Kennworts. Die einzige Möglichkeit die Dokumente zu lesen, ohne Kenntnis des Kennworts, ist dieses zu erraten. Bei einem hinreichend langem zufälligem Kennwort ist dies praktisch unmöglich.
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 absolut sicher. Bei diesem Verfahren wird ein einmaliger und rein zufälliger geheimer Schlüssel ebenso lang wie die Nachricht verwendet. Dieser lange Schlüssel, eine Zufallsfolge, kann aus einem wesentlich kürzeren Kennwort berechnet werden. Zur Berechnung der Zufallsfolge können relativ einfache Verfahren wie Arcfour benutzt werden. Wird das Kennwort nur einmalig benutzt ist ein solches Verfahren praktisch sicher.
Trotz seiner Einfachheit kann das Programm kaum wesentlich verbessert werden. Die Berechnung ist extrem schnell, wesentlich schneller als die Datenübertragung. Da die Zufallswerte von der Nachricht abhängen, könnte ein Kennwort mehrfach verwendet werden. Maximale Sicherheit wird mit einem individuellen, in wenigen Details modifizierten, Programm erreicht, wenn diese Details geheim bleiben. Auf welchem Server im Netz die verschlüsselten Daten liegen und wie sie übertragen werden spielt keine Rolle. Mit dieser Software kann eine Ende-zu-Ende-Verschlüsselung mit maximaler Sicherheit erreicht werden und das zu geringen Kosten.
/* * compile: gcc rc4.c * encrypt: cat data.dat | ./a.out secretX > data.crypt * decrypt: cat data.crypt | ./a.out secretX D > data.copy */ #include <stdio.h> #include <string.h> unsigned char S[256]; unsigned int i, j; void swap(unsigned char *s, unsigned int i, unsigned int j) { unsigned char temp = s[i]; s[i] = s[j]; s[j] = temp; } /* KSA */ void rc4_init(unsigned char *key, unsigned int key_length) { int nrepeat; for (nrepeat=0; nrepeat<11; nrepeat++){ for (i = j = 0; i < 256; i++) { j = (j + key[i % key_length] + S[i]) & 255; swap(S, i, j); } } } /* PRGA */ unsigned char rc4_output() { i = (i + 1) & 255; j = (j + S[i]) & 255; swap(S, i, j); return S[(S[i] + S[j]) & 255]; } int main(int narg, char **argv) { int c, k; int out; unsigned char key[] = "Secret1234X"; // key hardcoded to "Secret" for (i = 0; i < 256; i++) S[i] = i; if (narg == 1){ rc4_init(key, 6 + 5); // length of key is 6 in this case } else { rc4_init("Pass1", strlen("Pass1")); rc4_init(argv[1], strlen(argv[1])); rc4_init("Pass2", strlen("Pass2")); } i = j = 7; /* skip 1023 bytes */ for(k=0; k < 1023; k++) rc4_output(); while ( (c = fgetc(stdin)) != -1) { out = c ^ rc4_output(); printf("%c", out); if (narg > 2){ j = (j + out) % 256; } if (narg == 2){ j = (j + c) % 256; } } }Es folgt eine weitere Varainte von Arcfour. Hier wird zweifach verschlüsselt, zusätzlich mit der Originalversion von Arcfour. Als Schlüssel wird hier die S-Box aus der ersten Variante benutzt.
/* * compile: gcc arc4.c * encrypt: cat data.dat | ./a.out secretX > data.crypt * decrypt: cat data.crypt | ./a.out secretX D > data.copy */ #include <stdio.h> #include <string.h> unsigned char S[256]; unsigned int i, j; unsigned char S_00[256]; unsigned int i_00, j_00; void swap(unsigned char *s, unsigned int i, unsigned int j) { unsigned char temp = s[i]; s[i] = s[j]; s[j] = temp; } /* KSA */ void rc4_init(unsigned char *key, unsigned int key_length) { int nrepeat; for (nrepeat=0; nrepeat<11; nrepeat++){ for (i = j = 0; i < 256; i++) { j = (j + key[i % key_length] + S[i]) & 255; swap(S, i, j); } } i = j = 7; } /* KSA */ void rc4_init_00(unsigned char *key, unsigned int key_length) { int nrepeat; for (i_00=0; i_00<256 ; (i_00)++) S_00[i_00] = i_00; for (i_00 = j_00 = 0; i_00 < 256; (i_00)++) { j_00 = (j_00 + key[i_00 % key_length] + S_00[i_00]) & 255; swap(S_00, i_00, j_00); } i_00 = j_00 = 0; } /* PRGA */ unsigned char rc4_output() { i = (i + 1) & 255; j = (j + S[i]) & 255; swap(S, i, j); return S[(S[i] + S[j]) & 255]; } /* PRGA */ unsigned char rc4_output_00() { i_00 = (i_00 + 1) & 255; j_00 = (j_00 + S[i_00]) & 255; swap(S_00, i_00, j_00); return S_00[(S_00[i_00] + S_00[j_00]) & 255]; } int main(int narg, char **argv) { int c, k; int out; unsigned char key[] = "Secret1234X"; // key hardcoded to "Secret" for (i = 0; i < 256; i++) S[i] = i; if (narg == 1){ rc4_init(key, 6 + 5); // length of key is 6 in this case } else { rc4_init("Pass1", strlen("Pass1")); rc4_init(argv[1], strlen(argv[1])); rc4_init("Pass2", strlen("Pass2")); } /* skip 1023 bytes */ rc4_init_00(S, 256); for(k=0; k < 1023; k++) rc4_output(); while ( (c = fgetc(stdin)) != -1) { out = c ^ rc4_output() ^ rc4_output_00(); printf("%c", out); if (narg > 2){ j = (j + out) % 256; } if (narg == 2){ j = (j + c) % 256; } } }
ubuntu@ubuntu:~$ sha1sum rc4.c aa4e0edec3ad925cd5c75be71ffb8f6d025b350c arc4.c ubuntu@ubuntu:~$ gcc rc4.c ubuntu@ubuntu:~$ cat rc4.c | ./a.out pw123 > r ubuntu@ubuntu:~$ cat r | ./a.out pw123 D > rc4.copy ubuntu@ubuntu:~$ diff rc4.c rc4.copy ubuntu@ubuntu:~$ gzip rc4.copy ubuntu@ubuntu:~$ ls -l arc4.c* -rw-r--r-- 1 ubuntu ubuntu 1590 2011-03-15 15:53 rc4.c -rw-r--r-- 1 ubuntu ubuntu 692 2011-03-17 17:58 rc4.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
Externer Link
Externer Link (Javascript)
Iaktueller.de übernimmt keine Haftung für externe Links. Franz Scheerer, Fritz-Philippi-Straße 34, 65195 Wiesbaden, Tel. 0611 168 93 98, scheerer.software@gmail.com