Netidee Blog Bild
Neue Assembler-Optimierungen für schnellere Verschlüsselung im Internet der Dinge
Die Laufzeit der Hashfunktion SHA-256 auf 8-bit AVR Prozessoren konnte um die Hälfte reduziert werden (30.06.2018)
Förderjahr 2016 / Projekt Call #11 / ProjektID: 1886 / Projekt: QUASIKOM

Wie bereits im letzten Blogeintrag erklärt, berechnet die kryptografische Hashfunktion SHA-256 aus einem Datensatz beliebiger Form und beliebiger Länge einen 256-Bit Hashwert, der eine Art "digitalen Fingerabdruck" des Datensatzes darstellt. Die genaue Funktionsweise von SHA-256 kann man in Form von Pseudocode in der englischsprachigen Wikipedia nachlesen; im Wesentlichen werden folgende Schritte ausgeführt: Zuerst wird der zu hashende Datensatz in 512-Bit große Blöcke aufgeteilt, wobei der letzte Datenblock nach gewissen Regeln aufgefüllt wird sodass er ebenfalls 512 Bit lang ist (dieser Vorgang wird als Padding bezeichnet). Dann werden die Blöcke nacheinander einer sogenannten Kompressionsfunktion (engl. compression function) zugeführt, die neben einem 512-Bit Block auch noch den 256-Bit Status (engl. state) als Input erhält und daraus einen neuen 256-Bit Status errechnet. Der Status besteht aus acht 32-Bit Worten, den sogenannten Kettenvariablen, die üblicherweise mit den Buchstaben a, b, c, d, e, f, g, und h bezeichnet werden. Am Anfang werden die Kettenvariablen mit Konstanten initialisiert, die aus den Nackommastellen der Quadrat- oder Kubikwurzeln der ersten acht Primzahlen (d.h. 2, 3, 5, 7, 11, 13, 17, und 19) gebildet werden. Danach wird die Kompressionsfunktion auf den Status angewandt, welche im Wesentlichen aus einer Haupt-Schleife besteht, die insgesamt 64 mal durchlaufen wird. In jedem Durchlauf werden vier logische Operationen durchgeführt, die in der SHA-256 Spezifikation als Ch, Maj, Sigma0, Sigma1, Rho0 und Rho1 bezeichnet werden.

Vier dieser Operationen, nämlich Sigma0, Sigma1, Rho0 und Rho1, führen Rotationen und Verschiebe-Operationen auf 32-bit Worten aus, welche in einer Programmiersprache wie C oder C++ nicht wirklich effizient realisiert werden können. Deshalb macht es Sinn, diese Funktionen in Assembler zu implementieren. Konkret zeigen die Simulationsergebnisse auf einem 8-bit AVR Prozessor dass die C Implementierung der Kompressionsfunktion eine Ausführungszeit zwischen 70.000 und 90.000 Taktzyklen hat, wobei die genaue Zahl von der Optimierungsstufe des Compilers abhängt. Auf der anderen Seite benötigt die Assembler-Implementierung nur etwas mehr als 33.000 Taktzyklen, ist also mindestens doppelt so schnell.

CAPTCHA
Diese Frage dient der Überprüfung, ob Sie ein menschlicher Besucher sind und um automatisierten SPAM zu verhindern.

    Weitere Blogbeiträge

    Datenschutzinformation
    Der datenschutzrechtliche Verantwortliche (Internet Privatstiftung Austria - Internet Foundation Austria, Österreich) würde gerne mit folgenden Diensten Ihre personenbezogenen Daten verarbeiten. Zur Personalisierung können Technologien wie Cookies, LocalStorage usw. verwendet werden. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, treffen Sie bitte eine Auswahl: