![]() |
|
Webanwendungen Alle Fragen zu Installation und Problemlösung (Torrent-Flux, Hostsoftware, Serversoftware) |
|
Themen-Optionen | Ansicht |
![]() |
#1 | ||||||||||||
Profi
Registriert seit: 12.03.2008
Beitr?ge: 986
Abgegebene Danke: 21
Erhielt 1.079 Danke für 154 Beiträge
Downloads: 32
Uploads: 2 Nachrichten: 123 Renommee-Modifikator:
2350 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Einstieg: Cryptographie (Version 1.1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0.0 Einführung ~~~~~~~~~~~~~~ Hoi! Ich will euch mit diesem Tutorial allgemein die Verschlüsselung von Daten mittels einfachen Beispielen näher bringen und mit Code-Schnipseln speziell auf Delphi übertragen. Falls ihr euch nicht mit der Verschlüsselung speziell in Delphi interessiert, sondern nur allgemein dann müsst ihr nur den 1. Teil lesen. Er behandelt die Verschlüsselung aus allgemeiner Sicht und nicht auf eine Programmiersprache bezogen. Im 2. Teil werde ich mehr ins Praktisch übergehen und werde die Verschlüsselung in C und in Delphi behandeln. Auf meiner Homepage befindet sich zu C bereits ein Beispielprogramm. Dann viel Spass und verlegt eure Schlüssel nicht ![]() 1.0 Warum Verschlüsselung? ~~~~~~~~~~~~~~~~~~~~~~~~~~ Die Verschlüsselung ist wohl schon fast so alt wie die Menschheit selsbt. Kriegsherren und Politiker haben schon immer wichtige und vetrauliche Nachrichten verschlüsseln lassen. Heute, im Infoamtionszeitalter, spielt die Verschlüsselung aber eine noch nie da gewesene Rolle. "Cyber Piraten" machen das Internet unsicher und krallen sich alle Daten die sie in die Finger bekommen. Auch vertrauliches. Um die Übertragung von Daten (ob jetzt über Internet oder auf physischen Datenträgern) sicherer zu machen, wurden verschiedene verschlüsselungsverfahren entwickelt. Zum Beispiel der weit verbreitete Blowfish Algorhytmus. Mit der Zeit hat sich eine eigene Wissenschaft um die Verschlüsselungstechnik entwickelt: die sog. Kryptographie. Verschlüsselung dient also zum Datenschutz, um unbefugten den Zugriff zu erschweren. Ich will hier aber auch gleich erwähnen, dass eine Verschlüsselung niemals 100% Schutz bietet. Es kann immer jemandem gelingen einen Verschlüsselungs Algorhytmus zu knacken und an die vermeindlich geschützten Daten zu gelangen. 1.1.0 Verschlüsselungstechnik ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hier wird es jetzt darum gehen euch einen Einblick in die Grundlagen der Verschlüsselungstechnik zu bieten. Um später erfolgreich einen eigenen kleinen Verschlüsselungalgorhytmus zu schreiben, müssen wir zunächst uns ein wenig mit der Theorie auseinander setzen. Muss leider sein ![]() 1.1.1 Wie soll's funktionieren? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Das Prinzip einer Verschlüsselung ist recht einfach. Ein Zeichen (zB ein Buchstabe) soll beim verschlüsseln (englisch: encrypting; daher auch encrypten genannt) in ein anderes Zeichen umgewandelt werden. Später beim entschlüsseln (englisch decrypting; daher auch decrypten genannt) soll aus dem verschlüsselten Zeichen der Ursprungszustannd wieder hergestellt werden. Zum veranschaulichen hier ein Beispiel: Ursprung: http://ip-web.hn.org Verschlüsselt: ueef%§§wq?nxk ![]() Der Verschlüsselte Text ist nun nicht mehr zu entziffern. Damit wäre die Zeichenkette http://ip-web.hn.org verschlüsselt und vor unbefugten Einblicken geschützt. Eine Möglichkeit der Verschlüsselung ist zB das ersetzen eines jeden einzelnen Zeichnes durch ein anderes. ZB könnte man mit folgender Tabelle einen Text verschlüsseln: Code:
A => Z K => P U => F B => Y L => O V => E C => X M => N W => D D => W N => M X => C E => V O => L Y => B F => U P => K Z => A G => T Q => J H => S R => I I => R S => H J => Q T => G entsprechend. Der Morsecode ist auch nichts anderes als eine solche Verschlüsselung nach einer Tabelle. ZB würde aus dem Wort Hallo nach dieser Tabelle SZOOL werden. Schon jetzt ist es nicht mehr zu erkennen. Diese Art der Verschlüsselung ist zwar sehr einfach, aber auch dementsrechend unsicher. Ein Cryptograph, der eure Verschlüsselten Daten entschlüsseln will, würde schon sehr bald die Regelmäßigkeit in eurer Verschlüsselung erkennen. 1.1.2 ASCII Tabellen verschiebung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eine nicht unbedingt sicherere Methode der Verschlüsselung ist die ASCII Tabellen verschiebung.ASCII steht für American Standard Code for Information Interchange. In der ASCII Tabelle ist jedes Zeichen mit einer Zahl versehen (einer 1 Byte großen). Jede dieser Zahlen spiegelt also einen Buchstaben dar. Wenn man nun diese Tabelle verschiebt (indem man die jedem Buchstaben zugehörige Zahl zB um eins erhöht) erhalten wir einen neuen Zeichensatz. Somit bietet uns dies eine recht einfache Möglichkeit der Verschlüsselung. Im Prinzip ist das ja nichts anderes als eine neue Tabelle aufzustellen, doch der Vorteil hiervon ist, dass die Tabelle um eine bestimmte Anzahl von Zeichen verschoben werden kann und somit eine Art Passwort entsteht. Nur derjenige, der weiß um wieviel Zeichen die Tabelle verschoben worden ist, kann die Verschlüsselten Daten auch wieder entschlüsseln. Diese Methode ist jedoch sehr unsicher und deshalb gehe ich auch hierauf nicht mehr weiter ein. 1.1.3.0 Grundlagen der bitweisen XOR-Verschlüsselung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hier werden jetzt bestimmt einige mit der Luke auf dem Boden hängen. Hört sich kopmpliziert an? Ist warscheinlich auch nicht das Simpelste, aber doch zu verstehen! Zunächst müssen wir uns ein wenig mit dem Binären Zahlensystem auseinander setzen, um später die XOR-Verschlüsselung zu verstehen. 1.1.3.1 Das Binäre Zahlensystem ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Im Binären Zahlensystem gibt es nur 2 Ziffern (im Gegensatz zu unserem Dezimalen Zahlensystem mit insg. 10 Ziffern 0..9): die Eins (1) und die Null (0). Mit diesen beiden Ziffern kann man alle gewünschten Zahlen darstellen. Jetzt werdet ihr euch sicher fragen: "Wie?!", das ist aber garnicht so schwer. Hier mal ein Beispiel: Dezimal: 237 Binär: 11101101 Doch wie komme ich darauf? ganz einfach. Die erste Stelle (von Rechts) in einer Binären Zahl steht für die Eins. Die zweite für die Zwei, die Dritte für die Vier, die vierte für die Acht die fünfte für die 16 usw. So lassen sich alle beliebigen Zahlen zusammensetzen. Hier ein paar Beispiele: Code:
Dezimal 0 Binär: 0 0 0 0 0 0 0 0 --------------------------------------------------------- 128 64 32 16 8 4 2 1 Dezimal 255 Binär: 1 1 1 1 1 1 1 1 --------------------------------------------------------- 128 64 32 16 8 4 2 1 Binäre Zahlen lassen sich jedoch auch anders Beschreiben. Das binäre Zahlensystem stellt nämlich ein Zahlensystem zur Basis 2 dar, unsere Dezimalsystem hingegen zur Basis 10. Ein Beispiel soll das verdeutlichen: Dezimal: 73 Code:
Binär: 0 1 0 0 1 0 0 1 ------------------------------------------------------------------- Exp. 7 6 5 4 3 2 1 0 Basis 2 2 2 2 2 2 2 2 ------------------------------------------------------------------- Ergibt 128 64 32 16 8 4 2 1 für 2 hoch 1, dann 2 hoch 2 usw. Probiert mal ein wenig rum. Rechnet mal was von Dezimal in Binär und was von Binär nach Dezimal um und überprüft (zB mittels des Windows- Taschen-Rechners) ob ihr richtig gerechnet habt. Sobald ihr das binäre Zahlensystem verstanden habt, macht ihr weiter. 1.1.3.2 ASCII Codierung ~~~~~~~~~~~~~~~~~~~~~~~ Und da kommen wir doch wieder zum ASCII Code zurück. Das liegt daran, dass der Computer-ZeichenSatz auf dem ASCII Code aufbaut. Zwar ist Moderne Software eigentlich mit dem ANSI Code (eine Art weiterentwicklung des ASCII Zeichensatzes) kompatibel (zB Windows etc), doch ist der ASCII Code kleiner und somit übersichtlicher. Die Codierung eines Schriftzeichens wurde früher (zB bei MS-Dos) mit dem sog. ASCII Code erfüllt. Da der Speicher keine Schriftzeichen direkt, sondern nur Zahlen aufnhemen kann (und das in Form von binären Zahlen, also nur Einsen und Nullen), muss ein Schriftzeichen im Speicher in der Form einer Zahl dargestellt werden. Darum wurde der ASCII Code entwickelt. Insgesamt bietet er Platz für 256 Zeichen. Somit eröffnet sich die Möglichkeit ein Zeichen im Speicher in Form einer Zahl zwischen 0 und 255 abzulegen. Da der Speicher eines Computers (und überhaupt der gesamte Computer) nur Binären Code versteht, wird die Zahl auch in Form von Bits (eine Ziffer einer Binären Zahl, also eine 1 oder eine 0) abgelegt. Um eine Zahl zwischen 0 und 255 in binärerer Form darzustellen brauch man insgesamt 8 Bits (Einsen und Nullen). Ein Beispiel zur verdeutlichung: Code:
Dezimal 0 Binär: 0 0 0 0 0 0 0 0 --------------------------------------------------------- 128 64 32 16 8 4 2 1 Dezimal 255 Binär: 1 1 1 1 1 1 1 1 --------------------------------------------------------- 128 64 32 16 8 4 2 1 darstellen: Code:
Dezimal 127 Binär: 1 1 1 1 1 1 1 ------------------------------------------------- 64 32 16 8 4 2 1 Oder mit 9 Bits zahlen bis 511 (inkl. der Null): Dezimal 511 Binär 1 1 1 1 1 1 1 1 1 ------------------------------------------ 256 128 64 32 16 8 4 2 1 Bit Variante jedoch die Praktischerere. Also hat ein einzelnes Zeichen im ASCII Code Format die größe von einem Byte. Erweiterte Codes (zB ANSI oder der noch rel. neue UniCode) bieten eine größere Anzahl von Zeichen und sind somit auch größer. 1.2.0 XOR Verschlüsselung ~~~~~~~~~~~~~~~~~~~~~~~~~ Jetzt sollte genug Grundwissen da sein, um sich an die XOR-Verschlüsselung wagen zu können. Falls ihr das Binäre Zahlensystem noch nicht verstanden habt, fragt euren Mathelehrer, ob er es euch vielleicht mal erklären könnte, oder aber wenn ihr nichtmehr zur Schule geht, holt euch ein einfaches Mathebuch (in einer Bibliothek). Dort wird es bestimmt auch gut erklärt. Falls ich merke, dass viele von euch damit Probleme hatten, dann werde ich dieses Thema nocheinmal speziell in einem seperaten Tutorial behandeln. Am besten ihr besorgt euch auch eine ASCII Tabelle (findet ihr bestimmt im Internet iergendwo). Diese wird euch bestimmt sher helfen. 1.2.1 Konkrete Funktionsweise ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Die XOR Verschlüsselung (oder auch Bitweise Exklusiv Verschlüsselung) baut auch auf der Bereits kennen gelernten ASCII Code verschiebung auf, nur ist diese Verschiebung bei der Bitweisen XOR Verschlüsselung um einiges komplexer und somit auch schwerer zu knacken. Doch was bedeutet dieses XOR eiegentlich? XOR ist eion Operator (in C durch ein ^ dargestellt, in Pascal/Delphi XOR ausgeschrieben), der einen bitweisen exklusiv Vergleich zweier Zahlen vornimmt. Das bedeutet, dass die Zahlen ins Binärsystem umgewandelt werden und dann verglichen. Das Ergebnis des vergleiches wird wieder in eine Dezimal-Zahl umgewandelt und ist das Ergebnis der XOR Operation. Der Vergleich funktioniert folgender Maßen: Die Zahlen werden Binär dargestellt (mit im Prinzip unendlich vielen führenden Nullen). Dann wird das Niederwertigste Bit (ganz rechts außen) der Zahlen verglichen. Ist dieses gleich (0 und 0 - oder - 1 und 1) wird das niederwertigste Bit des Ergebnisses auf 0 gesetzt. Unterscheidet sich dieses Bit jedoch (1 und 0 - oder - 0 und 1) wird das niederwertigste Bit des Ergebnisses auf 1 gesetzt. Hier ein Anschauungsbeispiel: Code:
Deziaml 19 XOR 134 = 149 Binär 0 0 0 1 0 0 1 1 XOR 1 0 0 0 0 1 1 0 = 1 0 0 1 0 1 0 1 man sie sich Deziaml anschaut, keinen Zusammenhang zu haben. Noch verwirrender (oder verschlüesselnder ;-) ) wird das ganze, wenn diese Zahlen in Wirklichkeit ASCII Code sind und iergendwelche Buchstaben darstellen, denn dann ist für den Laien kein zusammenhang mehr rekonstruierbar. Wir wollen dies an einem Beispiel "beweisen": Code:
ASCII A XOR F = Steuerzeichen 7 Deziaml 65 XOR 70 = 7 Binär 0 1 0 0 0 0 0 1 XOR 0 1 0 0 0 1 1 0 = 0 0 0 1 0 1 1 1 Hier lässt sich sehr gut erkennen, dass kein Zusammenhang zu erkennen ist. A XOR F ergibt das 7. Steuerzeichen (Am Anfang des ASCII Codes stehen verschiedene Steurzeichen, zB die Nulltermination, das CR (Cariage Return bzw. Wagenrücklauf) usw.) Das 7. Steuerzeichen wird für den Benutzer warscheinlich nichteinmal als zeichen erkannt werden und trotzdem haben wir darin die Information unseres A (bzw F oder beide) versteckt. Nun solltet ihr eigentlich Verstanden haben, wie eine XOR Verschlüsselung funktioniert. Probiert ein wenig rum (am besten benutzt ihr uach her wieder den Windows Taschenrechner) und versucht euch vielleicht sogar schon ein wenig mit der Programmierung. 2.0 Praktische Umsetzung ~~~~~~~~~~~~~~~~~~~~~~~~ Dann wollen wir mal sehen, was wir aus dem eben gelernten so machen können. Ich werde nicht im Detail auf jeden Quelltext eingehen (zumal ich immer 2 verschiedene, einen in ObjectPascal und einen in C++ zur verfügung stellen werde), doch ich werde euch zeigen, wie man das programmiert, was ich euch oben erklärt habe. ASCII Tabellen verschiebung ~~~~~~~~~~~~~~~~~~~~~~~~~~~ So hier erstmal der Pascal Quelltext: Code:
var
S: String ;
I: Integer;
begin
Write('Source: ');
ReadLn(S);
{ Wir verschlüsseln den Text, indem wir ihn auf der ASCII Tabelle
um 5 Stellen nach links verschieben. }
for I := 1 to Length(S) do
S[i] := Chr(Ord(S[i])-5);
WriteLn('Crypted: '+S);
{ Nun entschlüsseln wir den Text wieder, indem wir die Verschlüsselung
umkehren und den verschlüsselten Text einfach wieder um 5 Stellen
nach rechts verschieben. }
for I := 1 to Length(S) do
S[i] := Chr(Ord(S[i])+5);
WriteLn('Decrypted: '+S);
ReadLn;
end.
Ord liefert den ASCII Code eines Zeichens und Chr wandelt eine Zahl anhand der ASCII Tabelle in ein Zeichen um. Also nichts besonderes. Für unsere C++ Fans hier der C++ Code: Code:
int main(){ cout << "Source: "; char s[256] = ""; cin >> s; /* Wir verschlüsseln den Text, indem wir ihn auf der ASCII Tabelle um 5 Stellen nach links verschieben. */ for(int i=0;i<strlen(s);i++) s[i] += 5; cout << "Crypted: " << s; /* Nun entschlüsseln wir den Text wieder, indem wir die Verschlüsselung umkehren und den verschlüsselten Text einfach wieder um 5 Stellen nach rechts verschieben. */ for(int i=0;i<strlen(s);i++) s[i] -= 5; cout << "Decrypted: " << s; getch(); return 0; } C++ Programmierert sollte hier alles mit Leichtigkeit verstehen können. Die bitweise XOR-Verschlüsselung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hier zunächst wieder der ObjectPascal Code: Code:
var
S,P: String ;
I,J: Integer;
begin
Write('Source: ');
ReadLn(S);
Write('Pass:' );
ReadLn(P);
{ Wir verschlüsseln den Text, indem wir ihn jeden Buchstaben des
Textes mit einem Buchstaben des Passwortes verschlüsseln. }
J := 1;
for I := 1 to Length(S) do
begin
S[i] := Chr(Ord(S[i]) xor Ord(P[J]));
Inc(J);
{ Wenn das Passwort einmal "durchlaufen" ist, soll das Programm
das Passwort erneut durchlaufen, bis das gesamte Wort verschlüsselt
ist. }
if J > Length(P) then
J := 1;
end;
WriteLn('Crypted: '+S);
{ Nun entschlüsseln wir den Text wieder, indem wir die Verschlüsselung
umkehren und den jeden Buchstaben des verschlüsselten Text einfach wieder
mit jedem Buchstaben des (neuen) Passwortes XOR-Verknüpfen. }
J := 1;
for I := 1 to Length(S) do
begin
S[i] := Chr(Ord(S[i]) xor Ord(P[J]));
Inc(J);
{ Wenn das Passwort einmal "durchlaufen" ist, soll das Programm
das Passwort erneut durchlaufen, bis das gesamte Wort verschlüsselt
ist. }
if J > Length(P) then
J := 1;
end;
WriteLn('Decrypted: '+S);
ReadLn;
end.
Code: Zitat:
mißverständlichen/nicht sofort einleuchtende Sachen sind bereits durch Quelltextkommentare erklärt. Na dann, hoffe es hat euch Spass gemacht und ihr habt was gelernt ![]() 3.0 Anhang ~~~~~~~~~~ Falls ihr noch Fragen habt bezüglich meines Tutorials, mailt mir: iparanoid@gmx.de! En paar Foren an denen ihr mich antreffen könnt: -www.root-shell-club.com -www.delphi-source.de/interakiv/forum.shtml Dann natürlich noch meine Homepage: http://ip-web.hn.org Ge?ndert von Cerberus (26.02.2009 um 19:37 Uhr) |
||||||||||||
![]() |
![]() ![]() ![]() |
Folgende 4 Benutzer sagen Danke zu TrackerPolizei für den nützlichen Beitrag: |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, G?ste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|