AtasoyWeb
 
AtasoyWeb - Hüseyin Atasoy
Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuvardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

Bitcoin Anahtarları Kırılabilir Mi?

256 bit uzunluğunda olan bitcoin gizli anahtarlarını deneme yanılma metoduyla kırmak milyarlarca yıl sürebilir. Ama ...

İnsanlar bilgisayarlarına, mail adreslerine bazen öyle şifreler koyuyorlar ki tahmin etmesi fazla zaman almıyor. Neyse ki sanal paralar için bu kadar basit şifreler kullanılamıyor. Kullanılamıyor mu? Emin miyiz?

Normal şartlarda, bir bitcoin cüzdan adresinin gizli anahtarı (private key), kriptografik olarak güvenli bir biçimde, hiçbir bitin bir diğerinin rastgele gelme ihtimalini etkilemeyeceği şekilde 256 bitlik olarak üretilmesi gerekir. Böylece 2^256 farklı anahtar üretilebilir. 2^256, 78 basamaklı çok çok büyük bir sayı. (Hesaplamak için Abaküs'ü kullanabilirsiniz. Bir gün bir işe yarayacağını biliyordum :D.) İçinde bitcoin olduğunu bildiğiniz bir adresin gizli anahtarını, olası tüm anahtarları tek tek deneyerek bulmak gibi bir fikre kapılırsanız, mevcut bilgisayar teknolojisiyle milyarlarca yıl zamana ihtiyacınız olduğunu bilmeniz gerekir. Durum teorik olarak öyle. Peki ya o basit şifreleri kullanan insanlar da bir gün bitcoin kullanmayı denemişse...

Gerçekten kötü bir amacım yok, sadece merak ettim; basit şifrelerle gizli anahtarlar üretip bu anahtarlarla bitcoin cüzdan adresi açılıp açılmadığını görmek istedim. Acaba basit şifreler kullanılarak bitcoin transferi yapılmış mıdır?

Eğer kimsenin böyle bir hataya düşmeyeceğini düşünüyorsanız bundan beteri de var. Yazının sonunda yöntemleri kodlarken farkettiğim, şimdiki maliyeti 650bin dolar olan bir yazılım hatasından da bahsedeceğim...

Önce bitcoinde anahtarlar ve adresler arasındaki illişkiyi anlamaya çalışalım. Sonra basit bir şifreden gizli anahtar ve adres üretip cüzdandaki hareketlere bir bakalım. Böylece başta kafama takılan ve muhtemelen şu an artık sizin de kafanıza takılan soruya bir yanıt bulalım...

Bitcoin Açık Anahtar ve Adres Üretimi

Bitcoinde açık anahtarlar, 256 bitlik gizli anahtarlar üzerinden Eliptik Eğri Dijital İmza Algoritması (ECDSA; Elliptic Curve Digital Signature Algorithm) ile hesaplanır. İşlemin kabaca özeti şu;

{Açık Anahtar} = {Gizli Anahtar} x {Eliptik Eğri Üzerinde Bir Nokta}

Ancak buradaki çarpma işlemi, bir skalerle bir noktanın klasik çarpımı değil. Bu işlem 78 basamaklı olabilecek kadar büyük tamsayılar üzerinde yapılan biraz daha karmaşık bir eliptik eğri nokta çarpım işlemi.

Eliptik Eğri Nokta Çarpımı

Denklemi y^2 = x^3 + ax + b olan bir eliptik eğri üzerinde tanımlanan iki noktadan geçen doğru, eğriyi üçüncü bir noktada keser. Bu iki noktanın toplamı, üçüncü noktanın x eksenine göre simetriğidir. Her iki nokta çakışık seçildiğinde, yani nokta kendisiyle toplandığında, eğrinin nokta üstündeki teğeti, eğriyi ikinci bir yerde daha keser. Noktanın kendisiyle toplamı, teğetin yine eğriyi kestiği ikinci noktanın x eksenine göre simetriğidir. Alanın sonlu olmasının sağlanması için yapılan tüm işlemlerin sonuçları, mod alınarak bir asal sayı ile sınırlandırılır. Çarpım, ikiye katlama işlemeleri ve bu işlemlerin sonuçlarınını birbirlerine eklenmesi şeklinde yapılır.

Gizli anahtarımız k=6 ve başlangıç noktamız G (Generator) olsun. Sonraki tüm işlemlerimiz için asal sayımız p (prime) olsun. Açık anahtarımıza da A dersek A=6G (mod p) şöyle hesaplanır:

6  =   1        1         0
         4G       2G        1G
6G = ( 1*4G  +  1*2G  +   0*1G ) (mod p)

Böylece çarpan ne kadar büyük olursa olsun, bit sayısının 1 eksiği kadar katlama ve 1 olan bitlerin sayısının 1 eksiği kadar ekleme işlemi yeterli olur. Ayrıca her ikiye katlama ve ekleme işleminin sonucu p ile sınırlı olacağı için sayı, hiçbir işlemden sonra p sayısından büyük olmaz.

Burada bitler ele alınırken sondan mı, baştan mı başlanacağına göre sonuç değişir. Bitcoinde gizli anahtarın değerini en çok etkileyen basamağın sonda olduğu varsayılır (başka bir değişle; anahtarın bit düzeyinde big endian olduğu varsayılır). Onluk tabanda little endian'a alışık olduğumuz için örneği de little endian olarak verdim.

Demek ki yapmamız gereken ve aslında yukarıda özetlediğim iki tip işlem var; katlama ve ekleme. Katlama, nokta kendisiyle toplandığında, toplamdan geçen teğetin eğriyi kestiği ikinci noktanın x eksenine göre simetriğini bulma işlemidir. Ekleme ise, artımlı olarak katlanan değerlerin üst üste eklenme işlemi; yani toplam noktasından ve yeni eklenecek katlanmış noktadan geçen doğrunun eğriyi kestiği üçüncü noktanın simetriğini bulma işlemidir.

Katlama

Katlanacak noktamız P1 = (P1x, P1y) olsun. Bu noktadan ve noktayı kendisiyle topladığımızda simetriğini elde edeceğimiz eğri üstündeki ikinci noktadan geçen doğrunun eğimini bulalım:

m = (3 * P1x^2 + a) / (2 * P1y)     (mod p)
  = (3 * P1x^2 + a) * (2 * P1y)^-1  (mod p)

Buradaki "^-1" sayının modüler çarpımdaki tersini ifade etmekte. Bir sayının modüler tersi, sonlu alanda kendisi ile çarpıldığında 1'e denk olan sayıdır. Bir sayıyı mod p'de bir n sayısına bölmek yerine n'nin modüler tersi ile çarpabiliriz; aynı sonucu verir. Örneğin; 6/3 ≡ 6*3^-1 ≡ 6*4 ≡ 2 (mod 11) Çok büyük sayılarda modüler terslerin bulunması için genelde Genişletilmiş Öklid Algoritması kullanılır. Bu hesaplamaları yapmak için GNU MP gibi bir kütüphane kullanabilirsiniz.

Şimdi eğimi ve noktayı biliyoruz. Eğri üstündeki diğer noktanın x'e göre simetriği olan P2 = (P2x, P2y) noktasının koordinatlarını bulalım:

P2x = m^2 - 2 * P1x          (mod p)
P2y = m - (P1x - P2x) - P1y  (mod p)

Böylece her adımda P'yi 2P, 2P'yi 4P, 4P'yi 8P ... olacak şekilde ikiye katlayarak devam ediyoruz.

Ekleme

Her adımda katlanarak yer değiştiren nokta (buna P1 diyelim) sıradaki bitin 1 olduğu durumlarda, bütün toplamı tutan ve başlangıç değeri 0 olan noktaya (buna da P2 diyelim) eklenir. Eklemeden kastımız P1 ve P2 den geçen doğrunun eğriyi kestiği 3. noktanın simetriğini hesaplamak. P1 ve P2'den geçen doğrunun eğimini bulalım:

m = (P1y - P2y) / (P1x - p2x)     (mod p)
  = (P1y - P2y) * (P1x - p2x)^-1  (mod p)

Şimdi eğimi ve P1'i kullanarak eğri üstünde ulaşmaya çalıştığımız P3 = (P3x, P3y) noktasını bulalım (doğrunun eğriyi kestiği noktanın x'e göre simetriği):

