Berechnungsverfahren

Zufallsbits

In vielen krypto­grafischen Verfahren benötigen Sie Zufallswerte. Bei der One-Time-Pad-Ver­schlüsselung etwa verwenden Sie als Schlüssel eine Folge von echten Zufallsbits. Bei der Diffie-Hellman-Schlüssel­vereinbarung erzeugen beide Kommunikationspartner jeweils eine zufällige Zahl. Zur Erzeugung der Schlüssel für das RSA-Verfahren benötigen Sie zwei zufällig gewählte Primzahlen. Es gibt viele weitere Beispiele.

Zufallsbits werden vom Computer im Allgemeinen algorithmisch erzeugt. Daher handelt es sich streng genommen nicht um echte Zufallsbits, sondern um sogenannte Pseudo­zufalls­bits. Echte Zufallsbits haben die Eigenschaft, dass es wie beim Münzwurf nicht vorhersagbar ist, ob als nächstes eine 0 oder eine 1 fällt. Bei Pseudo­zufalls­bits lässt sich das nächste Bit dagegen vorhersagen, wenn der Algorithmus und dessen Parameter bekannt sind.

Der Einfachheit halber ist im Folgenden meist von Zufallsbits die Rede, auch wenn es eigentlich Pseudozufallsbits sind.

In vielen Anwendungen außerhalb der Kryptografie spielt es keine Rolle, ob sich das jeweils nächste Bit vorhersagen lässt oder nicht. Es kommt nur darauf an, dass die Folge der Bits aussieht wie eine echte Zufalls­bit­folge.

Eine klassische Methode zur Erzeugung von Zufallsbits ist die Verwendung eines linear rück­gekoppelten Schiebe­registers (Linear Feedback Shift RegisterLFSR). Solchermaßen erzeugte Zufallsbits sind allerdings krypto­grafisch unsicher.

Kryptografisch sichere Zufallsbits

Krypto­grafisch sichere Zufallsbits haben ähnlich wie echte Zufallsbits die Eigenschaft, dass sich auch in Kenntnis von beliebig vielen vorherigen Bits das nächste Bit nicht effizient vorhersagen lässt.

Mit den Verfahren von Blum-Micali und Blum-Blum-Shub erzeugen Sie in einfacher Weise krypto­grafisch sichere Zufallsbits.

Zufallsbits per Hashfunktion

Eine andere Methode ist die Verwendung einer krypto­grafischen Hashfunktion h. Sie beginnen mit einem Startwert x0 und berechnen fortlaufend

xi  =  h(xi-1)

für i = 1, 2, ... .

Wenn allerdings ein Angreifer von einem dieser Werte xi Kenntnis erlangt, kann er alle weiteren Hashwerte xi+1, xi+2,  ...  berechnen – das ist schlecht. Daher lassen Sie nur wenige Bits von xi als erzeugte Zufallsbits nach außen dringen.

Zufallsbits per Ver­schlüsselung

Mithilfe einer starken Ver­schlüsselungsfunktion E wie beispiels­weise dem AES-Verfahren verschlüsseln Sie fortlaufend einen Zählerstand:

ti  =  E(z + i)

mit i = 0, 1, ... . Hierbei ist z der anfängliche Zählerstand.

Die erzeugte Folge der ti ist pseudo­zufällig.

Bei den Betriebs­arten Counter-Modus (Counter Mode - CTR) und Galois-Counter-Modus (Galois Counter Mode - GCM) für die Block-Ver­schlüsselung wird dies eingesetzt. Sie addieren die Folge der ti ähnlich wie beim One-Time-Pad zur Folge mi der Klartext­blöcke, um so die Geheimtext­blöcke ci zu erhalten:

ci  =  miti

Wahl des Startwerts

Alles was Sie machen, um eine Folge von Pseudo­zufalls­bits zu erzeugen, kann auch ein Angreifer machen. Er kann somit dieselbe Folge von Pseudo­zufalls­bits erzeugen – wenn er den Startwert kennt, den Sie verwendet haben. Oder aber auch, wenn er den Startwert nur richtig errät.

Deshalb kommt der Wahl des Startwerts eine immense Bedeutung zu. Er darf nicht zu erraten sein. Er darf auch nicht durch Ausprobieren aller Möglich­keiten zu ermitteln sein. Angenommen, Sie nehmen die aktuelle sekundengenaue Uhrzeit als Startwert. Die kann ein Angreifer ja nicht kennen, glauben Sie. Aber wenn der Angreifer diese Zeit auf einen Monat eingrenzen kann, dann muss er nur alle 2,6 MIllionen Möglich­keiten durchprobieren – so viele Sekunden hat ein Monat. Mithilfe eines Computers ist dies schnell getan ...

Es kommt also darauf an, die Anzahl der Möglich­keiten möglichst groß und möglichst unvorher­sehbar zu machen. Am besten nutzen Sie die Funktionen, die das Betriebs­system zur Verfügung stellt, oder darauf aufbauend, entsprechende Funktionen in Programmier­sprachen. In Python dient hierzu das Modul secrets.

import secrets
# Sicheren Integer-Seed generieren
secure_seed = secrets.randbits(128)  # 128-Bit Seed
print("Sicherer Seed:", secure_seed)

 

[up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Diese Webseiten sind größtenteils während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden