© 2012 W.Ehrhardt Letzte Änderung 03. Jan. 2012
Start CRC/Hash Krypto Sonstiges Info Links English

CRC / HASH / HMAC

Hier gibt es einige Pascal/Delphi-Quell- und Binärcodes für CRC-, Hash- und HMAC-Berechnungen. Alle Programme dürfen unter dieser Lizenz weitergegeben und benutzt werden, die Originalvorlage der zlib/libpng-Lizenz findet man hier (zlib-license).

Vor dem Herunterladen von Software von diesen Seiten bitte diesen rechtlichen Hinweis beachten.

Die Basisroutinen crc_hash_2010-12-19.zip sind mit vielen gängigen Pascal- (TP 5/5.5/6, BP 7, VP 2.1, FPC 1.0/2.0/2.2/2.4) und Delphi-Compilern übersetzbar (getestet mit Versionen 1 bis 7/9/10/12).


Letzte Änderungen:  Implementation der zwei Hash-Algorithmen SHA-512/224 und SHA-512/256 aus dem Entwurf FIPS 180-4
Seit Feb. 2006 gibt es eine neue Hash/HMAC-Architektur: Hash-Deskriptor-Records ermöglichen eine einfache einheitliche HMAC-Implementierung für alle Hash­algorithmen; die Schlüssel-Erzeugungs-Funktionen können jetzt alle unterstützten Hashalgorithmen benutzen. Eine kurze (englische) Einführung gibt mehr Informationen über die Hash/HMAC-Units und -Prozeduren.

Seit Mai 2008 unterstützen die Hash- und HMAC-Routinen Eingabestrings mit beliebiger Bitlänge.


Die Basisroutinen wurden in den Vorgänger-Versionen leicht verbessert. Das Optimieren erinnert allerdings an schwarze Magie, es ist stark abhängig von CPU, Cache, Compiler, Codeposition, usw. Beispiel: Wenn die SHA256-Schleife aufgedröselt ("unrolled") wird, so wird die Funktion auf meinem Rechner (1.8 GHz P4, D6, Win98) ca. 40% langsamer, auf einem anderen (AMD 2600+, D5, Win98) jedoch etwa 15% schneller. Im Archiv sha256unroll.zip sind einige Fragmente zu diesem Thema zu finden.

Mit dem Testprogramm T_SpeedA und dem hochauflösenden Zeitmesser aus hrtimer wurden die CPU-Cyclen pro Byte (Cyc/B) und damit die Verarbeitungsrate in MB/s gemessen (man beachte, daß die CPU-Taktfrequenz dynamisch bestimmt wurde). Hier die Werte für Delphi/FPC auf Win98 mit Pentium 4 / 1.7 GHz bei einer Blockgröße von 50000 Bytes (Std: Standard-Routinen mit BASM, PP: Pascal-Pur mit inline für D10 und FPC2.2.4 -O3):

D3/Std D3/Std D6/Std D6/PP D10/PP FPC/PP
Name MB/s Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B
CRC16 200.09 8.5 8.5 33.3 26.7 44.1
CRC24 180.23 9.4 9.4 30.0 26.4 35.1
CRC32 277.77 6.1 6.1 17.9 19.8 24.6
FCRC32 394.62 4.3 4.4 19.4 17.9 18.5
Adler32 382.98 4.4 4.8 4.7 3.6 8.1
CRC64 93.76 18.1 18.3 93.3 85.2 59.3
eDonkey 209.50 8.1 8.1 8.1 8.1 19.6
MD4 208.99 8.1 8.1 8.1 8.1 20.1
MD5 151.21 11.2 11.2 11.2 11.2 11.1
RMD160 53.12 31.9 31.8 31.9 30.9 99.6
SHA1 50.60 33.5 35.4 36.1 37.6 52.4
SHA224 28.62 59.2 55.5 52.6 50.2 62.2
SHA256 28.69 59.1 57.0 52.7 52.1 62.9
SHA384 9.79 173.1 206.0 206.4 206.9 194.9
SHA512 9.79 173.1 205.7 206.2 207.5 194.7
SHA512/224 9.75 173.8 205.7 206.2 206.6 195.2
SHA512/256 9.79 173.1 206.2 206.3 206.9 195.3
Whirlpool 17.15 98.8 129.7 129.9 134.9 98.5

