Erzeugung von Zufallsbits und Stromchiffren

Dozent:

Prof. Dr. Michael Eichberg

Basierend auf:

Cryptography and Network Security - Principles and Practice, 8th Edition, William Stallings

Version:
2024-05-09
Folien:

https://delors.github.io/sec-stromchiffre/folien.rst.html

https://delors.github.io/sec-stromchiffre/folien.rst.html.pdf

Fehler auf Folien melden:

https://github.com/Delors/delors.github.io/issues

Zufallszahlen

Es gibt zwei unterschiedliche Anforderungen an eine Folge von Zufallszahlen:

Zufälligkeit

Visualisierung von Zufallszahlengeneratoren[1]

Erwartete Verteilung von Zufallswerten im 3D-Raum.

Erwartete Verteilung der Werte im 3D-Raum

Verteilung von zufälligen Werten eines schlechten RNGs im 3D-Raum.

Schlechte Verteilung der Werte im 3D-Raum

Bei diesem Experiment werden immer drei nacheinander auftretende Werte als Koordinate im 3D-Raum interpretiert. Die erwartete Verteilung ist eine gleichmäßige Verteilung im Raum. Die Verteilung der Werte eines schlechten RNGs ist nicht gleichmäßig und zeigt eine klare Struktur.

Unvorhersehbarkeit

Pseudozufallszahlen

Bei kryptografischen Anwendungen werden in der Regel algorithmische Verfahren zur Erzeugung von Zufallszahlen verwendet.

Zufalls- und Pseudozufallszahlengeneratoren

RNGs
TRNG:

Echter Zufallszahlengenerator (True Random Number Generator)

PRNG:

Pseudozufallszahlengenerator (Pseudorandom Number Generator)

PRF:

Pseudozufällige Funktion (Pseudorandom Function)

Echter Zufallszahlengenerator (TRNG)

Pseudozufallszahlengenerator (PRNG) und Pseudozufallsfunktion (PRF)

Pseudozufallszahlengenerator

  • Ein Algorithmus, der zur Erzeugung einer nicht in der Länge beschränkten Bitfolge verwendet wird.

  • Die Verwendung eines solchen Bitstroms als Eingabe für eine symmetrische Stromchiffre ist eine häufige Anwendung.

Pseudorandom function (PRF)

  • Wird verwendet, um eine pseudozufällige Bitfolge mit einer bestimmten Länge zu erzeugen.

  • Beispiele sind symmetrische Verschlüsselungsschlüssel und Nonces.

  • Nimmt als Eingabe einen festen Wert, den so genannten Seed, und erzeugt mithilfe eines deterministischen Algorithmus eine Folge von Ausgabebits.

    Häufig wird der Seed von einem TRNG erzeugt.

  • Der Ausgangsbitstrom wird ausschließlich durch den oder die Eingabewerte bestimmt, so dass ein Angreifer, der den Algorithmus und den Seed kennt, den gesamten Bitstrom reproduzieren kann.

  • Abgesehen von der Anzahl der erzeugten Bits gibt es keinen Unterschied zwischen einem PRNG und einer PRF.

Nonce (Number used Once) ist ein Wert, der nur einmal verwendet wird. In der Kryptographie werden Nonces häufig verwendet, um die Sicherheit von Verschlüsselungsalgorithmen zu erhöhen bzw. überhaupt erst zu erhalten.

PRNG-Anforderungen

Zufälligkeit

NIST SP 800-22 legt fest, dass die Tests auf drei Merkmale ausgerichtet sein sollten: (1) gleichmäßige Verteilung, (2) Skalierbarkeit, (3) Konsistenz

Tests auf Zufälligkeit

SP 800-22 listet 15 verschiedene Zufallstests auf.

Häufigkeitstest:
  • Der grundlegendste Test, der in jeder Testreihe enthalten sein muss.

  • Es soll festgestellt werden, ob die Anzahl der Einsen und Nullen in einer Sequenz annähernd derjenigen entspricht, die bei einer echten Zufallssequenz zu erwarten wäre.

Lauflängentest:
  • Schwerpunkt dieses Tests ist die Zahl der Läufe (runs) in der Folge, wobei ein Lauf (run) eine ununterbrochene Folge identischer Bits ist, die vorher und nachher durch ein Bit des entgegengesetzten Werts begrenzt wird.

  • Es soll festgestellt werden, ob die Anzahl der Läufe von Einsen und Nullen verschiedener Länge den Erwartungen für eine Zufallsfolge entspricht.

Maurers universeller statistischer Test:
  • Fokus ist die Anzahl der Bits zwischen übereinstimmenden Mustern.

  • Ziel ist es, festzustellen, ob die Sequenz ohne Informationsverlust erheblich komprimiert werden kann oder nicht. Eine signifikant komprimierbare Sequenz wird als nicht zufällig betrachtet.

Unvorhersehbarkeit

Ein Strom von Pseudozufallszahlen sollte zwei Formen der Unvorhersehbarkeit aufweisen:

1. Vorwärtsgerichtete Unvorhersehbarkeit

Wenn der Seed unbekannt ist, sollte das nächste erzeugte Bit in der Sequenz trotz Kenntnis der vorherigen Bits in der Sequenz unvorhersehbar sein.

2. Rückwärtsgerichtete Unvorhersehbarkeit

  • Es sollte nicht möglich sein, den Seed aus der Kenntnis der erzeugten Werte zu bestimmen.

  • Es sollte keine Korrelation zwischen einem Seed und einem aus diesem Seed generierten Wert erkennbar sein.

  • Jedes Element der Sequenz sollte wie das Ergebnis eines unabhängigen Zufallsereignisses erscheinen, dessen Wahrscheinlichkeit 1/2 ist.

Dieselbe Reihe von Tests für die Zufälligkeit liefert auch einen Test für die Unvorhersehbarkeit: Eine Zufallsfolge hat keine Korrelation mit einem festen Wert (dem Seed).

Anforderungen an den Seed

Generierung von Seeds

Algorithmus-Entwurf

Algorithmen lassen sich in zwei Kategorien einteilen:

  1. Speziell entwickelte Verfahren.

    Algorithmen, die speziell und ausschließlich für die Erzeugung pseudozufälliger Bitströme entwickelt wurden.

  2. Algorithmen, die auf bestehenden kryptographischen Algorithmen basieren.

    Sie bewirken eine Zufallsverteilung der Eingabedaten.

    Kryptografische Algorithmen aus den folgenden drei Kategorien werden üblicherweise zur Erstellung von PRNGs verwendet:

    • Symmetrische Blockchiffren

    • Asymmetrische Verschlüsselungsalgorithmen

    • Hash-Funktionen und Nachrichtenauthentifizierungscodes

Lineare Kongruenzgeneratoren

Ein erstmals von Lehmer vorgeschlagener Algorithmus, der mit vier Zahlen parametrisiert ist:

\(m\)

der Modul

\(m > 0\)

\(a\)

der Multiplikator

\(0 < a< m\)

\(c\)

das Inkrement

\(0\leq c < m\)

\(X_0\)

der Startwert, oder Seed

\(0 \leq X_0 < m\)

Die Folge von Zufallszahlen \(\lbrace{X_n}\rbrace\) erhält man durch die folgende iterative Gleichung: \(X_{n+1} = (aX_n + c)\; mod\; m\)

Wenn \(m\) , \(a\) , \(c\) und \(X_0\) ganze Zahlen sind, dann erzeugt diese Technik eine Folge von ganzen Zahlen, wobei jede ganze Zahl im Bereich \(0 \leq X_n < m\) liegt.

Die Auswahl der Werte für \(a\) , \(c\) und \(m\) ist entscheidend für die Entwicklung eines guten Zufallszahlengenerators.

Blum Blum Shub (BBS) Generator

Blum Blum Shub Block Diagram

Blum Blum Shub Block Diagram

\(n\) ist das Produkt von zwei (sehr großen) Primzahlen \(p\) und \(q\): \(n = p \times q\).

Der Seed \(s\) sollte eine ganze Zahl sein, die zu \(n\) coprime ist (d. h. \(p\) und \(q\) sind keine Faktoren von \(s\)) und nicht 1 oder 0.

Beispiel - Blum Blum Shub (BBS) Generator

i

x_i

B_i

0

20749

1

143135

1

2

177671

1

3

97048

0

4

89992

0

5

174051

1

6

80649

1

7

45663

1

8

69442

0

9

186894

0

10

177046

0

PRNG mit Hilfe der Betriebsmodi für Blockchiffren

Zwei Ansätze, die eine Blockchiffre zum Aufbau eines PNRG verwenden, haben weitgehend Akzeptanz erhalten:

Allgemeine Struktur einer typischen Stromchiffre

Typical Stream Cipher

Klartext \(p_i\)

Chiffretext \(c_i\)

Schlüsselstrom \(z_i\)

Schlüssel K

Initialisierungswert IV

Zustand \(\sigma_i\)

Funktion zur Berechnung des nächsten Zustands f

Schlüsselstromfunktion g

Überlegungen zum Entwurf von Stromchiffren

Die Verschlüsselungssequenz sollte eine große Periode haben:

Ein Pseudozufallszahlengenerator verwendet eine Funktion, die einen deterministischen Strom von Bits erzeugt, der sich schließlich wiederholt; je länger die Wiederholungsperiode, desto schwieriger wird die Kryptoanalyse.

Der Schlüsselstrom sollte die Eigenschaften eines echten Zufallszahlenstroms so gut wie möglich nachbilden:

Es sollte eine ungefähr gleiche Anzahl von 1en und 0en geben.

Wenn der Schlüsselstrom als ein Strom von Bytes behandelt wird, sollten alle 256 möglichen Byte-Werte ungefähr gleich oft vorkommen.

Eine Schlüssellänge von mindestens 128 Bit ist wünschenswert:

Die Ausgabe des Pseudo-Zufallszahlengenerators ist vom Wert des Eingabeschlüssels abhängig.

