Kunci Bitcoin pribadi adalah nilai bilangan bulat dari 1 hingga 115792089237316195423570985008687907852837564279074904382605163141518161494337 atau dalam HEX 1 hingga 0xffffffffffffffffffffffffffffffffbab08 Di jaringan Bitcoin utama, ada alamat yang dimulai dengan 1: dikompresi, tidak dikompresi; 3 alamat: SigScript dan kompatibel dengan SegWit, serta alamat SegWit asli dimulai dengan bc1. Selain itu, sudah ada sekitar tujuh puluh garpu dengan awalan yang berbeda, tetapi memiliki akar yang sama dengan Bitcoin utama.
Alamat Bitcoin dihitung oleh fungsi tanda tangan kriptografis ECDSA () berdasarkan pada kurva elips.
Jadi, pertimbangkan untuk menghasilkan alamat Bitcoin dari kunci pribadi.
Kunci pribadi d - angka
Kunci publik Q adalah titik kurva elips sama dengan dG,
di mana G adalah titik dasar dari kurva.
- Untuk tanda tangan, angka acak k dipilih dalam kisaran [1, n-1].
- Titik kurva dihitung (x1, y1) = k * G
- Ini menghitung r = x1 mod N, di mana N adalah urutan kurva.
- Ini menghitung s = k-1 (H (m) + rd) mod N, di mana k-1 adalah angka kebalikan dari N ke k modulo N.
- H (m) adalah hash dari pesan yang ditandatangani.

Tanda tangan adalah pasangan (r, s).
Variabel "k" adalah acak dan diperoleh dalam algoritma ECDSA dari pustaka standar sistem operasi.
Dengan demikian, dalam keseluruhan fungsi Anda hanya dapat mempengaruhi variabel ini. Yang memberikan dua vektor serangan:
- kerentanan nomor acak semu
- dan keberuntungan universal di mana angka acak turun dua kali
Serangan generator nomor acak semu
Nils Schneider adalah orang pertama yang menyelidiki dan mempublikasikan masalah ini pada 28 Januari 2013 di halaman pribadinya. Tapi masalahnya tetap ada dan, apalagi, mendapatkan skala baru.
Serangan perangkat lunak pada PRNG dibagi menjadi tiga jenis:
Serangan kriptografi langsung berdasarkan analisis output dari algoritma.
Serangan berdasarkan data input dapat dibagi menjadi serangan dengan data input yang diketahui, serangan dengan data input yang dapat direproduksi, dan serangan terhadap data input yang dipilih.
Serangan didasarkan pada pengungkapan keadaan internal di mana penyerang mengetahui keadaan awal atau awal generator.
Juga termasuk di sini adalah penanda dalam perangkat lunak, di mana pencipta algoritma mengetahui salah satu nomor pseudorandom hash dan yang berikutnya dalam rantai. Algoritma seperti itu sulit untuk ditentukan dari luar, karena angka-angkanya terlihat merata di seluruh rentang.
Kerentanan perangkat lunak juga termasuk generasi nomor pseudorandom yang lemah di masing-masing perpustakaan. Seperti SSL, OpenSSL, beberapa perpustakaan Java, JavaScript, dll. Materi terperinci telah berulang kali dijelaskan dalam peretasan majalah dan dari waktu ke waktu telah menjadi contoh dalam buku teks kriptografi.
Apa skala ancaman untuk Bitcoin?
Memiliki simpul Bitcoin penuh, Anda dapat membandingkan dan mengelompokkan semua transaksi jaringan. Cukup membandingkan variabel "k" dalam semua transaksi di setiap alamat dan menemukan duplikat.
Pertama kali kami melakukan rekonsiliasi pada akhir 2016, maka database berjumlah lebih dari 210 juta alamat, transaksi dengan total lebih dari 170 juta alamat, dan tanda tangan 447 juta. Butuh seminggu untuk memindai alamat yang rentan ke dalam sepuluh utas.
Akibatnya, 1327 alamat rentan dengan tanda tangan yang sama ditemukan! Daftar alamat dapat ditemukan di akhir artikel.
Ini berarti Anda dapat menghitung kunci pribadi ke alamat-alamat ini, yang berarti mendapatkan kendali atas uang itu.
Kebocoran terbesar terjadi pada musim panas 2015. JavaScript wallet Blockchain.info selama beberapa jam menghasilkan nilai variabel "k" yang sama. Yang menyebabkan pencurian sekitar 200 Bitcoin!
Jika kita menghilangkan faktor manusia dari kerentanan perangkat lunak, probabilitas kebetulan adalah sekitar 0,000296868%. Sama sekali tidak banyak, tetapi saya benar-benar tidak ingin menjadi begitu "beruntung" dan kehilangan uang saya.
Bagaimana cara mengatasinya?
Seperti yang kami jelaskan di atas, kerentanan ini hanya berfungsi saat mengirim pembayaran dan menghasilkan variabel "K" yang sama pada setidaknya dua transaksi. Karena itu, jika Anda tidak membuat transaksi keluar atau meminimalkan jumlahnya, maka tidak ada ancaman apa pun. Gagasan seperti itu telah lama diimplementasikan dalam protokol Bitcoin BIP 32 (Hierarchical Deterministic Walletets, HD wallet) Hierarchical Deterministic Wallet.
Idenya adalah menggunakan kunci pribadi dari mana Anda bisa mendapatkan rantai alamat Bitcoin yang tak ada habisnya. Anda dapat menggunakan alamat satu kali untuk menerima setiap transaksi. Pada saat yang sama, jumlah saldo dompet HD adalah jumlah semua saldo rantai alamat. Dan dengan transaksi keluar, koin dikumpulkan dari alamat ini, membuat satu transaksi keluar untuk setiap alamat Bitcoin. Perubahan akan diarahkan ke alamat Bitcoin baru dari rantai alamat.
Skema kerja ini secara signifikan meningkatkan keamanan dan anonimitas dompet.
Referensi:
[1]
ECDSA - Kegagalan Aplikasi dan Implementasi, Markus Schmid, UC SANTA BARBARA, CS 290G, FALL 2015.[2]
Nils Schneider: Memulihkan kunci pribadi Bitcoin menggunakan tanda tangan yang lemah dari blockchain, entri Blog, 28 Januari 2013.[3]
Serangan Kombinasi Pemulihan Kunci Pribadi[4]
Daftar alamat rentan dan saldo keseluruhan