Öz şəxsi Bitcoin açarınızı necə yaratmaq olar

Kriptovalyutalarda xüsusi bir açar istifadəçinin cüzdanına girməsinə imkan yaradır. Şəxsi açarı olan şəxs bu cüzdandakı sikkələrə tam nəzarət edə bilər. Bu səbəbdən bunu gizli saxlamalısınız. Əgər açarı həqiqətən özünüz yaratmaq istəyirsinizsə, onu etibarlı bir şəkildə yaratmaq mantiqidir.

Burada xüsusi açarlara giriş verəcəyəm və sizə öz açarınızı yaratmaq üçün müxtəlif kriptoqrafik funksiyalardan necə istifadə edəcəyinizi göstərəcəyəm. Alqoritmi və kodu Python-da təsvir edəcəyəm.

Şəxsi açar yaratmalıyam?

Çox vaxt eləmirsən. Məsələn, Coinbase və ya Blockchain.info kimi bir veb cüzdan istifadə edirsinizsə, xüsusi açar sizin üçün yaradılır və idarə olunur. Eyni mübadilə üçün də.

Mobil və masa üstü cüzdanlar, ümumiyyətlə sizin üçün xüsusi bir açar yaradır, baxmayaraq ki, öz şəxsi açarlarınızdan bir cüzdan yaratmaq imkanı ola bilər.

Bəs niyə hər halda yaratmaq lazımdır? Budur səbəblərim:

  • Heç kimin açarı bilmədiyindən əmin olmaq istəyirsən
  • Kriptoqrafiya və təsadüfi ədədi yaratmaq (RNG) haqqında daha çox şey öyrənmək istəyirsən.

Şəxsi açar nədir?

Rəsmi olaraq Bitcoin (və digər bir çox kriptovalyutalar) üçün xüsusi bir açar 32 baytdan ibarətdir. İndi bu baytları yazmağın bir çox yolu var. 256 ədəd və sıfır (32 * 8 = 256) və ya 100 zar sırası ola bilər. Bu ikili simli, Base64 simli, WIF açarı, mnemonik və ya nəhayət bir hex simli ola bilər. Məqsədlərimiz üçün 64 simvollu bir hex simli istifadə edirik.

Fərqli formatlarda yazılmış eyni gizli açar.

Niyə tam 32 bayt? Yaxşı sual! Şəxsi açardan ümumi açar yaratmaq üçün Bitcoin ECDSA (Elliptic Curve Digital Signature) alqoritmindən istifadə edir. Xüsusilə, secp256k1 adlı xüsusi bir döngə istifadə olunur.

Bu döngə artıq 256 bit sırasındadır, giriş olaraq 256 bit alır və 256 bit tam ədədi çıxır. 256 bit isə tam 32 baytdır. Başqa sözlə, bu əyri alqoritmi qidalandırmaq üçün 32 bayt məlumata ehtiyacımız var.

Şəxsi açar üçün əlavə bir tələb var. ECDSA istifadə etdiyimiz üçün açar müsbət olmalı və əyri sırasından az olmalıdır. Secp256k1 sırası FFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 sırası olduqca böyükdür: demək olar ki, hər 32 baytlıq say daha kiçik olacaq.

Sadəlövh metod

Bəs 32 baytlıq tam ədədi necə yarada bilərik? Ağla gələn ilk şey sadəcə seçdiyiniz dildə RNG kitabxanasından istifadə etməkdir. Python hətta kifayət qədər bit yaratmaq üçün səliqəli bir yol təqdim edir:

təsadüfi bit idxal = random.getrandbits (256) 30848827712021293731208415302456569301499384654877289245795786476741155372082 bits_hex = hex (bit) = 0x4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32 private_key bits_hex [2] # 4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32

Yaxşı görünür, amma elə deyil. Görürsən, normal RNG kitabxanaları çox etibarlı olmadığı üçün kriptoqrafiya üçün nəzərdə tutulmayıb. Bir başlanğıc dəyərinə əsasən nömrələr yaradırlar və varsayılan olaraq başlanğıc dəyəri cari zamandır. Beləliklə, yuxarıdakı bitləri nə vaxt yaratdığım barədə kobud bir fikriniz varsa, yetərincə bir neçə dəyişikliyə məcbur etmək lazımdır.

Xüsusi bir açar yaratdığınız zaman son dərəcə etibarlı olmaq istəyirsiniz. Unutmayın, kimsə şəxsi açarı öyrənirsə, müvafiq pul kisəsindəki bütün sikkələri asanlıqla oğurlaya bilər və onları geri qaytarmaq şansınız yoxdur.

Beləliklə, daha təhlükəsiz olmağa çalışaq.

Kriptoqrafik cəhətdən güclü RNG

Standart bir RNG metodu ilə yanaşı, proqramlaşdırma dilləri ümumiyyətlə kriptoqrafik əməliyyatlar üçün xüsusi hazırlanmış bir RNG təmin edir. Bu metod ümumiyyətlə daha təhlükəsizdir, çünki entropiyanı birbaşa əməliyyat sistemindən alır. Belə bir RNG-nin nəticəsini çoxaltmaq çətindir. Bunu nə vaxt yaradıldığını bilməklə və ya toxum olmadığı üçün toxuma sahib olmaqla edə bilməzsiniz. Ən azı istifadəçi bir başlanğıc dəyəri daxil etmir, proqram tərəfindən yaradılır.

Python'da kriptoqrafik cəhətdən güclü RNG "Sirlər" modulunda tətbiq olunur. Şəxsi açarın təhlükəsizliyini təmin etmək üçün yuxarıdakı kodu dəyişdirin.

Secrets Import bit = secrets.randbits (256) 46518555179467323509970270980993648640987722172281263586388328188640792550961 bits_hex = hex (bit) 0x66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31 private_key = bits_hex [2] # 66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31

Bu əladır. Mənim kompüterimə daxil olsanız belə, bunu çoxalda bilməzsiniz. Ancaq daha dərinə gedə bilərikmi?

Xüsusi veb saytlar

Sizin üçün təsadüfi nömrələr yaradacaq veb saytlar var. Burada yalnız ikisini nəzərdən keçirəcəyik. Bunlardan biri tanınmış bir ümumi təyinatlı təsadüfi ədədi yaradan random.org. Başqa biri, xüsusi Bitcoin açarları yaratmaq üçün xüsusi hazırlanmış bitaddress.org.

Random.org bizə bir açar yaratmağa kömək edə bilərmi? Şübhəsiz ki, təsadüfi baytlar yaratmaq üçün bir xidməti var. Ancaq burada iki problem var. Random.org həqiqi bir təsadüfi ədədi istehsalçısı olduğunu iddia edir, amma buna etibar edə bilərsinizmi? Əslində təsadüfi olduğuna əmin ola bilərsinizmi? Əmlak sahibinin bütün nəsil nəticələrini, xüsusən də xüsusi açarlara bənzəyən nəticələri qeyd etmədiyinə əmin ola bilərsinizmi? Cavab sizə aiddir. Oh, və onu yerli olaraq idarə edə bilməzsən, bu da əlavə bir problemdir. Bu metod 100% təhlükəsiz deyil.

İndi bitaddress.org tamamilə fərqli bir hekayədir. Açıq mənbəyidir, beləliklə başlığının altında nə olduğunu görə bilərsiniz. Müştəri tərəfidir, beləliklə onu yükləyə və internet bağlantısı olmadan da yerli olaraq idarə edə bilərsiniz.

Bu necə işləyir? Sizi - bəli, səni - entropiya mənbəyi kimi istifadə edir. Siçanı hərəkətə gətirməyiniz və ya təsadüfi düymələrə basmanız istənir. Nəticələri çoxaltmaq mümkün olmayacaq qədər bunu edirlər.

Siçanı təsadüfi hərəkət etdirərək entropiya yaratmaq prosesi. Simvolların böyük bloku hovuzu göstərir.

Bitaddress.org saytının necə işləməsi ilə maraqlanırsınız? Təhsil məqsədləri üçün kodu nəzərdən keçirəcəyik və Python-da çoxaltmağa çalışacağıq.

Qisa qeyd: bitaddress.org sayəsində yuxarıda təsvir olunan WIF formatına uyğun gələn, sıxılmış bir WIF formatında xüsusi açarı əldə edirsiniz. Məqsədlərimiz üçün alqoritm onaltılıq bir simli qaytaracaq ki, daha sonra ümumi açarların yaradılması üçün istifadə edə bilək.

Bit ünvanı: xüsusi xüsusiyyətlər

Bit ünvanı iki formada entropiya yaradır: siçanı hərəkət etdirərək və bir düyməni basmaqla. Hər ikisi haqqında danışacağıq, ancaq siçan izləməsini Python kitabxanasında tətbiq etmək çətin olduğu üçün əsas düymələrə diqqət yetirəcəyik. Son istifadəçinin kifayət qədər entropiya oluncaya qədər düymələr yazmasını və sonra bir açar yaratmasını gözləyirik.

Bitaddress üç şey edir. Bir bayt massivini işə salır və kompüterinizdən mümkün qədər çox entropiya almağa çalışır. Dizini istifadəçi girişi ilə doldurur və sonra xüsusi bir açar yaradır.

Bit ünvanı entropiyanı saxlamaq üçün 256 baytlıq massivdən istifadə edir. Bu sıra dövrlərdə yenidən yazılır. İlk dəfə sıra doldurulduqda, göstərici sıfıra keçir və doldurma prosesi başlayır.

Proqram, window.crypto-dan 256 baytlıq bir sıra başlatır. Daha sonra 4 bayt entropiya əldə etmək üçün vaxt möhürü yazılır. Nəhayət, ekranın ölçüsü, saat qurşağınız, brauzer plaginləri, yeriniz və daha çox məlumat kimi məlumatları götürür. Hələ 6 bayt var.

Başlanğıcdan sonra proqram başlanğıc baytları yenidən yazmaq üçün davamlı olaraq istifadəçi girişini gözləyir. İstifadəçi imleci hərəkətə gətirəndə proqram imlecin yerini yazır. İstifadəçi düymələrə basdıqda, proqram basılmış düymənin simvol kodunu yazır.

Nəhayət, bit ünvanı xüsusi bir açar yaratmaq üçün yığılmış entropiyadan istifadə edir. 32 bayt yaradılmalıdır. Bu tapşırıq üçün bit ünvanı ARC4 adlı RNG alqoritmindən istifadə edir. Proqram ARC4-i indiki vaxtla işə salır və entropiyanı toplayır. Sonra baytlar ardıcıl olaraq 32 dəfə çağırılır.

Bütün bunlar proqramın işinin sadələşdirilməsidir, amma ümid edirəm fikri əldə edəcəksiniz. Alqoritmi Github-da geniş şəkildə test edə bilərsiniz.

Özün et

Məqsədlərimiz üçün bit ünvanının daha sadə bir versiyasını yaradacağıq. Birincisi, istifadəçinin kompüteri və yeri haqqında heç bir məlumat toplamırıq. İkincisi, entropi yalnız mətn vasitəsilə daxil edirik, çünki python skriptindən istifadə edərək siçan mövqeyini davamlı əldə etmək olduqca çətindir (istəsəniz PyAutoGUI-yə icazə verin).

Bu, bizi generator kitabxanamızın rəsmi spesifikasiyasına gətirir. Əvvəlcə bir bayt massivi kriptoqrafik RNG, sonra zaman damgası və nəhayət istifadəçi tərəfindən yaradılan sətir ilə başlanğıc edilir. Toxum hovuzu doldurulduqdan sonra kitabxana geliştiriciyə bir açar yaratmağa imkan verir. Əslində, istədikləri qədər özəl açar yarada bilirlər, hamısı toplanmış entropiya ilə təmin olunur.

Hovuzun istifadəyə verilməsi

Burada kriptoqrafik RNG-dən bir bayt və bir zaman damgası qoyduq. __seed_int və __seed_byte hovuz massivimizə entropiya daxil edən iki köməkçi metoddur. Sirlərdən istifadə etdiyimizə diqqət yetirin.

def __init_pool (self): aralığımdakı i üçün (self.POOL_SIZE): random_byte = secret.randbits (8) self .__ seed_byte (random_byte) time_int = int (time.time ()) self .__ seed_int (time_int)
def __ toxum_int (öz, n): öz .__ toxum_bayt (n) öz .__ toxum_bayt (n >> 8) öz .__ toxum_bayt (n >> 16) öz .__ toxum_bayt (n >> 24)
def __seed_byte (self, n): self.pool [self.pool_pointer] ^ = n & 255 self.pool_pointer + = 1 if self.pool_pointer> = self.POOL_SIZE: self.pool_pointer = 0

Giriş ilə əkin

Burada əvvəlcə bir zaman damgası və sonra giriş simli hər bir simvol təyin etdik.

def seed_input (self, str_input): time_int = int (time.time ()) self .__ seed_int (time_int) char for str_input: char_code = ord (char) self .__ seed_byte (char_code)

Şəxsi açarın yaradılması

Bu hissə çətin görünə bilər, amma əslində çox asandır.

Əvvəlcə hovuzumuzla 32 baytlıq bir nömrə yaratmalıyıq. Təəssüf ki, öz təsadüfi obyektimizi yarada bilmirik və onu yalnız əsas nəsil üçün istifadə edirik. Bunun əvəzinə bir skriptdə işləyən hər hansı bir kod tərəfindən istifadə olunan paylaşılan bir obyekt var.

Bunun bizim üçün mənası nədir? Bu o deməkdir ki, istənilən vaxt, kodun hər hansı bir yerində, sadə bir random.seed (0) topladığımız entropiyaların hamısını məhv edə bilər. Biz bunu istəmirik. Xoşbəxtlikdən, Python getstate və setstate metodlarını təklif edir. Hər dəfə bir açar yaratdıqda entropiyamıza qənaət etmək üçün durdurduğumuz vəziyyəti xatırlayırıq və növbəti dəfə açar yaratmaq istədikdə təyin edirik.

İkincisi, yalnız açarımızın aralığında olduğundan əmin oluruq (1, CURVE_ORDER). Bu, bütün xüsusi ECDSA açarları üçün bir tələbdir. CURVE_ORDER, FFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 olan secp256k1 əyrisinin sırasıdır.

Nəhayət, sadəlik naminə onaltılığa çevirəcəyik və "0x" hissəsini çıxaracağıq.

def generate_key (self): big_int = self .__ generate_big_int () big_int = big_int% (self.CURVE_ORDER - 1) # key 0 düymə = hex (big_int) [2:] Enter key
def __generate_big_int (self): self.prng_state Yoxdursa: seed = int.from_bytes (self.pool, byteorder = 'big', imzalı = False) random.seed (seed) self.prng_state = random.getstate () random. setstate (self.prng_state) big_int = random.getrandbits (self.KEY_BYTES * 8) self.prng_state = random.getstate () qayıt big_int

Fəaliyyətdə

Kitabxanadan istifadə etməyə çalışaq. Əslində çox sadədir: üç xətt kodda xüsusi bir açar yarada bilərsiniz!

kg = KeyGenerator () kg.seed_input ('Həqiqətən təsadüfi bir sətir. Bir zar yuvarladım və 4 aldım.') kg.generate_key () # 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

Özünüz görə bilərsiniz. Əsas təsadüfi və tamamilə etibarlıdır. Ayrıca, bu kodu hər dəfə işə saldıqda fərqli nəticələr əldə edəcəksiniz.

Nəticə

Gördüyünüz kimi, özəl açarları yaratmağın bir çox yolu var. Sadəlik və təhlükəsizlik baxımından fərqlənirlər.

Şəxsi açarın yaradılması yalnız ilk addımdır. Növbəti addım, ödənişləri qəbul etmək üçün istifadə edə biləcəyiniz ümumi açar və cüzdan adresini çıxarmaqdır. Bir cüzdan yaratmaq Bitcoin və Ethereum üçün fərqlidir və eyni mövzuda daha iki məqalə etməyi planlaşdırıram.

Kodla oynamaq istəyirsinizsə, onu bu Github deposunda yerləşdirmişəm.

Medium'da burada kriptovalyutalar mövzusunda bir kurs edirəm. İlk hissə, blok zəncirinin ətraflı bir təsviridir.

Twitter-də kripto ilə bağlı təsadüfi düşüncələr göndərirəm, buna görə mütləq onu yoxlayın.