| © 2012 W.Ehrhardt |
Letzte Änderung 03. Jan. 2012 |
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 Hashalgorithmen;
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 Kompressionsfunktion 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 Ausrichtungsanpassung eventuell
iteriert werden.
Rocksoft™ CRC-Modellalgorithmus:
Die Unit crcmodel ist eine Pascal-Implementation von Ross Williams' parametrisiertem
CRC-Modellalgorithmus, 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 Parameterrecords 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 Kommandozeilen-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 Kommandozeilen-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.
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 Konfigurationsoption 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.