P3x = m^2 - P1x - P2x        (mod p)
P3y = m * (P1x - P3x) - P1y  (mod p)

Ekleme işlemi yalnızca sıradaki bit 1 iken yapılır. Diğer durumlarda çarpan 0 olduğu için bu adım atlanır.

Katlama ve ekleme işlemleri tamamlandığında gizli anahtarımız, G noktası ile çarpılmış olur. Elde edilen koordinatlar açık anahtarın kendisidir.

Secp256k1

Bitcoin, eliptik eğri için secp256k1 standartlarını kullanır. secp256k1 bir parametre setidir. Buna göre eliptik eğri dijital imzalama algoriması için, anahtar üretiminde kullanılan parametreler şöyledir:

a  = 0
b  = 7
p  = 115792089237316195423570985008687907853269984665640564039457584007908834671663
Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240
Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424

Burada a ve b değerleri eğrinin denklemindeki (y^2 = x^3 + ax + b) a ve b sabitleridir. p, mod ile sonuçları limitleyen asal sayı ve Gx ile Gy, eğri üstünde başlangıç noktası olan G'nin koordinatlarıdır.

Deneyelim!

İşin zor kısmını atlattık, şimdi ufak bir deneme yapalım. Bu işin otomatikleştirilmesi sakıncalı olabilir, bu yüzden kaynak kod paylaşmayacağım. Bitcoin bu kadar değerli iken kimse büyük miktarda bir yatırım için saçma bir şifre kullanmaz ama yine de temkinli olmak lazım.