Es gelten die gleichen Überlegungen wie für Blockchiffren.

Mit einem richtig konzipierten Pseudozufallszahlengenerator kann eine Stromchiffre genauso sicher sein wie eine Blockchiffre mit vergleichbarer Schlüssellänge:

Ein potenzieller Vorteil ist, dass Stromchiffren, die keine Blockchiffren als Baustein verwenden, in der Regel schneller sind und weit weniger Code benötigen als Blockchiffren.

Quellen der Entropie

Comparison of PRNGs and TRNGs

Pseudozufallszahlengeneratoren

echte Zufallszahlengeneratoren

Effizienz

sehr effizient

im Allgemeinen ineffizient

Determinismus

deterministisch

nicht Deterministisch

Periodizität

periodisch

aperiodisch

Konditionierung

Ein TRNG kann eine Ausgabe erzeugen, die in irgendeiner Weise verzerrt ist (z. B. gibt es mehr Einsen als Nullen oder umgekehrt)

Verzerrt: NIST SP 800-90B definiert einen Zufallsprozess als verzerrt in Bezug auf einen angenommenen diskreten Satz möglicher Ergebnisse, wenn einige dieser Ergebnisse eine größere Wahrscheinlichkeit des Auftretens haben als andere.

Entropierate: NIST 800-90B definiert die Entropierate als die Rate, mit der eine digitalisierte Rauschquelle Entropie liefert.

  • Ist ein Maß für die Zufälligkeit oder Unvorhersehbarkeit einer Bitfolge.

  • Ein Wert zwischen 0 (keine Entropie) und 1 (volle Entropie).

Konditionierungsalgorithmen/Entzerrungsalgorithmen:

Verfahren zur Modifizierung eines Bitstroms zur weiteren Randomisierung der Bits.

  • Die Konditionierung erfolgt in der Regel durch die Verwendung eines kryptografischen Algorithmus zur Verschlüsselung der Zufallsbits, um Verzerrungen zu vermeiden und die Entropie zu erhöhen.

  • Die beiden gängigsten Ansätze sind die Verwendung einer Hash-Funktion oder einer symmetrischen Blockchiffre.

Übung

  1. Test auf Zufälligkeit: Gegeben sei eine Bitfolge, die von einem RNG erzeugt wurde. Was ist das erwartete Ergebnis, wenn man gängige Komprimierungsprogramme (z. B. 7zip, gzip, rar, ...) verwendet, um die Datei zu komprimieren; d. h. welchen Kompressionsgrad erwarten Sie?

    MTAwMDAw:glaXGTjAJzgPcdU2h2EgH5CZAL8XJnxxj7kYSelQPJY=:I4KuLzZ+B7vkM5AU:m05iHRu+K7IF2B7vCvI1Q/IHVvgbrSmNCcJOLvOxbtOt99cOExOyqUXZHMnAi0obWjqRhxMc/lXT2cNJB7ChOWdKHqoj/rw4LTvWkUCLmsT7k7+VKQBk5CBjaWK0ci02FIGNuNcQ/LAw38DWo/InwKPmRqrGaGaXDBQG7soXbtoxDeutCQrmBe+1zmRGgC1YAQ9bIIRwns2nDvUXtiD+/MKdAupgY1yAL//vEe1UULRuQZ0BO9p5/zBOAsjbo1auM/2x7t7igFNngbvl29WILjK3lhmbDs0SLzrMo2zI7wF8jk/5NxZBCM8E/IMe70LBYLIyismtxKmrdtbMSsJ/Tp6A/EIV9lU+0VuMMERhmZyGj3t6RmKLJaCcHka6i3k8vsGZZl5qb0Z+XWMq0wcWFZrZ5fhAJ4MVppCWKOKRe0tJqMfeSVbZPQ==
  2. Implementiere einen linearen Kongruenzgenerator, um zu untersuchen, wie er sich verhält, wenn sich die Zahlenwerte von \(a\), \(c\) und \(m\) ändern. Versuchen Sie Werte zu finden, die eine vermeintlich zufällige Folge ergeben.

    Testen Sie Ihren Zufallszahlengenerator unter anderem mit den folgenden Werten:

    lcg(seed,a,c,m,number_of_random_values_to_generate)
    lcg(1234,8,8,256,100)
    lcg(1234,-8,8,256,100)
    MTAwMDAw:Cj2cD/tmuk7ph5mp+MWP0nSQjWjJIoUmV+V4BKWDHHA=:08c2kLaGU15XXxnD:lvZzAhwZkpT0JzkaVdl9/wOmrgr/TYBfVzvoq3MUVMNCAJmqSYyHWQ/CNbzs6LxR2CR3yl6PSRLyGw4DFwFK7MzcfkSRBn0LQkecqJ+C+NFz8Xl36qy71eJy3jdDjvl8mFDRzMpinOH1Jeq6iqYhyg2ztGqUm4NFn70tSV2Ke0jJA8uG8cUnIOMP1jA4FfQNuEMtUs7LzKLR+fa+6s4nhcngfjDfdDguynUFPwQiLIZvzYjoSKMx