MD4, eDonkey/eMule: Für Dateien/Zeichenfolgen mit einem Vielfachen von 9728000 Bytes sind die eDonkey- und eMule-Hashwerte verschieden; die ed2k-Unit berechnet immer beide Werte. Die Demoprogramme und das FAR-Plugin zeigen beide Hashwerte an, wenn sie verschieden sind.

SHA5_224 und SHA5_256: Im Feb. 2011 hat das NIST den Draft FIPS 180-4 (Secure Hash Standard, SHS) veröffentlicht, vorgeschlagen als Revision von FIPS 180-3. Es werden u.a. zwei zusätzliche kryptographische Hashalgorithmen SHA-512/224 und SHA-512/256 definiert. Ihre Konstruktion ist analog zu SHA384, sie verwenden die Kompressions­funktion von SHA512 aber verschiedene Initialisierungswerte. (Übersetztes) NIST-Zitat: SHA-512/224 und SHA-512/256 können effizientere Alternativen sein zu SHA-224 bzw. SHA-256 auf Plattformen, die für 64-Bit-Operationen optimiert sind. Das Archiv sha5_224_256.zip enthält meine Pascal-Implementationen und benutzt sha512; Hash- und HMAC-Units sind vorhanden. Die neuen Algorithmen sind (noch) nicht als Symbole in der Hash-Unit definiert und sind damit nicht via FindHash_by_ nutzbar, SHA5_224 und SHA5_256 können direkt oder via Deskriptorzeiger aufgerufen werden.

Int64-Unterstützung für SHA384/512: Leider gibt es dazu verwirrende prozessor-spezifische Ergebnisse: Auf einem P4/1.8GHz nimmt die Int64-Geschwindigkeit auf 83% der longint-Geschwindigkeit ab (Cyc/B steigt von 174 auf 209). Mit einem Celeron 500 MHz steigt die Geschwindigkeit um mehr als 30%, Cyc/B fällt von 146 (longint) auf 111 (Int64). Im Quellcode ist Int64 Standard für D4+ und FPC ('conditional define' UseInt64 in SHA512.PAS).

BASM16-Tabellenausrichtung: Da bei einigen BASM16-Implementationen 32-Bit-Zugriffe auf 32-Bit-Tabellen erfolgen, sollten diese Tabellen idealerweise auf 4-Byte-Grenzen ausgerichtet sein. Die 16-Bit Compiler richten aber nur auf Byte- oder Word-Grenzen aus! Deshalb können mit den Definitionen aus der Includedatei align.inc Dummy-Worte generiert werden, die die Tabellen auf 4-Byte-Grenzen ausrichten. Diese Möglichkeit ist für CRC24 ... CRC64 implementiert; wenn mehrere dieser Units verwendet werden, muß die Ausrichtungs­anpassung eventuell iteriert werden.

Rocksoft™ CRC-Modellalgorithmus: Die Unit crcmodel ist eine Pascal-Implementation von Ross Williams' parametrisiertem CRC-Modell­algorithmus, beschrieben in A Painless Guide to CRC Error Detection Algorithms (lokale HTML-Version). Fast alle gebräuchlichen CRC-Algorithmen mit Polynomen bis zum Grad 32 können mit dieser Unit modelliert werden. Die Unit crcm_cat enthält vordefinierte Parameter­records für mehr als 50 CRC-Algorithmen; die meisten sind Adaptionen von Greg Cooks Catalogue of Parameterised CRC Algorithms, weitere Referenzen sind im Unitkopf aufgeführt. Die interaktiven GUI-Demoprogramme tcrc16/tcrc32 berechnen und zeigen die Ergebnisse aller CRC16/CRC32-Algorithmen aus crcm_cat für Hex- und Stringeingabe, SRP16 sucht CRC16 Rocksoft-Parameter für gegebene Daten; EXE-Dateien sind in chksum_bin_2010-12-19.zip enthalten.