Bir cüzdan oluşturulurken, 256 bitlik rastgele bir anahtar üretmekle başlanır. Bu anahtar üretilirken standart bir rastgelelik fonksiyonu kullanmak bile sakıncalı. Çünkü çoğu dildeki implementasyonlarda rastgele sayı üreteçleri, genelde saatin değerine göre sayı üretir. Bu da, sayıların ilişkili olmasına sebep olabilir. Basit bir şifre seçelim; 123456 olsun. Bu şifre ile 256 bitlik anahtar oluşturmanın en kolay yolu, sha256 algoritmasını kullanmak. Diyelim ki bir kulanıcı böyle bir hataya düştü veya kötü kurgulanmış bir yazılım kullandı:

gizliAnahtar = sha256('123456')
             = 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

Açık Anahtarı Hesaplayalım

Açık anahtarı gizli anahtar üzerinden hesaplıyoruz. Öncelikle 16lık tabanda olan gizli anahtarı 10luk tabana alalım:

64042235640975155117310274771932083755136637533499687061408327255432019864722

Şimdi gizli anahtarı (buna GA diyelim) kullanarak açık anahtarı (bu da AA = (AAx, AAy) olsun) üretelim. Bunun için yukarıda özetlemeye çalıştığım çarpımı uygulamamız gerekiyor. Tekrar hatırlatayım; bu klasik bir çarpma işlemi değil bir eliptik eğri nokta çarpımı (EENÇ):

(AAx, AAy) = EENÇ(a, b, p, Gx, Gy, GA)

Anahtarımız 256 bitlik ve bu anahtarda 1 olan bitlerin sayısı 126. Yani ilk biti saymazsak bu EENÇ işlemi 255 tane katlama ve 125 tane ekleme işleminden oluşuyor. Bu yüzden alt adımların sonuçlarını tek tek yazmayacağım. Tüm katlama ve ekleme işlemleri tamamlandığında (hatırlatma: gizli anahtarımızı bit düzeyinde big endian olarak varsayacağız) noktanın eğri üzerinde geleceği son konumun koordinatları şöyle olacak:

AAx = 22368910898360947064803294456614748315408576799694302035021804342793521014332
AAy = 28613786043275606858979224886594631115925882767521697023533596439454563980280

Koordinatları 16lık tabana çevirip 64 karakterden kısa olmaları halinde soldan sıfırlarla dolduralım. (Örneğimizde sayılar zaten 64 karakterlik):

AAx = 31745adae24044ff09c3541537160abb8d5d720275bbaeed0b3d035b1e8b263c
AAy = 3f42d437dc9988eaa686fdd5325eba20f4b73f3062942626060537e1dfe453f8

Anahtarın sıkıştırılmamış olduğuna işaret etmek için başına 04 sabitini ekleyip koordinatları birleştirelim:

