Wo im Bitcoin-Protokoll wird SHA256(SHA256(x)) ausgeführt und warum?
Bitcoin verwendet fast überall doppeltes Hashing in einer von zwei Varianten:
RIPEMD160(SHA256(x)) namens Hash160, das eine 160-Bit-Ausgabe erzeugt
SHA256(SHA256(x)) namens Hash256, das eine 256-Bit-Ausgabe erzeugt
Es scheint, als hätte Satoshi Hash256 gewählt, wenn Kollisionen ein Problem darstellen, und Hash160, wenn nur (mehrere) zweite Vorabbilder eine Rolle spielen. Dies steht im Einklang mit dem Ziel, 128 Bit Sicherheit zu erreichen.
Sie benötigen einen 2*n-Bit-Hash, um eine n-Bit-Kollisionsresistenz zu erreichen, und Sie benötigen einen at*n-Bit-Hash, um eine n-Bit-Sekunden-Pre-Image-Resistenz zu erreichen. Wenn wir von konservativen 4 Milliarden Zielen und einem 128-Bit-Sicherheitsniveau ausgehen, führt dies zu 256-Bit-Hashes für Kollisionsresistenz und 160-Bit-Hashes für Multi-Target-Second-Preimages.
Warum hasht er also zweimal? Ich vermute, es ist, um Längenverlängerungsangriffe zu verhindern.
SHA-2 leidet wie alle Merkle-Damgard-Hashes unter einer Eigenschaft namens "Längenerweiterung". Dadurch kann ein Angreifer, der H(x) kennt, H(x||y) berechnen, ohne x zu kennen. Dies ist normalerweise kein Problem, aber es gibt einige Anwendungen, bei denen die Sicherheit vollständig aufgehoben wird. Das relevanteste Beispiel ist die Verwendung von H(k||m) als MAC, wobei ein Angreifer leicht einen MAC für m||m' berechnen kann. Ich glaube nicht, dass Bitcoin jemals Hashes auf eine Weise verwendet, die unter Längenerweiterungen leiden würde, aber ich denke, Satoshi hat sich für die sichere Wahl entschieden, dies überall zu verhindern.
Um diese Eigenschaft zu vermeiden, schlugen Ferguson und Schneier vor, SHA256d = SHA256(SHA256(x)) zu verwenden, wodurch Angriffe mit Längenerweiterung vermieden werden. Diese Konstruktion hat einige kleinere Schwächen (nicht relevant für Bitcoin), daher würde ich sie nicht für neue Protokolle empfehlen und stattdessen HMAC mit konstantem Schlüssel oder abgeschnittenem SHA512 verwenden.
Etwas verwandte Lektüre:
Hier ist die Haupt-Hashing-Funktion:
template<typename T1>
inline uint256 Hash(const T1 pbegin, const T1 pend)
{
static unsigned char pblank[1];
uint256 hash1;
SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
uint256 hash2;
SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
return hash2;
}
Ich würde sagen, überall, wo Anrufe getätigt werden, die SHA256 zweimal verwenden.
Warum, siehe hier .
Wir führen SHA-256d auf erweitertem RIPEMD-160-Hash aus und führen SHA-256 zweimal darauf aus. Wir nehmen die ersten 4 Bytes unseres SHA-256d-Hash als Prüfsumme und hängen sie an das Ende unseres erweiterten RIPEMD-160-Hash an. Nachdem wir das Ergebnis in base58 konvertiert haben, haben wir endlich unsere Bitcoin-Adresse.
Bitcoin verwendet fast überall Doppel-Hashing>SHA256[SH256[X]], genannt Hash256, das ein 160-Bit-Out erzeugt. Transaktionsausgaben und -eingaben verknüpfen. Checsum in einer Bitcoin-Adresse generieren. Block in einem Merkle-Baum hashen.
Das Hashen des Blocks in einem Merkle-Baum und mit zwei SHA256-Runden erhöht die Sicherheit, sodass beide Funktionen unterbrochen werden müssten, um den Hash rückgängig zu machen.
I. So generieren Sie eine Bitcoin-Adresse aus einem öffentlichen Schlüssel:
II. Um die Sicherheit zu erhöhen, indem SHA-256 manipulationssicher gemacht wird III. Auf Meldungseingängen und -ausgängen
Absender geben ein Sperrskript an und Empfänger geben ein Entsperrskript an. Diese gestapelten Hashes bestätigen den Arbeitsnachweis des sendenden UTXO und die Legitimität des Empfängers, die Transaktion zu erhalten.
Shelby Moore III
RIPEMD160(SHA256)
. Meine lange und ausführliche Begründung ist in meiner Antwort auf die verwandte Frage enthalten.