İ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...
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.
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.
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.
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.
Bitcoin, eliptik eğri için secp256k1 standartlarını kullanır. secp256k1 bir parametre setidir. Buna göre eliptik eğri dijital imzalama algoritması 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.
İş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ı 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
İşte bu bizim açık anahtarımız.
Ö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.
Ş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...
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...
Hocam Merhaba,
Öncelikle sitenizde paylaştığınız çok ilginç konulara rastgelmemi büyük bir nimet olarak kabıl ediyorum ve sizi kutluyorum.
Özellikle
"BTC flashing" ve bir gönderinin "flash" olup olmadığını tespit etmenin bir yolu var mı? Biliyorsunuzdur; Şu anda harcanabilir ve 90-120 gün görünür BTC ler pazarlanıyor.
Bu konuda daha çok yazmalısınız.
Selam ve Dua ile,
Merhaba, bitcoin transfer işlemi geri döndürülebilir bir işlem değil. Kriptopara alım satım işlemlerini yalnızca bilindik büyük borsalarda yapmak, bu tür aldatmacalara düşülmemesi için çok önemli.
Merhaba işlem anahtarının başı ve sonu gözüküyor ortası gizli nasıl şifreyi bulabilirim
İşlem anahtarı derken metinsel bir parola kastediyorsanız parolanın nerede, nasıl kullanıldığına ve uzunluğuna bağlı olarak çözülmesi mümkün olabilir.
İşlem anahtarından kastınız gizli anahtar ise, ne kadarının gizli olduğuna bağlı. 64 karakterli, 256lık tabanındaki gizli anahtarı kastettiğinizi varsayarak yazıyorum; her bir karakter 16 farklı değer alabilir. Yani gizli karakterlerin sayısına n dersek, 16^n kadar denemede anahtarı bulabilirsiniz. Ki bu da, anahtarın çok büyük bir kısmı açık değilse, bulunmasının neredeyse imkansız olduğu anlamına geliyor.
merhaba elimde 50 adet btc cüzdanı var şifresini bilmiyorum kırabilirseniz %10 pay verebilirim ?
Şifresinin en azından bir kısmını bile bilmiyorsanız veya şifrenin neye benzediğini, kaç karakter, rakam veya noktalama işaret içerdiğini hiçbir şekilde hatırlamıyorsanız çözmek tamamen şansa kalır. Çok zor.
Kripto cüzdanının guvenlik anahtarını unuttum kurabilirsin yarısını veririm
Bir üstteki yoruma yazdığım gibi, şifreyle ilgili en azından bir fikrinizin olması lazım. Yoksa çok zor.