0431745adae24044ff09c3541537160abb8d5d720275bbaeed0b3d035b1e8b263c3f42d437dc9988eaa686fdd5325eba20f4b73f3062942626060537e1dfe453f8

İşe bu bizim açık anahtarımız.

Bitcoin Cüzdan Adresini Hesaplayalım

Öncelikle açık anahtarın ikili seviyede sha256 hash'ini çıkaralım:

2b07d6109ed3902111a083c92849dfee266f0f6e1baeb5cb69e6062f376250ab

Elde ettiğimiz değerin ikili seviyede ripemd160 hash'ini çıkaralım ve başına, adres öneki olan 00'ı ekleyelim:

002cd69f9f5fce5c57bd0ab4bfaf2b5b6da147fa53

Şimdi sağlama toplamını (checksum) hesaplayacağız. İkili düzeyde iki defa üst üste sha256'sını çıkaralım. Elde edeceğimiz değerin ilk 8 karakteri bizim doğrulama toplamımız:

d523c7042f5b5ca63845fa6c0a7f752ef6e735a2c236fd892e9fd22242dc3fe7

İlk 8 karakteri, adresimizin sonuna ekleyelim:

002cd69f9f5fce5c57bd0ab4bfaf2b5b6da147fa53d523c704

Son olarak şu an 16lık tabanda olan bu değeri 58lik tabana alalım:

1565qkBbLcuFP78f7MFKkK8jtHGDwdSgvX

İşte bu değer bizim bitcoin alıp gönderebileceğimiz adres değerimiz.

Bakiye ve Hareket Kontrolü

Şimdi yazının başında sorduğum sorunun cevabını görme vaktimiz geldi. Bitcoinde hesaplar ve hareketler gizli değil. Hesap ve hareketlere dünyanın her yerinden erişebilirsiniz. Ancak hangi hesabın kime ait olduğunu bilmeniz mümkün değil.

123456 şifresi ile elde edildiği için gizli anahtarı, açık anahtarı, adresi, yani tüm kontrolü tamamen elimizde olan bu cüzdanla daha önce işlem yapılıp yapılmadığını kontrol edelim. İnternette, arama motoruna "blockchain explorer" yazıp ilk sitelerden birine tıklayabilirsiniz. Cüzdan adresini sorguladığımızda şimdiye kadar toplam 0.00177480 btclik 8 hareket yapıldığını görüyoruz. Yazıyı yazıyor olduğum zamanda, karşılığı 100 lira civarı bir para. Tabi ki şu an cüzdan boş. Basit şifrelerle çok yüksek hacimli hareketlerin olduğu boş hesaplara rastlayabilisiniz...

Şu anki teknolojiyle bir bitcoin adresinin anahtarının kırılması mümkün olmayabilir ama demek ki eğer zayıf şifreler kullanılırsa (mevcut istemciler de buna izin verirse) şifreleme algoritmasının gücünün bir önemi kalmıyor...

650000 Dolarlık Yazılım Hatası

Son olarak bundan da bahsedeyim. Kodları yazarken denemelerin birinde açık anahtarı yanlışlıkla silip adresi o şekilde üretmiştim. Herhangi bir hata ayıklama yapmazsanız boş bir açık anahtarla elde edeceğiniz adres şu:

1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E

Herhangi bir gizli anahtardan üretilmesi mümkün olmadığı için kontrol altına alınması da mümkün görünmeyen, açık anahtarı sıfır uzunluklu bu adreste şimdiki değeri 650 bin dolar olan 72 btc var. Üstelik bu "çıkmaz sokağa" hala para geliyor. Muhtemelen yanlış kodlanmış istemciler kullananların yanlışlıkla atıp bir daha asla döndüremeyeceği 72 adet bitcoin! Pahalıya mal olmuş basit bir hata...

Kaynaklar

Posted: 21 Mayıs 2020 Perşembe, 20:38
Keywords: bitcoin şifresi, private key, bitcoin keys, public key

Leave Comment

 
You are replying to comment #-1. Click here if you want to cancel replying.

 

Comments

No approved comment.
 
Şu an bu sayfada 1, blog genelinde 9 çevrimiçi ziyaretçi bulunuyor. Ziyaretçiler bugün toplam 1482 sayfa görüntüledi.
 
Sayfa 44 sorgu ile 0.027 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2020 Hüseyin Atasoy