
Generatore di hash Onion basato su GPU
Scallion era un progetto hobbistico per imparare OpenCL e RSA. Attualmente non manteniamo più scallion. È andato in degrado in due modi importanti:
Con sufficiente attenzione e sforzo, sarebbe possibile superare entrambe le sfide sopra indicate. Potremmo implementare il supporto per l'algoritmo di generazione delle chiavi ECDSA sulla GPU per ottenere il supporto Tor v3. Potremmo aggiornare OpenSSL e sostituire le funzioni matematiche con un'altra libreria, o creare un nostro wrapper di codice gestito per la libreria OpenSSL. Tuttavia, sarebbe probabilmente meglio aggiungere il supporto per gli indirizzi onion v3 a un progetto mantenuto come vanitygen-plus.
Scallion ti permette di creare chiavi GPG vanity e indirizzi .onion (per i servizi nascosti di Tor) usando OpenCL.
Scallion funziona su Mono (testato su Arch Linux) e .NET 3.5+ (testato su Windows 7 e Server 2008).
Scallion è attualmente in fase beta e in sviluppo attivo. Tuttavia, riteniamo che sia pronto per l'uso. I miglioramenti sono previsti principalmente nelle prestazioni, nell'interfaccia utente e nella facilità di installazione, non nell'algoritmo complessivo utilizzato per generare le chiavi.
Scallion è disponibile sotto licenza MIT. Se usi codice da questo progetto nei tuoi progetti, apprezziamo che ce lo comunichi a [email protected].
Ecco alcune domande frequenti e le relative risposte:
Perché generare chiavi GPG?
Scallion è stato utilizzato per trovare collisioni per ogni ID chiave a 32 bit nel set forte del Web of Trust, dimostrando quanto insicuri siano gli ID chiave a 32 bit. C'è/era un talk al DEFCON (video) e ulteriori informazioni si trovano su https://evil32.com/.
Quali sono i caratteri validi?
Gli indirizzi .onion di Tor usano Base32, composto da tutte le lettere e dalle cifre da 2 a 7 incluse. Non fanno distinzione tra maiuscole e minuscole.
Le impronte GPG usano esadecimale, composto dalle cifre 0-9 e dalle lettere A-F.
Si possono usare ASIC Bitcoin (es. Jalapeno, KnC) per accelerare questo processo?
Purtroppo no. Mentre il processo usato da Scallion è concettualmente simile (incrementare un nonce e controllare l'hash), i dettagli sono diversi (SHA-1 vs doppio SHA-256 per Bitcoin). Inoltre, gli ASIC Bitcoin sono così veloci perché sono estremamente specializzati per le applicazioni di mining Bitcoin. Ad esempio, ecco il datasheet per il CoinCraft A-1, un ASIC che non è mai uscito, ma probabilmente è indicativo dell'approccio generale. Il microcontrollore invia lavoro sotto forma degli ultimi 128 bit di un blocco Bitcoin, lo stato intermedio dell'hash dei bit precedenti, una difficoltà target e il nonce massimo da provare. L'ASIC sceglie la posizione in cui inserire il nonce e sceglie quali blocchi soddisfano l'hash. Scallion deve inserire il nonce in una posizione diversa e controlla una corrispondenza di pattern piuttosto che semplicemente "inferiore a XXXX".
Come si possono usare più dispositivi?
Esegui più istanze di Scallion. 😄 Le ricerche di Scallion sono probabilistiche, quindi non ripeterai lavoro con il secondo dispositivo. Il supporto multi-dispositivo reale non sarebbe troppo difficile, ma non aggiungerebbe molto. Ho eseguito con successo diverse istanze di scallion in tmux o screen. Dovrai solo interrompere manualmente tutti i lavori quando uno trova un pattern (o scrivere uno script shell per monitorare il file di output e ucciderli tutti quando vede risultati).
Vuoi solo l'ultima versione binaria? Scaricala qui.
Prerequisiti
Ottieni l'ultimo mono per la tua distribuzione Linux:
Installa le dipendenze comuni:
sudo apt-get update
sudo apt-get install libssl-dev mono-devel
Compilazione AMD/OpenSource
sudo apt-get install ocl-icd-opencl-dev
Compilazione Nvidia
sudo apt-get install nvidia-opencl-dev nvidia-opencl-icd
Infine
msbuild scallion.sln
Avere il runtime nvidia-docker container
Compila il container:
docker build -t scallion -f Dockerfile.nvidia .
Esegui:
docker run --runtime=nvidia -ti --rm scallion -l
Riavviare Scallion durante una ricerca non farà perdere "progressi". È una ricerca probabilistica e Scallion non fa "progressi"
Elenca i dispositivi
$ mono scallion/bin/Debug/scallion.exe -l
Genera un hash
$ mono scallion/bin/Debug/scallion.exe -d 0 prefisso
Cooking up some delicious scallions...
Using kernel optimized from file kernel.cl (Optimized4)
Using work group size 128
Compiling kernel... done.
Testing SHA1 hash...
CPU SHA-1: d3486ae9136e7856bc42212385ea797094475802
GPU SHA-1: d3486ae9136e7856bc42212385ea797094475802
Looks good!
LoopIteration:40 HashCount:671.09MH Speed:9.5MH/s Runtime:00:01:10 Predicted:00:00:56 Found new key! Found 1 unique keys.
<XmlMatchOutput>
<GeneratedDate>2014-08-05T07:14:50.329955Z</GeneratedDate>
<Hash>prefix64kxpwmzdz.onion</Hash>
<PrivateKey>-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCmYmTnwGOCpsPOqvs5mZQbIM1TTqOHK1r6zGvpk61ZaT7z2BCE
FPvdTdkZ4tQ3/95ufjhPx7EVDjeJ/JUbT0QAW/YflzUfFJuBli0J2eUJzhhiHpC/
1d3rb6Uhnwvv3xSnfG8m7LeI/Ao3FLtyZFgGZPwsw3BZYyJn3sD1mJIJrQIEB/ZP
ZwKBgCTUQTR4zcz65zSOfo95l3YetVhfmApYcQQd8HTxgTqEsjr00XzW799ioIWt
vaKMCtJlkWLz4N1EqflOH3WnXsEkNA5AVFe1FTirijuaH7e46fuaPJWhaSq1qERT
eQT1jY2jytnsJT0VR7e2F83FKINjLeccnkkiVknsjrOPrzkXAkEA0Ky+vQdEj64e
iP4Rxc1NreB7oKor40+w7XSA0hyLA3JQjaHcseg/bqYxPZ5J4JkCNmjavGdM1v6E
OsVVaMWQ7QJBAMweWSWtLp6rVOvTcjZg+l5+D2NH+KbhHbNLBcSDIvHNmD9RzGM1
Xvt+rR0FA0wUDelcdJt0R29v2t19k2IBA8ECQFMDRoOQ+GBSoDUs7PUWdcXtM7Nt
QW350QEJ1hBJkG2SqyNJuepH4PIktjfytgcwQi9w7iFafyxcAAEYgj4HZw8CQAUI
3xXEA2yZf9/wYax6/Gm67cpKc3sgKVczFxsHhzEml6hi5u0FG7aNs7jQTRMW0aVF
P8Ecx3l7iZ6TeakqGhcCQGdhCaEb7bybAmwQ520omqfHWSte2Wyh+sWZXNy49EBg
d1mBig/w54sOBCUHjfkO9gyiANP/uBbR6k/bnmF4dMc=
-----END RSA PRIVATE KEY-----
</PrivateKey>
<PublicModulusBytes>pmJk58BjgqbDzqr7OZmUGyDNU06jhyta+sxr6ZOtWWk+89gQhBT73U3ZGeLUN//ebn44T8exFQ43ifyVG09EAFv2H5c1HxSbgZYtCdnlCc4YYh6Qv9Xd62+lIZ8L798Up3xvJuy3iPwKNxS7cmRYBmT8LMNwWWMiZ97A9ZiSCa0=</PublicModulusBytes>
<PublicExponentBytes>B/ZPZw==</PublicExponentBytes>
</XmlMatchOutput>
init: 491ms / 1 (491ms, 2.04/s)
generate key: 1193ms / 6 (198.83ms, 5.03/s)
cpu precompute: 10ms / 6 (1.67ms, 600/s)
total without init: 70640ms / 1 (70640ms, 0.01/s)
set buffers: 0ms / 40 (0ms, 0/s)
write buffers: 3ms / 40 (0.08ms, 13333.33/s)
read results: 67442ms / 40 (1686.05ms, 0.59/s)
check results: 185ms / 40 (4.63ms, 216.22/s)
9.50 million hashes per second
Stopping the GPU and shutting down...
Scallion supporta la ricerca di uno o più pattern multipli attraverso una sintassi regex primitiva. Sono supportate solo le classi di caratteri (es. [abcd]). Il carattere . rappresenta qualsiasi carattere. Gli indirizzi Onion sono sempre lunghi 16 caratteri e le impronte GPG sono sempre 40 caratteri. Puoi trovare un suffisso mettendo $ alla fine della corrispondenza (es. DEAD$). Infine, la sintassi pipe (es. pattern1|pattern2) può essere usata per trovare più pattern. Cercare più pattern (entro limiti ragionevoli) NON produrrà una significativa diminuzione della velocità. Molte regexp produrranno un singolo pattern sulla GPU e non comporteranno alcuna riduzione di velocità.
Alcuni casi d'uso con esempi:
Genera un prefisso seguito da un numero per una migliore leggibilità:
mono scallion.exe prefix[234567]
Cerca più pattern contemporaneamente (n.b. -c fa sì che scallion continui a generare anche dopo aver trovato un risultato)
mono scallion.exe -c prefisso scallion hashes
mono scallion.exe -c "prefisso|scallion|hashes"
Cerca il suffisso "badbeef"
mono scallion.exe .........badbeef
mono scallion.exe --gpg badbeef$ # Genera chiave GPG
Esempio complicato auto-esplicativo:
mono scallion.exe "suffixa$|suffixb$|prefixa|prefixb|a.suffix$|a.test.$"
Ad alto livello, Scallion funziona come segue:
L'algoritmo di base è descritto sopra. La velocità/prestazione è il risultato di una massiccia parallelizzazione, sia sulla GPU che sulla CPU.
È importante rendersi conto che Scallion esegue una ricerca probabilistica. I tempi effettivi possono variare significativamente da quelli previsti
La generazione iniziale della chiave RSA viene eseguita sulla CPU. Un i7 Ivybridge può generare 51 chiavi al secondo usando un singolo core. Ogni chiave può fornire 1 gigahash di esponenti da minare e una CPU decente può tenere il passo con diverse GPU come implementato attualmente.
L'hashing SHA1 viene eseguito sulla GPU. I tassi di hash per diverse GPU che abbiamo testato sono riportati di seguito (raggruppati per produttore e ordinati per potenza):
MH/s = milioni di hash al secondo
Vale la pena notare che Intel ha rilasciato driver OpenCL per i suoi processori e si possono trovare collisioni brevi sulla CPU.
Per calcolare il numero di secondi necessari per una data collisione parziale (in media), usa la formula:
| Tipo | Tempo stimato |
|---|---|
| Chiave GPG | 2^(4*lunghezza-1) / velocitàhash |
| Indirizzo .onion | 2^(5*lunghezza-1) / velocitàhash |
Ad esempio sulla mia nVidia Quadro K2000M, vedo circa 90 MH/s. Con quella velocità posso generare un prefisso .onion di otto caratteri in circa 1h 41m, 2^(5*8-1)/90 milioni = 101 minuti.
Per impostazione predefinita, Scallion utilizzerà la dimensione del workgroup preferita riportata dal tuo dispositivo. Questo è un valore predefinito ragionevole, ma sperimentare con il workgroup potrebbe aumentare le prestazioni.
Le chiavi generate da Scallion sono abbastanza simili a quelle generate da shallot. Hanno esponenti pubblici insolitamente grandi, ma vengono sottoposte all'intera serie di controlli di integrità raccomandati da PKCS #1 v2.1 tramite la funzione RSA_check_key di openssl. Scallion supporta diverse dimensioni di chiave RSA, con kernel ottimizzati per 1024b, 2048b e 4096b. Altre dimensioni di chiave potrebbero funzionare, ma non sono state testate.
Sentiti libero di indirizzare donazioni all'indirizzo Bitcoin: 1FxQcu6vhpwsqcTjPsjK43CZ9vjnuk4Hmo
| GPU | Velocità |
|---|
| Intel i7-2620M | 9.9 MH/s |
| Intel i5-5200U | 118 MH/s |
| NVIDIA GT 520 | 38.7 MH/s |
| NVIDIA Quadro K2000M | 90 MH/s |
| NVIDIA GTS 250 | 128 MH/s |
| NVIDIA GTS 450 | 144 MH/s |
| NVIDIA GTX 670 | 480 MH/s |
| NVIDIA GTX 970 | 2350 MH/s |
| NVIDIA GTX 980 | 3260 MH/s |
| NVIDIA GTX 1050 (M) | 1400 MH/s |
| NVIDIA GTX 1070 | 4140 MH/s |
| NVIDIA GTX 1070 TI | 5100 MH/s |
| NVIDIA GTX TITAN X | 4412 MH/s |
| NVIDIA GTX 1080 | 5760 MH/s |
| NVIDIA Tesla V100 | 11646 MH/s |
| AMD A8-7600 APU | 120 MH/s |
| AMD Radeon HD5770 | 520 MH/s |
| AMD Radeon HD6850 | 600 MH/s |
| AMD Radeon RX 460 | 840 MH/s |
| AMD Radeon RX 470 | 957 MH/s |
| AMD Radeon R9 380X | 2058 MH/s |
| AMD FirePro W9100 | 2566 MH/s |
| AMD Radeon RX 480 | 2700 MH/s |
| AMD Radeon RX 580 | 3180 MH/s |
| AMD Radeon R9 Nano | 3325 MH/s |
| AMD Vega Frontier Edition | 7119 MH/s |