Bitcoin: Public Key hashen mit SHA-256 und dann RIPEMD-160

public key hash für bitcoin

Der public Key wird zunächst mit SHA-256 gehasht. Der Output dieser kryptografischen Hashfunktion wird dann mit RIPEMD-160 gehasht, einer anderen kryptografischen Hashfunktion, die als Output eine 160 Bit (20 Byte) lange Zahl erzeugt. Wir nennen diesen letzten Hash den public Key Hash (PKH). Wie hier im BPMN Flow dargestellt: …

Aber warum verwendtet man bei Bitcoin SHA-256 und dann RIPEMD-160?

RIPEMD160 als letzten kryptografischen Hash zu benutzen ist wahrscheinlich gewählt wurden, damit die PKHs möglichst kurz werden. Es ist ein gut balancierter Tradeoff zwischen Sicherheit und Grösse.

Es könnte sich auch, wenn eine der Hashfunktionen sich als nicht Pre-Image resistent herausstellen würde, die andere es immer noch sein. Wenn man also einen Input für RIPEMD-160 berechnen könnte, der einen bestimmten PKH Output ergibt, dann müsste man immer noch eine Pre-Image Attacke gegen SHA256 ausführen, um den public Key zu finden. Ebenso müsste man, wenn man einen Input für SHA-256 finden könnte, der einen bestimmten Output erzeugt, immer noch erst eine Pre-Image Attacke auf RIPEMD-160 ausführen, bevor man das Ergebnis zur Berechnung des public Keys hernehmen kann.

Es gibt ausserdem noch zu bedenken, dass unterschiedliche Organisationen die beiden kryptografischen Hashfunktionen entwickelt haben. RIPEMD-160 wurde an einer Europäischen Universität in offener Kollaboration mit einer grossen Gemeinde von Kryptografen entwickelt. SHA-256 wurde von der US National Security Agency (NSA) entwickelt.

Hier mal eine kleine Implementierung in Java, als kleines kommentiertes Beispiel.

Hier der Output:

Man kann also gut sehen, das zumindestens 13 Byte eingespart wurden. Der ganze Code liegt auch in meinem Bitbucket-Repo.