Erklärung - was ist eine Verschlüsselung und was ist ein Hash

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Erklärung - was ist eine Verschlüsselung und was ist ein Hash

    So, es war schon lange mal Zeit, dass jemand so einen Thread erstellt, da es ein extrem beliebter Fehler zu sein scheint, eine Verschlüsselung und einen Hash zu verwechseln. Ich habe das absichtlich hier im OffTopic gepostet, da ich hier auf Keinerlei Code oder sonstiges eingehen werde, dieser Artikel wird sich ausschließlich im theoretischen Bereich abspielen. Ich muss auch dazu sagen, dass ich absolut kein Fachmann im Bereich Kryptographie bin und ich meine Erklärungen deswegen allgemein halten werden.

    Was ist eine Verschlüsselung?
    Eine Verschlüsselung ist ein Algorithmus, der aus einer (meist beliebigen) Eingabe unter Verwendung eines sogenannten Keys (das ist meist ein Passwort, kann aber auch etwas anderes sein) eine Ausgabe bildet, die unter Angabe dieses Keys auch wieder in die ursprüngliche Eingabe zurückgeführt werden kann. Das wichtige an der Verschlüsselung ist also, dass die Verschlüsselten Daten auch wieder entschlüsselt werden können, aber eben nur, wenn der Key bekannt ist.
    Eine Verschlüsselung muss übrigens auch die Bedingung erfüllen, dass sowohl der Verschlüsselungs- alsauch der Entschlüsselungsalgorithmus bekannt sein können und die Verschlüsselten Daten trotzdem nicht ohne den Key entschlüsselt werden können, also dass der Algorithmus ohne den Key wertlos ist.
    Bei einer Verschlüsselung muss außerdem jede Eingabe eine andere Ausgabe besitzen, da sonst die Entschlüsselung nicht mehr gewährleistet wäre. Der Algorithmus muss also genauso viele Ausgaben wie Eingaben besitzen, das gilt auch bei einer unendlich großen Eingabemenge.

    Die 5 besten Verschlüsselungsalgorithmen derzeit sind wohl
    • MARS
    • RC6
    • Rijndael
    • Serpent
    • Twofish
    da dies die Kandidaten für den AES-Standard waren. Letzendlich hat Rijindael diesen Titel bekommen.

    Alle diese Algorithmen haben eine unendlich große Eingabemenge, und müssen daher auch eine unendlich große Ausgabemenge besitzen. Um dies zu erreichen gibt es soweit ich weiß nur einen Weg: die Ausgabe darf keine konstante Länge besitzen, da bei einer endlichen Anzahl Ausgabezeichen auch nur eine endlich Anzahl Ausgaben vorhanden ist. Die 5 oben produzieren wohl eine Ausgabe von der selben Länge wie die Eingabe, was die einfachste Möglichkeit ist.
    Auch zu bemerken ist, dass eine Verschlüsselung nach dem heutigen Wissenstand ohne den passenden Key nicht entschlüsselbar ist und auch nie entschlüsselbar sein wird. Dies kann sich nur ändern, wenn die komplette Mathematik einen Umbruch erfahren würde, der es ermöglicht bestimmte heute unlösbare Probleme zu lösen, was aber nicht anzunehmen ist.

    Anmerkung: ich habe hier nur symmetrische Verschlüsselungen beschrieben. Neben diesen gibt es auch noch asymmetrische, die für die Ver- und Entschlüsselung jeweils unterschiedliche Keys verwenden, der Rest bleibt dort jedoch gleich. Asymmetrische Verschlüsselungen werden häufig bei Übertragungen verwendet (z.B. eMails), während symmetrische z.B. bei Archiven wie ZIP oder RAR zu finden sind.

    Was ist ein Hash?
    Ein Hashalgorithmus ist im Vergleich zu der Verschlüsselung dafür gemacht, dass man die Ausgabe nicht wieder in die Eingabe zurückführen kann. Hier wird auch kein Key benötigt und die Anzahl der Ausgaben ist endlich, da die Ausgabelänge konstant ist. Die Eingabe kann währenddessen aber von beliebiger Länge sein und die Eingabemenge ist unendlich groß. Dies hat unweigerlich zur Folge, dass man jeder Ausgabe unendlich viele Eingaben zuordnen kann, denn Eingabemenge / Ausgabemenge = Unendlich / Irgendwas = Unendlich.
    Aufgrund dessen ist wohl der Irrglaube entstanden, dass man einen Hash "entschlüsseln" könne. Auf eine gewisse Art stimmt das sogar, denn es ist tatsächlich möglich für einen Hash eine Eingabe zu finden, die diesen Hash erzeugt, jedoch ist dies 1. nicht als entschlüsseln zu bezeichnen, da man lediglich eine aus unendlich Möglichkeiten gefunden hat (man spricht dann von einer Kollision), das Ergebnis also nicht eindeutig ist, und 2. da es nicht beabsichtigt ist, man kann so etwas quasi nur durch Raten herausfinden (es gibt auch analytische Funktionen, die es einem etwas vereinfachen, aber so tief möchte und kann ich gar nicht in die Materie eintauchen).

    Die bekanntesten Hash-Verfahren sind:
    • MD5
    • SHA1
    • die SHA2-Familie (SHA-224, SHA-256, SHA-384, SHA-512)


    MD5 ist inzwischen schon sehr alt und hat eine so kurze Ausgabelänge, dass es mithilfe der von mir oben genannten analytischen Methoden mit vergleichsweise geringem Aufwand möglich ist, Kollisionen zu finden. SHA1 ist für den Moment noch sicher, es wurden aber auch hierfür schon Kollisionen gefunden.
    Je länger die Schlüssellänge, desto schwieriger wird es, Kollisionen zu finden, jedoch ist es theoretisch nie unmöglich, sodass mit zunehmender Leistung der Computer immer neue Hashverfahren mit größeren Schlüssellängen benötigt werden, um Sicherheit zu gewährleisten. Jedoch muss ich dazusagen, dass man momentan und vermutlich auch noch die nächsten 20 Jahre mit SHA224 absolut sicher wäre, bei SHA512 wage ich gar keine Vermutung, da der Rechenaufwand mit der Schlüssellänge exponentiell steigt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Artentus“ ()

    Artentus schrieb:

    Eine Verschlüsselung ist ein Algorithmus, der aus einer [..] Eingabe unter Verwendung eines sogenannten Keys [..] eine Ausgabe bildet, die unter Angabe dieses Keys auch wieder in die ursprüngliche Eingabe zurückgeführt werden kann.
    Das beschreibt aber nur eine symmetrische Verschlüsselung. Bei asymmetrischen Systemen wie z. B. RSA oder DSA werden 2 verschiedene Schlüssel verwendet (Private und Public Key).

    Artentus schrieb:

    Jedoch muss ich dazusagen, dass man momentan und vermutlich auch noch die nächsten 20 Jahre mit SHA128 absolut sicher wäre, bei SHA512 wage ich gar keine Vermutung, da der Rechenaufwand mit der Schlüssellänge exponentiell steigt.
    Die Tatsache, dass MD5 ebenfalls 128-Bit lange Hashes erzeugt, lässt mich irgendwie daran zweifeln, dass ein "SHA128" auch noch in 20 Jahren sicher wäre. Dafür hätte ich gerne eine gute Quelle, die das gleiche wie du behauptet.

    Ich sehe kein Problem darin, sich diese Artikel anzuschauen:
    de.wikipedia.org/wiki/Verschl%C3%BCsselung
    de.wikipedia.org/wiki/Verschl%C3%BCsselungsverfahren
    de.wikipedia.org/wiki/Symmetrisches_Kryptosystem
    de.wikipedia.org/wiki/Public-K…hl%C3%BCsselungsverfahren
    de.wikipedia.org/wiki/Public-Key-Infrastruktur
    de.wikipedia.org/wiki/Kryptologische_Hashfunktion

    Hashes werden auch als Prüfsummen verwendet. Im Falle einer Prüfsumme kommt es ja gar nicht darauf an, ob die Hashfunktion umkehrbar ist, oder nicht. Sie soll ja nur "Prüfen". So wird bei ZIP-Archiven CRC verwendet, um sicherzustellen, dass die entpackten Daten auch richtig entpackt wurden. Ob aus der Prüfsumme nun auf die eigentlichen Daten geschlussfolgert werden kann, ist da - so denke ich - eher von nebensächlicher Bedeutung. Es geht dort eher um die schnelle Berechnung einer kompakten Prüfsumme (auch im Header von IPv4 vertreten).

    Hier wird ürbeigens schon von SHA-3 gesprochen.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    nikeee13 schrieb:

    Das beschreibt aber nur eine symmetrische Verschlüsselung.
    Ich editiere das gleich mal entsprechend. Bei Verschlüsselungen denke ich halt zunächst mal nur an symmetrische Verschlüsselungen.

    nikeee13 schrieb:

    Die Tatsache, dass MD5 ebenfalls 128-Bit lange Hashes erzeugt, lässt mich irgendwie daran zweifeln, dass SHA128 auch noch in 20 Jahren sicher wäre.
    Das war wohl ein kleiner Fail von mir, ganz offensichtlich gibt es gar kein SHA128 (zumindest sagt das Wikipedia). Das werde ich dann ebenfalls mal schnell ausbessern.

    Und zu deinem letzten Absatz:
    Der Thread heißt ja auch "Was ist ein ... Hash", und nicht "Wofür brauche ich einen Hash".
    Ich "pfusch" hier nur ungerne mit, aber ich glaube diese Seite, sollte trotz der Tatsache, dass sie von 2003 ist, recht verständlich die Unterschiede zwischen symmetrischer und asymmetrischer Verschlüsselung sowie die Verwendung von hybrid-Verschlüsselungsmethoden erklären. trojaner-und-sicherheit.de/security/verschluesselung.htm

    Besser ist natürlich immer noch die Wikipedia-Version, vorrausgesetzt ein paar Wörter mehr, sind keine Hürde für den Leser. de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
    M.f.G. Nitro-X
    Gute Spieler cheaten schlecht! 8-)

    Button1.Visible = False
    If Button1.Click then Shell ("C:\brain.exe")
    end if

    Artentus schrieb:

    Hier wird auch kein Key benötigt
    Stimmt - Hashes brauchen keinen Key. Aber danach schreibst du:

    Artentus schrieb:

    MD5 ist inzwischen schon sehr alt und hat eine so kurze Schlüssellänge, dass es mithilfe der von mir oben genannten analytischen Methoden mit vergleichsweise geringem Aufwand möglich ist, Kollisionen zu finden.
    Schlüssellänge? Oben steht, dass es keinen Schlüssel gibt. Du meinst eher die Größe der Ausgabemenge mit ihren 2^128 möglichen Werten bei MD5.

    Außerdem würde ich noch dazuschreiben, dass die gefundenen Kollisionen in den meisten Fällen nutzlos sind, weil diese nicht steuerbar sind. Das heißt, dass man eine Kollision für zwei beliebige Eingaben leicht finden kann. Es ist aber nicht einfach, eine Kollision zu finden, bei der bereits eine Eingabe vorgegeben ist. Das wäre aber nötig, um einen Hash zu fälschen.
    Gruß
    hal2000
    Ok, ich bessere das gleich aus.

    Und ja, es ist tatsächlich sehr schwer, eine Kollision zu finden, die für den Angreifer von Nutzen ist. Laut Wikipedia jedoch ist dies bei MD5 schon möglich:
    Die meisten standardisierten Hashfunktionen beruhen auf der Merkle-Damgård-Konstruktion. Aufgrund ihrer Struktur ist es leicht, wenn einmal eine Kollision gefunden wurde, weitere Kollisionen, also Nachrichtenpaare mit gleichem Hashwert zu erzeugen. Für den MD5-Algorithmus sind sogar Kollisionen bekannt, bei denen der Anfang der Nachricht frei wählbar ist. Somit kann ein Angreifer zwei Dokumente mit unterschiedlichem Inhalt aber gleichem Hashwert erstellen. Beispielsweise kann er zwei Zertifikate erstellen, die den gleichen Hashwert besitzen. Eines davon ist ein unverdächtiges Zertifikat, das zweite Zertifikat berechtigt ihn zum Ausstellen weiterer Zertifikate, was eigentlich nur eine Zeritifizierungsstelle darf. Er lässt nun das erste von einer Zertifizierungsstelle unterschreiben. Bei einer digitalen Signatur wird aber in der Regel nicht die ganze Nachricht, sondern nur deren Hashwert unterschrieben. Damit besitzt der Angreifer auch eine Unterschrift für das zweite und kann nun gültige Zertifikate für beliebige Schlüssel erstellen.[1]
    Hi,

    habe das grade nochmal durchgelesen.
    Zwar ist es kein wirkliches Tutorial, aber der Vollständigkeit wegen würde ich bei den Hashes noch anmerken, dass mit Salt und Pepper (ist beides im verlinkten Artikel beschrieben) das Finden von Kollisionen nochmals ziemlich erschwert wird.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: