www.wikidata.de-de.nina.az
Adler 32 ist ein einfacher von Mark Adler entwickelter Prufsummenalgorithmus der auf Fletcher s Checksum basiert Er wird unter anderem von der zlib Bibliothek benutzt um zufallige Ubertragungs Fehler im komprimierten Datenstrom zu erkennen In RFC 1950 1 wird der Algorithmus genau beschrieben Der Adler 32 Algorithmus ist einfacher und lasst sich schneller berechnen als die bekannte Zyklische Redundanzprufung cyclic redundancy check bietet aber auch weniger Sicherheit beim Erkennen von zufalligen Bitfehlern Inhaltsverzeichnis 1 Algorithmus 1 1 Anmerkung Beispielimplementierung 2 Schwachen von Adler 32 3 Literatur 4 Weblinks 5 EinzelnachweiseAlgorithmus BearbeitenDer Algorithmus bestimmt eine 32 bit Integer Zahl die aus der Hintereinanderreihung zweier 16 bit Integer Zahlen s1 und s2 gebildet wird Der Parameter s1 wird mit 1 initialisiert und in jedem Schritt wird der Wert des nachsten zu prufenden Bytes aufaddiert Der Parameter s2 wird mit 0 initialisiert und in jedem Schritt wird der aktuelle Wert des Parameters s1 aufaddiert Beide Summen werden modulo 65 521 die grosste Primzahl lt 216 berechnet Beispielimplementierung in C Beispielcode zur Berechnung der Adler 32 Prufsumme include lt stdint h gt fuer uint8 t uint32 t include lt stddef h gt fuer size t uint32 t adler32 const void buf size t buflength const uint8 t buffer const uint8 t buf uint32 t s1 1 uint32 t s2 0 for size t n 0 n lt buflength n s1 s1 buffer n 65521 s2 s2 s1 65521 return s2 lt lt 16 s1 Anmerkung Beispielimplementierung Bearbeiten Diese Beispielimplementierung ist nicht auf Geschwindigkeit sondern auf Klarheit und Lesbarkeit hin optimiert So braucht etwa die recht langsame Modulo Operation nicht bei jedem Datenbyte durchgefuhrt zu werden sondern nur wenn ein Uberlauf der Variablen s1 oder s2 droht Bei einer Bitbreite von 32 Bit was bei der Verwendung von int nicht gewahrleistet ist daher oben uint32 t gemass C99 genugt eine Durchfuhrung der Modulo Operation alle 5552 Bytes Bei 64 Bit uint64 t breiten s1 und s2 wurde sogar die Durchfuhrung der Modulo Operation alle 380 368 439 Bytes genugen wodurch aber keine merkliche Geschwindigkeitserhohung erzielt werden kann Naheres siehe Restklassenring Die hohe Anzahl der Sprunge verringert bei Prozessoren mit Pipeline die effektive Ausnutzung der quasi parallelen Ausfuhrung einzelner Befehle Es empfiehlt sich daher die einzelnen Daten in maximal 5552 Byte grosse Teilblocke zu zerlegen nach denen erst eine Modulo Operation ausgefuhrt wird Diese Blocke sollten wiederum in 16 Byte grosse Untereinheiten zerlegt werden die in einem Schleifendurchlauf zusammengerechnet werden Durch dieses sogenannte Loop unrolling lasst sich in etwa 25 30 Geschwindigkeitszuwachs auf modernen Prozessoren bei genugend grossen Daten erzeugen Schwachen von Adler 32 BearbeitenEin optimaler Prufsummenalgorithmus erzeugt eine Prufsumme die moglichst gleichverteilt uber ihren Wertebereich ist Dies ist bei Adler 32 fur kurze Datenfolgen lt 128 Byte nicht gegeben da der Wert fur s1 nicht uberlauft Durch die einfache arithmetische Struktur von Adler 32 kommt es zudem zu vielen Kollisionen insbesondere auch bei ahnlichen Eingabewerten Wird beispielsweise Byte n der Eingabe um k erhoht Byte n 1 um 2 k verkleinert und Byte n 2 um k erhoht bleiben sowohl s1 die Summe aller Bytes als auch s2 die Summe aller Zwischenwerte von s1 unverandert Dieses gilt fur beliebige Positionen n in der Eingabe und alle positiven oder negativen Werte von k soweit die betrachteten Bytes nicht uberlaufen Im Ergebnis kann die 32 Bit Prufsumme Adler 32 noch nicht einmal eine 24 Bit Eingabe zuverlassig absichern Lediglich einfache und doppelte Bitfehler werden zuverlassig erkannt und zwar durch die Summen s1 beziehungsweise s2 Treten jedoch Bursts von drei oder mehr Bitfehlern auf wie im obigen Beispiel ist eine sichere Erkennung nicht gewahrleistet Aus diesem Grunde wurde unter anderem in der Implementierung des Stream Control Transmission Protocols der verwendete Prufsummenalgorithmus Adler 32 durch CRC 32 ersetzt da hier recht oft nur kurze Datenstrome benutzt werden und die Schwache von Adler 32 zutage tritt Auch ist es verhaltnismassig leicht durch beabsichtigte Modifikation einen Datenstrom mit gleicher Prufsumme zu erzeugen Deshalb kann Adler 32 die Integritat der Daten nicht garantieren Wenn eine solche Sicherheit gefordert ist mussen kryptografische Hash Funktionen wie beispielsweise SHA zum Einsatz kommen Literatur BearbeitenJonathan Stone Checksums and the internet In The Adler 32 checksum S 125 ff Weblinks BearbeitenRFC 1950 ZLIB Compressed Data Format Specification version 3 3 Mai 1996 englisch Spezifikation mit Beispiel C code ZLib Implementation der Adler 32 Checksumme in adler32 c SIMD Implementation der Adler 32 Checksumme in Google Chrome adler32 simd c RFC 3309 Stream Control Transmission Protocol SCTP Checksum Change September 2002 Diskussion der Probleme mit kurzen Nachrichten englisch Einzelnachweise Bearbeiten RFC 1950 ZLIB Compressed Data Format Specification version 3 3 Mai 1996 englisch Abgerufen von https de wikipedia org w index php title Adler 32 amp oldid 234785232