© 2017 W.Ehrhardt Letzte Änderung 04. Juni 2017
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 in crc_hash_2017-06-04.zip sind mit vielen gängigen Pascal- (TP 5/5.5/6, BP 7, VP 2.1, FPC 1.0/2.0-2.6/3.x) und Delphi-Compilern übersetzbar (getestet mit Versionen 1-7/9/10/12/17-18/25S).


Letzte Änderungen: 
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­ableitungs­funktionen (KDF) können jetzt alle unterstützten Hashalgorithmen benutzen. Ab Mai 2008 unterstützen die Hash- und HMAC-Routinen Eingabestrings mit beliebiger Bitlänge, und seit Aug. 2015 macht die SHA3-Integration eine Änderung des Typs THashContext erforderlich. Seit Juni 2017 gibt es eine kleine Änderung im Hash-Deskriptor (Blake2 hat OID-Vektoren der Länge 11).

Eine kurze (englische) Einführung gibt mehr Informationen über die Hash/HMAC-Units und -Prozeduren.


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.

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 oder 64: Pascal-Pur mit inline für D18 und FPC2.6.4 -O3, 64-Bit unter Win7/64 Core i3-2350M):

D3/Std D3/Std D6/Std D6/PP FPC/PP FPC-64 D18-64
Name MB/s Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B Cyc/B
CRC16 201.02 8.4 8.5 33.2 44.1 16.3 14.7
CRC24 180.08 9.4 9.4 29.8 35.1 15.2 14.2
CRC32 277.58 6.1 6.1 18.0 24.6 15.3 14.2
FCRC32 391.17 4.3 4.3 19.3 18.5 5.8 5.5
Adler32 381.90 4.4 4.5 4.6 8.1 2.2 2.0
CRC64 93.11 18.2 18.2 93.2 59.3 11.4 10.3
eDonkey 208.08 8.1 8.1 8.1 19.6 7.0 8.2
MD4 209.64 8.1 8.1 8.1 20.1 7.1 8.2
MD5 150.65 11.3 11.2 11.2 11.1 10.5 10.5
RMD160 53.15 31.9 31.8 31.8 99.6 28.9 27.9
SHA1 51.03 33.2 37.9 41.3 52.4 25.9 18.5
SHA224 29.93 56.6 59.9 50.6 62.2 45.6 34.5
SHA256 30.26 56.0 60.0 50.9 62.9 45.5 34.6
SHA384 9.78 173.3 205.7 206.2 194.9 28.5 25.3
SHA512 9.78 173.3 205.9 206.2 194.7 28.6 25.3
SHA512/224 9.75 173.9 205.6 206.2 195.2 28.5 25.3
SHA512/256 9.78 173.3 205.7 206.3 195.3 28.5 25.3
Whirlpool 17.17 98.7 98.7 98.6 98.5 65.7 58.2
SHA3-224 15.36 110.3 110.8 110.7 120.9 23.4 22.5
SHA3-256 14.54 116.5 118.7 117.4 127.0 24.7 23.8
SHA3-384 11.18 151.6 151.9 150.3 158.3 32.3 31.0
SHA3-512 7.76 218.4 212.0 211.2 220.2 46.5 44.7
Blake2s-224 9.83 172.5 167.4 166.9 137.2 55.2 42.8
Blake2s-256 10.16 166.8 173.2 173.1 143.7 55.3 43.0

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.

Units SHA5_224 und SHA5_256: Im März 2012 hat das NIST den neuen Secure Hash Standard FIPS 180-4 veröffentlicht. 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. (Siehe die 64-Bit-Spalten in der Tabelle). Meine Pascal-Implementationen benutzen SHA512 und sind jetzt voll ins Standardpaket integriert; Symbole für die neuen Algorithmen sind in der allgemeinen Hash-Unit definiert, spezifische Hash- und HMAC-Units sind vorhanden.

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.

Pascal-Pur-Versionen: Das Quellcodearchiv enthält reine Pascal Versionen der Basisroutinen ohne BASM (früher in einem separatem Archiv). 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 mit int64 und ohne Assembler entwickelt, er kann jedoch auch mit Delphi4+ benutzt werden. Die Pur-Pascal-Routinen werden benutzt, wenn das Symbol PurePascal definiert ist: {$define PurePascal}, automatisch für BIT64. Für 32-Bit-Systeme sind die portablen CRC-Routinen sind wesentlich langsamer als die Standardausführungen (siehe Tabelle), die Geschwindigkeiten der Hashfunktionen bieten kein so einheitliches Bild. Die Pur-Pascal-Routinen sind 64-Bit-kompatibel (getestet mit D17+ und FPC 2.6+ unter Win64). Besonderer Dank geht an Nicola Lugato, der die Pur-Pascal-Units nachgefragt und die ersten Versionen auf seiner ARM/Linux-Maschine getestet hat.

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 circa 100 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_2017-06-04.zip enthalten.

Keccak, SHA-3 und SHAKE

