Brute-Force-Mathematik für Trezor und BIP39

Home Foren Trezor Wallet Brute-Force-Mathematik für Trezor und BIP39

Ansicht von 0 Antwort-Themen
  • Autor
    Beiträge
    • #3226
      admin
      Mitglied
      Up
      0
      Down
      ::

      [#]:_[strip]___Wenn_die_Formatierung_geschädigt_ist,_bitte_lassen_Sie_mich_wissen_welche_App_Sie_verwendet_haben

      [#]:_[strip]___—–BEGIN_PGP_SIGNED_MESSAGE—–
      [#]:_[strip]___Hash:_SHA256

      [#]:_[begin]___Document_Hash_Starts_at_the_beginning_of_this_line_{_EOL=`\n`_}
      [#]:_[rights]__Copyright_2022_brianddk_at_github_https://github.com/brianddk
      [#]:_[license]_Apache_2.0_Lizenz_https://www.apache.org/licenses/LICENSE-2.0
      [#]:_[repo]____github.com/brianddk/reddit/blob/master/markdown/brute-force.md
      [#]:_[btc]_____BTC-b32:_bc1qwc2203uym96u0nmq04pcgqfs9ldqz9l3mz8fpj
      [#]:_[tipjar]__github.com/brianddk/reddit/blob/master/tipjar/tipjar.txt
      [#]:_[ref]_____github.com/brianddk/reddit/blob/master/python/signed-md.py
      [#]:_[version]_1.0
      [#]:_[title]___Brutale_Kraft_Math_für_Trezor_und_BIP39
      [#]:_[usageA]__<msg.md_pgm.py_stripGpg_|_pgm.py_stripUnderscore
      [#]:_[usageB]__<msg.md_pgm.py_stripGpg_|_pgm.py_setHash_|_gpg2_–clear-sign_\
      [#]:_[usageB.]____|_pgm.py_fixupGpg_|_pgm.py_prepGpg_|_gpg2_–überprüfen
      [#]:_[verify]__re1=’s@(^\[#\]:\x5f\[strip\]\x5f+)’_re2='([^\x5f]*)\x5f?’_\
      [#]:_[verify.]____re3=’@\2\x20\3\x20\4\x20@g’_sh_-c_\
      [#]:_[verify.]____’sed_-E_“$re1$re2$re2$re2$re3″_msg.md’_|_gpg2_–verify

      Ich habe ein paar Beiträge gesehen, in denen nach Seed Mnemonic, Passphrase und PIN Brute-Force Workloads gefragt wurde. Hier ist mein Versuch, das zu erklären. Zunächst einmal sollten wir versuchen, einige dieser Zahlen zu vereinfachen und sie alle in log_base_2 anzugeben. Dies wird manchmal als „Bits der Entropie“ bezeichnet. Aber nennen Sie sie, wie Sie wollen.

      ### Cracking-Hashrate

      Wenn wir uns ansehen, wie viele Schätzungen pro Sekunde durchgeführt werden können, sollten wir uns einige Benchmarks ansehen. Wie wir weiter unten sehen werden, handelt es sich bei der überwiegenden Mehrheit der Arbeit hier um SHA512-Hashes. Ein Blick auf einen [recent SHA512 benchmark](https://openbenchmarking.org/test/pts/hashcat&eval=306f31f896ee6afac758df6db7589b6a2a232723#metrics) zeigt, dass ein RTX3080 in der Lage ist, 7 Milliarden Hashes pro Sekunde (7 GH/s) durchzuführen. Um die Rechnung zu vereinfachen, nehmen wir an, dass ein Angreifer zu 100 GH/s fähig ist. Das ist eine enorme Übertreibung, da es bei den meisten dieser Dinge Engpässe bei der Parallelisierung gibt. Wenn man also 10 GPUs hat, wird man aufgrund von Engpässen keine 10-fache Steigerung erzielen.

      Außerdem wird häufig angenommen, dass Bitcoin-Schürfer (SHA256) mit dem Knacken beauftragt werden könnten. Auch das stimmt nicht, da SHA256 und SHA512 unterschiedlich sind. Außerdem sind Speicherlesevorgänge erforderlich, die einen Großteil der Laufgeschwindigkeit, die ein theoretischer Miner erreichen könnte, zunichte machen würden. [Here’s a detailed writeup](https://rya.nc/asic-cracking.html), falls Sie noch nicht überzeugt sind.

      Lassen Sie uns ein Jahr des Knackens als eine einzige Einheit verwenden. Wenn wir 100 GH/s für ein Jahr verwenden, erhalten wir (mit log_2) 61,45.

      ### Passphrase cracking gegeben Mnemonic

      Versuchen wir zunächst zu quantifizieren, welche Arten von Operationen erforderlich sind, um hier etwas zu tun. Um so etwas wie eine Passphrase zu knacken, vorausgesetzt, man kennt die Seed-Mnemonik, sind hier die grundlegenden Schritte:

      1. Durchführen einer Prüfsummenüberprüfung für die Mnemonik (SHA256)
      2. Durchführen einer HMAC SHA512-Operation mit der Zeichenfolge (Kürzel + Passphrase)
      3. Wiederholen Sie \#2 mit dem Ergebnis und iterieren Sie insgesamt 2048 Mal
      4. Nimm das resultierende BIP32 „xprv“ und bestimme deine Ableitung
      5. Führe für jeden Knoten in deiner Ableitung eine HMAC SAH512 Operation durch
      6. Wiederholen Sie \#5 für jeden der drei wichtigsten Bitcoin-Skripttypen

      Für jede erratene Passphrase erfordern die Schritte 2-3 also 2048 HMAC SHA512-Operationen. Jede Standardableitung erfordert 5 HMAC SHA512-Operationen, und für jede Vermutung müssen Sie 3 eindeutige Ableitungen durchführen (Legacy, P2SH-Segwit, Segwit), um Bitcoin zu überprüfen. Insgesamt also (2048 + 3 * 5) oder 2063 Versuche pro Passphrase (mit einem Seed). Oder in log_2, 11.01.

      Angesichts der obigen Hash-Rate und unserer Hashes pro Versuch wissen wir nun, dass unsere Passphrase 50,44 Bits Entropie (61,45 – 11,01) benötigt, um einen einjährigen Crack zu überlisten. Wenn Ihre Passwörter also den Zeichensatz base58 verwenden, brauchen Sie eine Passphrase mit 9 Zeichen, oder wenn Sie die Wortliste BIP39 verwenden, brauchen Sie eine Passphrase mit 5 Wörtern.

      ### Mnemonic cracking

      Beim Knacken der Mnemonik ist die Zählung genau wie beim Knacken der Passphrase, aber wir müssen bei jeder einzelnen Vermutung eine Prüfsummenüberprüfung (Schritt \#1) durchführen. Aber wir können uns etwas Arbeit sparen, denn wenn die Prüfsumme nicht bestanden wird, können wir die Schritte 2-6 überspringen. Die Anzahl der bestandenen und nicht bestandenen Prüfsummen hängt also von der Anzahl der Wörter in der Mnemonik ab. Bei 12 Wörtern ergibt sich ein Verhältnis von `Pass:Fail` von `1:16` oder `1:(2**12/3)`. Die letztgenannte Formel gilt für alle Wortzahlen (12, 15, 18, 21, 24).

      Die Anzahl der Hashes für eine mnemonische Vermutung beläuft sich also auf einen SHA256, um die Prüfsumme zu testen, der Rest ist wie zuvor. Wir können die Anzahl der fehlgeschlagenen Prüfsummen dividieren, so dass sich die Anzahl der Vermutungen pro MÖGLICHER mnemonischer Kombination ergibt:

      let w = Anzahl_der_Wörter
      hash_pro_mnemo = (2063 + 2**(w/3)) / 2**(w/3)

      Bleibt man bei log_2, so ergibt `log_2(hash_per_mnemo(w))` für `w:{12, 15, 18, 21, 24}` jeweils `{7.02, 6.03, 5.05, 4.10, 3.18}`. Und natürlich ergibt sich die Anzahl der Memo-Raten zu:

      let w = Anzahl_der_Wörter
      num_guesses = 2048**w

      Wenn man alles zusammenzählt (Summe der Erinnerungsprotokolle), ergibt sich die Anzahl der Hashes, die erforderlich sind, um den gesamten Schlüsselraum für `w:{12, 15, 18, 21, 24}` abzudecken, zu `{139, 171, 203, 235, 267}`. Es ist offensichtlich, dass diese Zahlen für jedes Knacken unerreichbar sind. Es würde 2^77 Jahre (139 – 61,45) dauern, um einen 12-Wort-Seed zu knacken. Oder 2,21 Billionen Milliarden Jahre. Weit über den Wärmetod des Universums hinaus.

      ### Pin cracking

      Im Gegensatz zu Mnemonic und Passphrase verwenden PINs ChaCha20 und nicht SHA, und es wird als vollständiger Datenentschlüsselungsalgorithmus verwendet. Um eine PIN mit roher Gewalt zu knacken, sind folgende Schritte erforderlich, vorausgesetzt, Sie haben den Gerätespeicher geknackt

      1. Führen Sie einen HMAC SHA256 Hash für die PIN-String durch
      2. Wiederholen Sie \#1 mit dem Ergebnis und wiederholen Sie es insgesamt 10.000 Mal
      3. Verwenden Sie das Ergebnis von \#2, um den erfassten Speicher zu entschlüsseln
      4. Den entschlüsselten Speicher auf magische Bytes untersuchen, um die Entschlüsselung zu bestätigen

      Es gibt also 10.000 SHA256-Hashes, eine vollständige ChaCha20-Entschlüsselung, gefolgt von einigen Speicherlesungen zur Überprüfung des Erfolgs. Da ich aber keine guten Benchmarks für diese Operation habe, kann ich nur einen aus dem Beitrag von Kraken verwenden. Das Kraken-Team knackte einen 4-stelligen Pin (Schlüsselbereich von 10000) in weniger als 120 Sekunden. Das sind 83 Versuche pro Sekunde oder in log_2 31,29 Bits Entropie pro Jahr. Ein 9-stelliger Pin würde also Monate, ein 10-stelliger Pin Jahre und ein 11-stelliger Pin Jahrzehnte zum Knacken benötigen.

      ### Schlussfolgerung

      Die Seed-Mnemonik ist bei weitem nicht mit roher Gewalt zu knacken. Wenn Sie sich jedoch Sorgen über einen Disassemblierungsangriff vom Typ Joe Grand oder Kraken machen, können Sie sich mit `sd-protect`, einem großen Pin oder einer großen Passphrase davor schützen. Jede dieser Optionen ist in Ordnung, Sie brauchen nicht alle drei. Die PIN sollte 10 oder 11 Ziffern lang sein. Die Größe der Passphrase wäre 9 zufällige base58-Zeichen oder 5 zufällige bip39-Wörter. Wie die Seed-Mnemonik ist auch „sd-protect“ weit über jeden Brute-Force-Versuch hinaus.

      [#]:_[end]_____Document_Hash_ENDS_at_the_end_of_this_line_{_EOL=`\n`_}
      [#]:_[hash]____7a74dd38b9e131dc7c4b1a9e8b8671bb9e168548f7e7f1de90a3c7425882dc9b
      ^&copy; ^hash: ^[7a74dd38b9e131dc7](https://web.archive.org/web/20220212015757/https://www.blockchain.com/btc-testnet/tx/580a0e263189784395fbc88bbb5e928effaaf5b622888b3d17f3262e4123625a)

      [#]:_[strip]___—–BEGIN_PGP_SIGNATURE—–

      [#]:_[strip]___iQFEBAEBCAAuFiEEYoX6CPtntyvk2kGEg18EM6bVGGAFAmIHFQsQHGJyaWFuZGRr
      [#]:_[strip]___QHJlZGRpdAAKCRCDXwQzptUYYLRQB/9350NYnD14eB+3yG/PCwjlJ+2XgdDP7A3S
      [#]:_[strip]___gW0VFmP5mKJEsD2fu39D8TOyZww8ikUxk+06k8TzQ3rdIQTTZBkXGTH1r19ngKbr
      [#]:_[strip]___HrzQRC6oThzv2+NWWuyenX75Z1nrcj04rAYmqy9hORtera64z/tmjRqitTdd7YbE
      [#]:_[strip]___hteaF9Zl3p1t6VddaRK6cbbIFsH9/Kq4VjI/cvQdhQXpi0D4EbYwh5ioLK+4Tcog
      [#]:_[strip]___F7lTd27vSiyCnI0ElIXnQ2hC+/YLR0RkxdeRIIGl18IlOfWcSDJcItvqA6RtlFdT
      [#]:_[strip]___RCTyUJOxATl3RUEPGKHenbbvGuQ/eMXSaOC+3TbS4x8WOUW1FQ1P
      [#]:_[strip]___=qMuS
      [#]:_[strip]___—–END_PGP_SIGNATURE—–

Ansicht von 0 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Zur Werkzeugleiste springen