Ich habe gelesen, dass
ein typischer Stream ist Die Verschlüsselung verschlüsselt den Klartext byteweise, obwohl eine Stream-Verschlüsselung so ausgelegt sein kann, dass sie jeweils mit einem Bit oder mit Einheiten arbeitet, die jeweils größer als ein Byte sind.
(Quelle: Kryptographie und Netzwerksicherheit , William Stallings.)
Eine Blockverschlüsselung verschlüsselt jeweils einen Block. Der Block kann eine Größe von einem Byte oder mehr oder weniger haben. Das heißt, wir können einen Block von einem Byte auch mithilfe einer Stream-Verschlüsselung als Stream verschlüsseln.
Was genau ist der Unterschied zwischen einer Stream-Verschlüsselung und einer Blockverschlüsselung?
Kommentare
- IMHO sind viele Konzepte / Definitionen nicht genau eindeutig, haben aber Grenzen in gewissem Sinne eher fließend. Sie werden auf diese Weise verwendet, da sie im Diskurs praktisch sind, wo häufig geeignete Kontexte vorhanden sind, um ein genaueres Verständnis zu ermöglichen. Daher gibt es Redundanzen. Ich nehme an, eine gute Analogie zu diesem Problem ist “ ein reicher Mann “ vs. “ ein armer Mann „.
- Der erste Absatz der Frage scheint Wort für Wort aus Kryptographie und Netzwerksicherheit (William Stallings, Abschnitt 6.3). Sie müssen immer die Quelle eines Materials angeben, das Sie aus externen Quellen kopieren. Siehe crypto.stackexchange.com/help/referencing .
- Eine Stream-Verschlüsselung kann verwenden oder ‚ Wrap ‚ eine Blockverschlüsselung. Beispielsweise kann AES SIC verwendet werden, um den Schlüsselstrom zu erzeugen. Die Tatsache, dass der Schlüsselstrom die N-fache Blockgröße hat, hat keinen Einfluss auf die Länge von Chiffrier- / Klartexttexten.
Antwort
A Blockverschlüsselung ist eine deterministische und berechenbare Funktion von $ k $ -Bit-Schlüsseln und $ n $ -Bit (Klartext) Blöcke zu $ n $ -Bit-Blöcken (Chiffretext). (Im Allgemeinen müssen die Blöcke keine Bitgröße haben, $ n $ -Zeichenblöcke würden auch hier passen.) Dies bedeutet, wenn Sie verschlüsseln Wenn Sie denselben Klartextblock mit demselben Schlüssel verwenden, erhalten Sie dasselbe Ergebnis. (Normalerweise möchten wir auch, dass die Funktion invertierbar ist, dh dass wir mit dem Schlüssel und dem Chiffretextblock den Klartext berechnen können.)
Um eine Nachricht (beliebiger Größe) tatsächlich zu verschlüsseln oder zu entschlüsseln, müssen Sie “ Verwenden Sie die Blockverschlüsselung nicht direkt, sondern legen Sie sie in einem Betriebsmodus . Der einfachste derartige Modus wäre E-CodeB-Modus (EZB) , der die Nachricht einfach in Blöcke schneidet und die Verschlüsselung auf jeden Block anwendet und gibt die resultierenden Blöcke aus. (Dies ist jedoch im Allgemeinen kein sicherer Modus.)
Einige frühe Verschlüsselungsschemata wie das von Caesar verwendete könnten als „Blockverschlüsselung mit 1-Zeichen-Blöcken in der EZB“ kategorisiert werden -mode „. Oder allgemein alles, was ein Codebuch hat.
Wir verwenden normalerweise andere Betriebsarten, einschließlich einer Initialisierungsvektor und eine Art Rückmeldung, so dass jeder Block Jede Nachricht wird auf andere Weise verschlüsselt.
A Stream-Verschlüsselung ist eine Funktion, die $ k $ -Bit-Schlüssel und Klartexte beliebiger Länge in einem solchen Chiffretext (gleicher beliebiger Länge) direkt abbildet Art und Weise, wie Präfixe des Klartextes Präfixen des Chiffretextes zugeordnet werden, dh wir können den Startteil des Chiffretextes berechnen, bevor der nachfolgende Teil des Klartextes bekannt ist. (Oft sind die Nachrichtengrößen auch auf Vielfache einer bestimmten „Blockgröße“ beschränkt, normalerweise jedoch mit kleineren Blöcken wie ganzen Bytes oder dergleichen.)
Wenn sich ein Teil des Klartextes wiederholt, wird normalerweise der entsprechende Chiffretext verwendet ist nicht dasselbe – verschiedene Teile der Nachricht werden auf unterschiedliche Weise verschlüsselt.
Oft funktionieren solche Stream-Chiffren, indem sie aus dem tatsächlichen Schlüssel (und möglicherweise einem Initialisierungsvektor) einen Schlüsselstrom erzeugen ) und dann einfach mit der Nachricht XOR-verknüpfen – diese heißen synchrone Stream-Chiffren . Andere Stream-Chiffren können die Verschlüsselung zukünftiger Teile der Nachricht abhängig von den vorherigen Teilen variieren.
Einige Betriebsarten für die Blockverschlüsselung erstellen tatsächlich eine synchrone Stream-Verschlüsselung, wie z. B. CTR und OFB -Modus.
Sie sollten niemals einen Schlüssel (und gegebenenfalls IV) einer synchronen Stream-Verschlüsselung (die Blockchiffren im Streaming-Modus enthält) für verschiedene Nachrichten wiederverwenden, da dies zu Kompromissen führen kann. (Und selbst für dieselbe Nachricht wird angezeigt, dass Sie eine Nachricht wiederholt haben.)
Beachten Sie, dass Sie im tatsächlichen Gebrauch auch einen MAC benötigen, z. Integritätsschutz für Ihre Nachricht. (Einige Schemata sind beispielsweise bei einem Angriff mit ausgewähltem Chiffretext fehlerhaft, und ein solcher MAC verhindert dies (wenn Sie die Nachricht erst nach Überprüfung des MAC an den Entschlüsseler weiterleiten).)
Kommentare
- Wann würden Sie zwischen einem Stream und einem Block wählen? Gibt es einen Unterschied in der Sicherheit? Oder Geschwindigkeit der Verschlüsselung?
- @anoopelias Blockchiffren sind im Vergleich zu Stream-Chiffren im Allgemeinen langsam. Ich bin mir auch nicht sicher, aber ich denke, dass Stream-Chiffren gut für die Bereitstellung von Informationssicherheit geeignet sind, während Block-Chiffren gut für die Gewährleistung der Computersicherheit geeignet sind Das Hinzufügen eines MAC schützt vor einem ausgewählten Chiffretext-Angriff?
Antwort
Mathematisch gesehen ist eine Block-Chiffre nur eine verschlüsselte pseudozufällige Permutationsfamilie auf der Menge $ \ {0,1 \} ^ n $ von $ n $ -Bit-Blöcken. (In der Praxis benötigen wir normalerweise auch eine effiziente Methode zur Berechnung der inversen Permutation.) Eine Blockverschlüsselung allein ist für die praktische Kryptografie nicht sehr nützlich, zumindest wenn Sie nicht zufällig nur eine kleine Verschlüsselung benötigen Nachrichten, die jeweils in einen einzelnen Block passen.
Es stellt sich jedoch heraus, dass Blockchiffren äußerst vielseitige Bausteine für die Erstellung anderer kryptografischer Tools sind: Sobald Sie eine gute Blockverschlüsselung haben, Sie können problemlos alles erstellen, von Stream-Chiffren bis hin zu Hash-Funktionen, Nachrichtenauthentifizierungscodes, Schlüsselableitungsfunktionen, Pseudozufallszahlengeneratoren, Entropiepools usw., basierend auf nur einer Blockverschlüsselung.
Nicht alle dieser Anwendungen müssen brauche eine Blockverschlüsselung; Zum Beispiel könnten viele von ihnen auf einer Pseudozufallsfunktion basieren, die keine Permutation sein muss (aber zweckmäßigerweise gibt es „sa Lemma , das besagt, dass eine pseudozufällige Permutation dennoch funktioniert). Viele der Konstruktionen sind auch indirekt. Sie können beispielsweise eine Schlüsselableitungsfunktion aus einem Nachrichtenauthentifizierungscode erstellen, den Sie können Konstruieren aus einer Hash-Funktion, die Sie — aber nicht haben müssen, um — aus einem Block zu konstruieren Chiffre. Wenn Sie jedoch eine Blockverschlüsselung haben, können Sie den Rest daraus erstellen.
Darüber hinaus enthalten diese Konstruktionen normalerweise (bedingte) Sicherheitsnachweise, die die Sicherheit verringern der konstruierten Funktionen zu der der zugrunde liegenden Blockchiffre. Sie müssen also nicht die mühsame und unzuverlässige Aufgabe der Kryptoanalyse jeder dieser Funktionen separat ausführen —, sondern können sich ganz auf die Blockverschlüsselung konzentrieren. zu wissen, dass jedes Vertrauen, das Sie in die Sicherheit der Blockverschlüsselung haben, sich direkt in Vertrauen in alle darauf basierenden Funktionen niederschlägt.
All dies ist natürlich sehr praktisch, wenn Sie beispielsweise daran arbeiten Eine kleine eingebettete Plattform, auf der das Einbeziehen von effizientem und sicherem Code für viele separate Krypto-Grundelemente schwierig und teuer sein kann. Aber selbst wenn Sie sich nicht auf einer derart eingeschränkten Plattform befinden, kann das Schreiben und Analysieren von Kryptocode auf niedriger Ebene mühsam sein, da Dinge wie Seitenkanalangriffe beachtet werden müssen . Es ist einfacher, sich auf eine begrenzte Anzahl von Bausteinen auf niedriger Ebene zu beschränken und daraus alles zu erstellen, was Sie benötigen.
Auch auf schnellen Plattformen mit viel Speicher Wie bei Desktop-CPUs kann die Implementierung von Kryptooperationen auf niedriger Ebene direkt in Hardware viel schneller sein als in Software —, aber es ist nicht praktikabel, dies für mehr als einige von ihnen zu tun Blockchiffren sind aufgrund ihrer Vielseitigkeit hervorragende Kandidaten für die Hardwareimplementierung (wie im AES-Befehlssatz für moderne x86-CPUs).
Was ist dann mit Stream-Chiffren?
Mathematisch gesehen ist eine Stream-Chiffre — im allgemeinsten Sinne des Begriffs — ist ebenfalls eine invertierbare Pseudozufallsfunktionsfamilie mit Schlüssel, jedoch auf der Menge $ \ {0,1 \} ^ * $ von Bitstrings beliebiger Länge und nicht auf Blöcken begrenzter Länge.
(Hier gibt es einige Feinheiten. Beispielsweise erfordern die meisten Stream-Verschlüsselungskonstruktionen, dass die Eingabe einen eindeutigen nonce -Wert enthält, und dies nicht Gewährleistung der Sicherheit — im Sinne der Ununterscheidbarkeit von einer wirklich zufälligen Funktion —, wenn dieselbe Nonce für zwei verschiedene Eingänge verwendet wird Es gibt keine gleichmäßige Verteilung auf invertierbare Funktionen von $ \ {0,1 \} ^ * $ zu sich selbst, aus denen zufällige Funktionen ausgewählt werden können. Wir müssen sorgfältig definieren, was es bedeutet, dass eine Stream-Chiffre „nicht von zufällig zu unterscheiden“ aussieht Diese Definition hat praktische Auswirkungen auf die Sicherheit —. Zum Beispiel verlieren die meisten Stream-Chiffren die Länge der Nachricht. Praktisch benötigen wir normalerweise auch diese Stream-Chiffren in Seien Sie „Streaming“ in dem Sinne, dass beliebig lange Eingabebitströme mit — verschlüsselt und — mit o entschlüsselt werden können Nur konstante Speicherung und Zeit linear in der Nachrichtenlänge.)
Natürlich sind Stream-Chiffren viel unmittelbarer nützlich als Block-Chiffren: Sie können sie direkt zum Verschlüsseln von Nachrichten beliebiger Länge verwenden. Es stellt sich jedoch heraus, dass sie auch als Bausteine für andere kryptografische Tools viel weniger nützlich sind: Wenn Sie eine Blockverschlüsselung haben, können Sie leicht Verwandeln Sie es in eine Stream-Verschlüsselung , während das Verwandeln einer beliebigen Stream-Verschlüsselung in eine Block-Verschlüsselung schwierig, wenn nicht unmöglich ist.
Warum also machen sich die Leute überhaupt die Mühe, dedizierte Stream-Chiffren zu entwerfen, wenn Block-Chiffren die Arbeit genauso gut erledigen können? Der Grund liegt hauptsächlich in der Geschwindigkeit: Manchmal benötigen Sie eine schnelle Verschlüsselung, um viele Daten zu verschlüsseln, und es gibt einige wirklich schnelle dedizierte Stream-Verschlüsselungsdesigns da draußen. Einige dieser Designs sind auch sehr kompakt zu implementieren, entweder in Software oder Hardware oder in beidem. Wenn Sie also wirklich nur eine Stream-Verschlüsselung benötigen, können Sie dies Sparen Sie Code- / Schaltungsgröße, indem Sie einen dieser Chiffren anstelle eines allgemeinen Blockchiffrier-basierten verwenden.
Was Sie jedoch an Geschwindigkeit und Kompaktheit gewinnen, verlieren Sie an Vielseitigkeit. Zum Beispiel Beispiel: Es scheint keine einfache Möglichkeit zu geben, eine Hash-Funktion aus einer Stream-Verschlüsselung zu erstellen . Wenn Sie also eine dieser Funktionen benötigen (und dies häufig tun) Da Hash-Funktionen nicht nur für sich genommen nützlich sind, sondern auch gängige Bausteine für andere Krypto-Tools sind, müssen Sie sie separat implementieren. Und raten Sie mal, die meisten Hash-Funktionen basieren auf Blockverschlüsselungen. Wenn Sie also eine haben, können Sie dieselbe Blockverschlüsselung auch für die Verschlüsselung wiederverwenden (es sei denn, Sie benötigen wirklich die Rohgeschwindigkeit der dedizierten Stream-Verschlüsselung). P. >
Kommentare
- Ich habe gefragt, ob zwei verschiedene Begriffe erforderlich sind. Nach Ihrer Erklärung ist eine Stream-Verschlüsselung einfach ein Sonderfall einer Blockverschlüsselung, dh einer für den Grenzfall, in dem das n in der Menge {0,1} ^ n 1 ist. Ich würde also argumentieren, den Strom nicht aufrechtzuerhalten Unterscheidung von Terminologien.
- @ Mok-KongShen Tatsächlich ist eine Stream-Verschlüsselung nicht einfach eine Blockverschlüsselung mit Blockgröße 1 (außer klassischen monoalphabetischen Chiffren, von denen angenommen werden kann, dass sie beides sind). Eine Stream-Verschlüsselung übersetzt normalerweise die Bits / Bytes / … des Streams unterschiedlich, abhängig vom aktuellen internen Zustand der Verschlüsselung, während eine Blockverschlüsselung für denselben Eingang dieselbe Ausgabe hat (und daher normalerweise in einer “ Betriebsmodus “ zum Erstellen einer Stream-Verschlüsselung).
- @PauloEbermann. IMHO haben Sie für mich eine Frage von CodesinChaos bezüglich “ Dynamik und Variabilität “ beantwortet.
- @ Mok-KongShen No. er hat nicht ‚ t. Der einzige Vorteil einer dedizierten Stream-Verschlüsselung gegenüber einer Blockverschlüsselung in einem geeigneten Modus ist die Leistung. Sie können ‚ Verkettungsmodi nicht außer Acht lassen, da niemand vernünftig Blockchiffren ohne entsprechende Verkettung verwendet.
- @CodesInChaos. Unterschiedliche Anwendungen haben unterschiedliche Leistungsanforderungen. Um z.B. Für eine E-Mail benötigt man ‚ nicht die Leistung, die für die Verschlüsselung beispielsweise einer Videodatei wünschenswert wäre.
Antwort
Eine Blockverschlüsselung ordnet n
Bits n
zu Bits mit einem Schlüssel. Das heißt, es ist eine verschlüsselte pseudozufällige Permutation. Es kann keine längeren oder kürzeren Texte akzeptieren.
Um eine Nachricht tatsächlich zu verschlüsseln, benötigen Sie immer einen Verkettungsmodus. Die EZB ist ein solcher Verkettungsmodus (und eine wirklich schlechte), und es ist nicht die reine Blockchiffre. Sogar die EZB besteht aus „Add-On-Verarbeitungsvorgängen“. Diese Verkettungsmodi können sehr unterschiedliche Eigenschaften haben.
Einer der beliebtesten Verkettungsmodi, der Zählermodus (CTR), erstellt eine synchrone Stream-Verschlüsselung aus einer Blockverschlüsselung.In einem anderen Modus erstellt CFB eine selbstsynchronisierende Stream-Verschlüsselung mit Eigenschaften, die irgendwo zwischen denen von CBC und einer synchronen Stream-Verschlüsselung liegen.
Ihre Annahme, dass zwischen Stream und Blockchiffren keine Chiffren vorhanden sind, ist also nicht wirklich wahr. Kryptographen Bauen Sie sie einfach lieber aus dem gut verstandenen Blockverschlüsselungsprimitiv auf, anstatt ein völlig neues System zu erstellen.
Ich würde Vigenère eine Stream-Verschlüsselung nennen, wenn auch eine mit einer viel zu kurzen Periode. Es wird eine 26-Symbol-Codierung anstelle einer 2-Symbol-Codierung verwendet, aber das bedeutet nicht, dass es sich nicht um eine Stream-Verschlüsselung handelt. Unter Solitaire / Pontifex finden Sie eine moderne Konstruktion einer Stream-Chiffre mit 26 Symbolen.
Kommentare
- Wenn ich ‚ nicht irre, “ verkettet “ in Die Blockverschlüsselung wird normalerweise im Kontext der “ Blockverkettung “ verwendet, dh die aufeinanderfolgenden Blöcke werden voneinander abhängig gemacht, um die Analyse schwieriger. IMHO EZB hätte also per Definition keinen Verkettungseffekt als solchen.
- Sie irren sich. Ein guter Verkettungsmodus hat diese Eigenschaften, aber es gibt immer noch schlechte Modi!
Antwort
Es gibt zwei grundlegende Arten der Verschlüsselung:
- Symmetrisch. Es verwendet denselben Schlüssel für die Ver- und Entschlüsselung.
- Asymmetrisch. Zum Ver- und Entschlüsseln werden zwei verschiedene Schlüssel (öffentlich und privat) verwendet.
Blockverschlüsselung und Stream-Verschlüsselung sind Teil der symmetrischen Verschlüsselung. Stream Cipher generiert einen erweiterten Schlüsselstrom aus dem vom Benutzer angegebenen Schlüssel und XoR ihn dann mit Klartext (zur Verschlüsselung) / Chiffretext (zur Entschlüsselung).
Während Block Cipher einen Datenblock als Eingabe verwendet, führen Sie mehrere Runden darauf aus zusammen mit dem Mischen von Schlüsseln und Erstellen von Chiffretext. Die Blockchiffren verfügen über verschiedene Betriebsmodi, bei denen der Zählermodus (CTR) ähnlich wie die Stream-Verschlüsselung funktioniert. Eine fortlaufende Nummer wird in die Blockverschlüsselung eingegeben, und ihre Ausgabe wird mit Klartext Xored, um Chiffretext zu erstellen. In dieser Betriebsart ist nur der Verschlüsselungscode der Blockverschlüsselung erforderlich. Es ist kein Entschlüsselungscode erforderlich. Für die Entschlüsselung geben wir einfach dieselbe fortlaufende Nummer ein, um die Verschlüsselung zu blockieren, und die Ausgabe mit Chiffretext zu speichern, um einfachen Text zu erhalten. Manchmal wird ein Nounce zusammen mit dem Zähler verwendet, so dass die Eingabe der Blockverschlüsselung in zwei Teile geteilt wird, d. H. Ein fester Nounce und ein inkrementeller Zähler.
Andere Betriebsarten sind: –
- EZB (bietet Vertraulichkeit)
- CBC und CTR (bietet Vertraulichkeit und ist gegen ausgewählten Plaintext-Angriff sementisch sicher)
- EAX, CCM und GCM (bietet authentifizierte Verschlüsselung)
Weitere Details finden Sie HIER