Am 2. Okt. 2012 hat das NIST das von Guido Bertoni, Joan Daemen, Michaël Peeters und Gilles Van Assche entwickelte Keccak als Gewinner des SHA-3-Hash-Wettbewerbs bekanntgegeben. Das Archiv keccak_2013-01-07.zip enthält meine original Pascal/Delphi Keccak-Implementation basierend auf dem SHA-3 NIST API: Beliebig lange Bitfolgen sind als Eingabedaten erlaubt, die unterstützten Hashwert-Längen sind 224, 256, 384 und 512 Bit, sowie beliebig lange Byteausgaben.

Es gibt zur Zeit im wesentlichen zwei Code-Varianten von Keccak-f[1600]: Die erste mit 32-Bit-Interleaving (Verschränkung), wobei die Rotationen in purem 32-Bit-Pascal als XOR von zwei Verschiebungen kodiert sind, bzw. via Inline-Anweisungen für die 16-Bit-Compiler; die zweite benutzt 64-Bit-Datentypen und -Rotationen. Allerdings ist der 64-Bitcode nur dann schneller als 32-Bit, wenn er für eine 64-Bit-CPU kompiliert und auf einem 64-Bit-System ausgeführt wird! Für neuere 32-Bit Compiler kann man für FPC und ab Delphi 6 mit {$define USE_MMXCODE} in der Unit sha3.pas den MMX-Code verwenden (die relative Leistungsänderung hängt von CPU und Algorithmus ab; tatsächlich gibt es zwei Include-Dateien, die von Eric Grange beigesteuerte wird standardmäßig verwendet, diese Version ist schneller auf allen getesteten Systemen als die von Anna Kaliszewicz und payl).

Im August 2015 hat das NIST den Standard SHA3 / FIPS202 veröffentlicht, der die Hashfunktionen SHA3-224/256/384/512 (aufbauend auf Keccak aber nicht identisch) und die XOF-Funktionen SHAKE128/256 beschreibt (XOF = eXtendable Output: Funktionen mit wählbarer Länge des 'Fingerabdrucks'). Das aktuelle CRC/Hash-Archiv crc_hash_2017-06-04.zip enthält Implementationen aller genannten Funktionen basierend auf meinen Keccak-Routinen. Unglücklicherweise hat NIST auch die Bit-Reihenfolge in Bytes geändert; deshalb gibt es in der SHA3-Unit eine entsprechende Funktion SHA3_FinalBit_LSB, um die letzen abschließenden LSB-Bits zu verarbeiten. Die enthaltenen Testprogramme verifizieren meine Implementationen gegen die NIST-Beispiele und die aktualisierten Testvektoren des Keccak-Teams.


Blake2s

Die kryptographische Hashfunktion Blake2 wurde entwickelt von J.-P. Aumasson, S. Neves, Z. Wilcox-O'Hearn und C. Winnerlein. Sie ist standardisiert im RFC 7693. Meine erste Implementation im CRC/Hash-Archiv ist Blake2s, das mit allen unterstützten Pascal-Compilern benutzt werden kann (es gibt auch eine andere inkompatible Version Blake2b, die für 64-Bit-Systeme optimiert ist). Blake2s liefert Hashdigests bis zu 32 Bytes, es hat einen eingebauten Schlüssel-Modus, der HMAC-Blake2s im wesentlichen überflüssig macht. Die Unit blake2s.pas implementiert die allgemeinen Blake2s-Funktionen (incl. Schlüsselverarbeitung), die Units blaks224.pas und blaks256.pas enthalten den spezifischen Code für schlüssellose 224- und 256-bit Digests.


CRC/Hash-Demoprogramme

Letzte Änderungen:  Blake2s-Algorithmen in GCH und CCH, neue Rocksoft-Parameter

Das Archiv chksum_src_2017-06-04.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/Win64 GUI-Applikation für Klick-Klack-Techniker:), kompilierbar mit Delphi 2-7/9/10/12/17-18/25S (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_2017-06-04.zip, zum Selbstübersetzen werden die Quellcodes aus crc_hash_2017-06-04.zip benötigt.


FAR-Manager-Plugin

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

Wichige Information:  Version 1.17 in HashCRC117.zip ist die letzte veröffentlichte Version. Sie unterstützt vollständig FAR 1.70 und arbeitet mit neueren FAR-Versionen, aber es kann eventuell Unicode-Probleme mit Dateinamen geben - die Hashwerte der (binären) Datei-Inhalte sind immer korrekt. Die Entwicklung wurde eingestellt bis wieder zuverlässige englische Domentationen (und Supportdateien für Pascal) vorhanden sind, auch in den letzen 'stabilen' und 'nächtlichen' Versionen gibt es keine englische Encyclopedia-Dateien und FarEng.hlp enthält mehr als 30% kyrillisches(?) Gekrakel.

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. Version 1.17 korrigiert einen SHA512/384-Fehler bei Dateigrößen über 512MB.

Start CRC/Hash Krypto Sonstiges Links English