Zyklische Redundanzprüfung

Verfahren zur Bestimmung eines Prüfwerts für Daten
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 19. September 2005 um 12:21 Uhr durch 131.159.0.17 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Die zyklische Redundanzprüfung (ZRP) (englisch Cyclic redundancy check, daher häufig CRC) ist ein Verfahren (bzw. eine bestimmte Klasse von Verfahren) aus der Informationstechnik zur Bestimmung eines Prüfwerts für Daten (z. B. Netzwerkverkehr oder eine Datei), um Fehler bei der Übertragung oder Duplizierung von Daten erkennen zu können.

Vor Beginn der Übertragung bzw. Kopie eines Blocks der Daten wird ein ZRP-Wert berechnet. Nach Abschluss der Transaktion wird der ZRP-Wert erneut berechnet. Anschließend werden diese beiden Prüfwerte verglichen. ZRP sind so ausgelegt, dass Fehler bei der Übertragung der Daten, wie sie beispielsweise durch Rauschen auf der Leitung verursacht werden könnten, fast immer entdeckt werden.

ZRPs können jedoch nicht die Integrität der Daten bestätigen. D. h., es ist verhältnismäßig leicht, durch beabsichtigte Modifikation einen Datenstrom zu erzeugen, der den gleichen ZRP-Wert wie eine gegebene Nachricht hat. Wenn eine solche Sicherheit gefordert ist, müssen kryptografische Hash-Funktionen wie z. B. MD5 zum Einsatz kommen.

Verfahren

ZRP beruht auf Polynomdivision: Die Folge der zu übertragenden Bits wird als dyadisches Polynom betrachtet. Beispiel: Die Bitfolge 10011101 entspricht dem Polynom

 

Die Bitfolge der Coderepräsentation der Daten wird durch ein vorher festzulegendes Generatorpolynom (das ZRP-Polynom) mod 2 dividiert, wobei ein Rest bleibt. Dieser Rest ist der ZRP-Wert. Bei der Übertragung des Datenblocks hängt man den ZRP-Wert an den originalen Datenblock an und überträgt ihn mit.

Um zu verifizieren, dass die Daten keinen Fehler beinhalten, wird der empfangene Datenblock mit angehängtem ZRP-Wert als Binärfolge interpretiert, erneut durch das ZRP-Polynom mod 2 geteilt und der Rest ermittelt. Wenn kein Rest bleibt, ist entweder kein Fehler aufgetreten oder es ist ein Fehler aufgetreten, der in Polynomdarstellung das ZRP-Polynom als Faktor hat.

Die Datenübertragung erfordert bestimmte unerlässliche Übereinkommen. Zum einen muss dem Empfänger bewusst sein, daß überhaupt eine gesicherte Übertragung der Ursprungsdaten stattfinden soll. An der Art des eintreffenden Datenstromes allein ist dies nicht zu erkennen. Des weiteren muss der Empfänger das selbe ZRP-Polynom und Rechenverfahren benutzen wie der Sender. Und schliesslich muss der Empfänger die Information besitzen, wo sich die zusätzlich zu den Daten übertragene Prüfsumme befindet.

Erkannte Fehler

Ist das ZRP-Polynom gut gewählt, können mit dem oben beschriebenen Verfahren alle Einbit- und Zweibitfehler, jede ungerade Anzahl von verfälschten Bits sowie alle Bündelfehler der Länge   erkannt werden, wobei   der Grad des ZRP-Polynoms ist. Warum dass so ist bzw. wie das ZRP-Polynom zu wählen ist, folgt aus den kommenden Überlegungen.

Sei   das ZRP-Polynom (Generatorpolynom) und   die Polynomdarstellung der um den ZRP-Wert erweiterten zu übertragenden Bitfolge. Wenn ein Fehler bei der Übertragung auftritt, kommt (in Polynomdarstellung) beim Empfänger nicht  , sondern   an. Die zu   gehörende Bitfolge hat an jeder Bitposition, die bei der zu übertragenden Bitfolge invertiert bzw. verfälscht wurde, eine 1. Wenn der Empfänger die um den ZRP-Wert erweiterten Bitfolge erhält, berechnet er  . Da   (per Definition von  ), ist das Ergebnis  .


Wenn ein Einbitfehler aufgetreten ist, gilt  , wobei   bestimmt welches Bit invertiert ist. Wenn nun   zwei oder mehr Terme enthält, wird   niemals   teilen.


Sind zwei isolierte Zweibitfehler aufgetreten, gilt  , wobei  . Klammert man   aus, lässt sich dies auch als   schreiben. Angenommen,   ist nicht durch   teilbar (z.B. wenn     enthält), reicht es zu fordern, dass   nicht   teilt (für alle   bis zum maximalen Wert von  , i.e. der maximalen Rahmenlänge). Einfache Polynome geringen Grades, die eine sichere Übertragung für lange Rahmen ermöglichen, sind bekannt. Zum Beispiel teilt     nicht für jedes   kleiner 32768.


Ist eine ungerade Anzahl von Bits verfälscht, enthät   eine ungerade Anzahl von Termen (z.B.  , aber nicht  ). Wählt man das ZRP-Polynom so, dass es   als Faktor hat, werden alle Fehler mit einer ungeraden Anzahl von verfälschten Bits erkannt. Um zu sehen, warum das so ist, führen wir einen kurzen und einfachen Widerspruchsbeweis. Angenommen   hat eine ungerade Anzahl von Termen und ist durch   teilbar. Dann lässt sich   nach einer Faktorisierung auch darstellen durch  . Wenn jetzt für   die Zahl   eingesetzt wird, gilt  , da in der Polynomarithmetik modulo 2  . Wenn nun aber   eine ungerade Anzahl von Termen hat, so müsste bei dem Einsetzen von   für   als Ergebnis die Zahl   herauskommen. Widerspruch! Folglich ist kein Polynom mit einer ungeraden Anzahl von Termen durch   teilbar.


Alle Bündelfehler der länge  , wobei   der Grad des ZRP-Polynoms ist, werden erkannt. Ein Bündelfehler der Länge   lässt sich schreiben als  , wobei   bestimmt, wieviele Bitpositionen von der rechten Seite der empfangenen Bitfolge (bzw. des empfangenen Rahmens) der Bündelfehler entfernt ist. Wenn   einen   Term enthält, so hat     sicher nicht als Faktor. Wenn zusätzlich der Grad von   kleiner ist als der Grad von  , kann der Rest niemals 0 sein.

Beispiel

Es folgt ein Beispiel mit einem Code n-ten Grades, wobei n=9. Das Generatorpolynom lautet 10011 ( ) und ist somit 4-ten Grades. Der zu übertragenden Bitfolge, Rahmen (engl. Frame) genannt, wird eine Kette aus Nullen entsprechend des Grades des Generatorpolynoms angehängt (siehe Rahmen mit Anhang).

Generatorpolynom: 10011
Rahmen: 1101011011
Rahmen mit Anhang: 11010110110000 (das Generatorpolynom hat r-Stellen, also werden r-1 Nullen ergänzt; hier ist r=5)

Nun wird der Rahmen mit Anhang von links her durch das Generatorpolynom dividiert. Dabei wird ausschließlich das exklusive OR (XOR) verwendet. Wenn man stellenweise dividiert wird also aus 11010 durch 10011: 01001 (0 xor 0 = 0; 0 xor 1 = 1; 1 xor 0 = 1; 1 xor 1 = 0). Es folgt das vollständiges Beispiel


11010110110000
10011
-----
 10011
 10011
 -----
  000010110
      10011 <- bei der ersten 1 wieder anfangen!
      -----
       010100
        10011
        -----
         01110 (Rest)


Die früher angehängte Null-kette wird nun durch den Rest ersetzt:

übertragener Rahmen: 11010110111110

Diese Nachricht kann jetzt z.B. über ein Netzwerk übertragen werden. Wenn die Nachricht beim Empfänger ankommt, kann dieser überprüfen, ob die Nachricht korrekt bei ihm angekommen ist.

Durch Division durch das Generatorpolynom kann jetzt die fehlerhafte Übertragung erkannt werden:

Ein Beispiel für eine fehlerhafte Nachricht: 11110110111110
Das Generatorpolynom (wie oben): 10011
11110110111110
10011
-----
 11011
 10011
 -----
  10001
  10011
  -----
   0010011
     10011
     -----
      00001110

Der Rest der Division (1110) ist ungleich Null. Also ist ein Fehler aufgetreten. Bei der Überprüfung auf Richtigkeit können folgende Fälle auftreten:

1. Der Rest der Division ist Null und die Nachricht ist richtig.
2. Der Rest der Division ist Null und die Nachricht ist fehlerhaft (dieser Fall kann durchaus
   vorkommen, wenn die Nachricht an mehreren Stellen verfälscht wird).
3. Der Rest der Division ist ungleich Null und die Nachricht ist fehlerhaft.

Implementierung

Das ZRP-Verfahren lässt sich in einfachen Hardware-Bausteinen realisieren. Aber auch in Software ist ZRP leicht zu implementieren. Pseudo-Code des wesentlichen Teils des Algorithmus, höchstwertiges Bit ganz links:

Schieberegister := Startwert (meist 0000... oder 1111...)
solange Bits im String verbleiben:
  falls das am weitesten links stehende Bit vom Schieberegister 
        ungleich zum nächsten Bit aus dem String ist:
    Schieberegister := (Schieberegister linksschieben um 1, rechtes Bit 0) 
                      xor CRC-Polynom
  andernfalls:
    Schieberegister := Schieberegister linksschieben um 1, rechtes Bit 0
Schieberegister enthält das Ergebnis

Durch Verwendung einer Tabelle, die für jedes der 256 möglichen Bytes den zugehörigen ZRP-Wert enthält, lässt sich obiger Algorithmus auf das achtfache beschleunigen.

Die Operationen Linksschieben und Exklusiv-Oder machen die ZRP hervorragend geeignet zur Verwendung in Logikschaltungen. Die ZRP eines Datenstroms kann bitweise (oder auch Byte-weise usf.) berechnet und vom Sender an die Daten angehängt werden. Der Empfänger des Datenstroms kann die ZRP genauso wie der Sender berechnen, jedoch unter Einbeziehung der ZRP. Das Ergebnis inclusive der ZRP muss dann gleich Null sein, sonst enthält der Strom Bitfehler.

ZRP-Typen werden oft anhand des als Divisor verwendeten Polynoms unterschieden (im Hexadezimal-Format). Eines der meistverwendeten ZRPs (u. a. von Ethernet, FDDI, ZIP und PNG benutzt) ist das Polynom 0x04C11DB7, bekannt als CRC-32. Es stellte sich heraus, daß einige Polynome "besser" schützen als andere. Für ZRP häufig verwendete Polynome sind das Ergebnis umfangreicher mathematischer und empirischer Analysen und keine Zufallszahlen, auch wenn sie so aussehen.

Polynome und Typen

CRC-CCITT (CRC-4)  
CRC-CCITT (CRC-16)  
IBM-CRC-16  
CRC-32  
CAN-CRC  
Bluetooth  

ZRPs werden häufig als Prüfsummen bezeichnet, obwohl die Berechnung der Kontrollbits nicht nur durch (gewöhnliche) Addition geschieht. Der Begriff Prüfsumme wurde zuerst im Zusammenhang mit Paritätsbits benutzt, welche sich als eine echte Summe über   berechnen lassen. Dabei hat sich der Begriff so sehr eingebürgert, dass er als Bezeichnung für die Berechnung von allgemeinen Kontrollbits übernommen wurde.

Siehe auch: Hash-Funktion und die dort genannten Verfahren, DFÜ.