Blue Midnight Wish: Eine Experimentalversion der Blue Midnight Wish-Hashfunktion ist im Archiv bmw_2009-10-12.zip vorhanden. BMW ist eine der schnellsten Funktionen der zweiten Runde des SHA3-Wettbewerbs, wurde allerdings nicht in die dritte finale Runde übernommen. Es werden die 224- und 256-Bit-Versionen unterstützt (die 384/512-Bit-Versionen brauchen interne Zustandsvektoren, deren Längen größer sind als die aktuelle Maximallänge in der Hash-Unit). HMAC-Funktionen befinden sich ebenfalls im Archiv (Unit HMACBMW).


Pascal-Pur-Versionen: Das Archiv ppch_2009-07-25.zip enthält reine Pascal Versionen der Basisroutinen ohne BASM. Die Units im Archiv ersetzen die des Standardcodes. Der Hauptzweck ist, Quellcode für portablere Implementationen (z.B. für Linux/ARM) zur Verfügung zu stellen. Konsequenterweise ist der Code für FPC ohne Assembler entwickelt, er kann jedoch auch mit Delphi4+ benutzt werden. Die neue std.inc-Includedatei definiert {$asmmode intel} nur dann, wenn mit FPC für CPUI386 kompiliert wird; falls der Compiler Fehler wegen Asmcode anzeigt, sollte die Definition gelöscht werden.

PPCH basiert auf dem 32-Bit-Standardcode, einige zeitkritische Funktionen sind als inline deklariert (unter FPC2 und D9+). Die portablen CRC-Routinen sind wesentlich langsamer als die Standardausführungen (siehe Tabelle), die Geschwindigkeiten der Hashfunktionen bieten kein so einheitliches Bild.

Besonderer Dank geht an Nicola Lugato, der die Pur-Pascal-Units nachgefragt und die ersten Versionen auf seiner ARM/Linux-Maschine getestet hat.

Achtung: Der PPCH-Code setzt z.Z. weiterhin Little-Endian-Zielplattformen voraus. Ernstgemeinte Anfragen zu Big-Endian bitte per E-Mail (zusammen mit der Bereitschaft zu Tests und Fehlerberichten).


CRC/Hash-Demoprogramme

Letzte Änderungen:  Aktualisierte Archive mit CRC-16/Sick, einige kleine Änderungen

Das Archiv chksum_src_2010-12-19.zip enthält Pascal Quellcodes, die die Anwendung der CRC- und Hash-Units demonstrieren. Das Kommando­zeilen-Demoprogramm CCH.EXE kann mit allen Pascal- und Delphi-Versionen kompiliert werden; mit Virtual Pascal und BP 7 kann man ein interessantes Dual-OS-Programm erzeugen, das als 16-Bit-EXE unter DOS und als 32-Bit-Konsol-Applikation incl. Support für lange Dateinamen unter Win32 läuft. (Kompilieren mit make_cch.bat). GCH.EXE ist eine einfache Win32 GUI-Applikation für Klick-Klack-Techniker:), kompilierbar mit Delphi 2 bis 7/9/10/12 (Vorschau). Eingabe-Dateien können als Kommando­zeilen-Parameter angegeben werden.

Die interaktive GUI-Demoprogramme tcrc16/tcrc32 berechnen und zeigen die Ergebnisse aller CRC16/CRC32-Algorithmen aus crcm_cat für Hex- und Stringeingabe (Vorschau).

Das GUI-Programm SRP16 sucht CRC16 Rocksoft-Parameter für gegebene Daten-/CRC16-Sätze mit vielen Optionen (Vorschau). Die Hauptroutine verarbeitet Poly-/Init-Bereiche mit weiteren Kombinationen von refin-, refout- und xorout-Werten.

Eine SFX-Installation der EXE-Dateien befindet sich im Archiv chksum_bin_2010-12-19.zip, zum Selbstübersetzen werden die Quellcodes aus crc_hash_2010-12-19.zip benötigt.


FAR-Manager-Plugin

Die Basisroutinen sind in dem DLL-Plugin (Vorschau) für den beliebten FAR-Manager verwendet:

Letzte Änderung:  Version 1.17 in HashCRC117.zip korrigiert einen SHA512/384-Fehler bei Dateigrößen über 512MB.

Besonderer Dank geht an Dmitry Yerokhin, der die russischen Übersetzungen der .hlp- und .lng-Dateien zur Verfügung gestellt hat.

Den Quellcode für das Plugin gibt's hier: HashCRC117_Src.zip. Zum Kompilieren wird Virtual Pascal 2.1 bzw. Delphi 2 oder neuer sowie der Quellcode aus den CRC/Hash-Basisroutinen benötigt (plugins.pas aus dem FAR-Manager-Paket ist im Archiv vorhanden).

Historie: Version 1.2 splittet die SHA256-Ausgabe (um Abschneiden zu vermeiden), ist mit Virtual Pascal kompiliert und die Berechnung kann mit Esc abgebrochen werden. Version 1.3 arbeitet mit einer .lng-Datei für englische Texte und einem neuen Esc-Check für Delphi. Neu in Version 1.4 sind CRC64 und Adler32. Die Plugin-Version 1.6 kennt SHA224, SHA384 und SHA512 und zeigt nur die berechneten Werte an (kein N/A für abgewählte Funktionen), sie ist ca. 40% schneller als V1.5.

Version 1.7 erlaubt die Konfiguration HEX/Base64 und Groß/Kleinbuchstaben für HEX und ist jetzt ohne Fehler kompilierbar mit D4...D7/9. Die Basisroutinen sind mehr als 20% schneller als V1.6 (Code-Verbesserung und Delphi3-DLL). Werte werden als LSB HEX-Strings angezeigt; CRC16, CRC32, Adler32 werden als MSB HEX dargestellt (Indikator M in Separatorzeile, sonst L), wenn die Config-Option Strict LSB nicht gesetzt ist. V1.7.1 ist die Version mit den SHA512-Bugfixes.

Version 1.8 hat zwei zusätzliche Buttons die Ergebnisse können in die Zwischenablage oder in eine Datei geschrieben werden (der Dateiname erhält die zusätzliche Endung .chf).

Version 1.9 implementiert den Multi-Datei-Modus: Wenn mehrere Dateien markiert sind, werden die Hash/CRC-Berechnungen für alle Dateien durchgeführt und das Ergebnis in eine Datei geschrieben (das Format ist ähnlich zur Ausgabe von CCH.). Der Dateiname ist via Dialog wählbar; außerdem kann konfiguriert werden, ob eventuelle E/A-Fehler mit in die Datei geschrieben werden.

Version 1.10 in unterstützt Whirlpool V3.0 und benutzt die Zeilenzahl der FAR-Konsole zur Vermeidung des Überlaufs des Dialogfensters. Vers. 1.11 benutzt die neue Hash-Architektur und unterstützt RIPEMD-160, V1.12 unterstützt die in (Open)PGP und GnuPG verwendete CRC24.

Version 1.13 ist das Resultat einer Zusammenarbeit mit Giovanni Drusian. Sie enthält eine Spezial-MD5-Behandlung für PE-Dateien (Portable Executable), die nützlich ist für die Erkennung und Klassifizierung von Schadprogrammen (Malware). Außerdem gibt es eine neue Konfigurations­option für die Ausgabe der vollständigen Dateinamen (incl. Pfad) beim Schreiben in Datei oder Zwischenablage. Version 1.14 korrigiert den Whirlpool-Fehler bei Dateigrößen über 512MB, V1.15 enthält Anpassungen zur Vermeidung des Delphi-eof/4GB-Fehlers. V1.16 berechnet MD4- und eDonkey/eMule-Hashwerte und hat ein geändertes Layout für den Konfigurations-Dialog.

Start CRC/Hash Krypto Sonstiges Links English