Bitcoin Forum
April 15, 2024, 06:09:29 AM *
News: Latest Bitcoin Core release: 26.0 [Torrent]
 
  Home Help Search Login Register More  
  Show Posts
Pages: [1] 2 »
1  Alternate cryptocurrencies / Announcements (Altcoins) / Re: [WDC] Worldcoin | 0.17.1 Released! | AuxPoW w/ LWMA diff algorithm. Resync Req. on: September 17, 2023, 03:51:36 AM
If a well-designed website, a setup application for the wallet, a mobile wallet, and another WDC explorer like wdcexplorer.com are prepared for this project, I believe the project has the potential to reach great heights. I can assist with all of these. If you are interested, please send a DM, and we can start creating the test applications right away. @WorldCoin
2  Bitcoin / Development & Technical Discussion / Re: Pollard's kangaroo ECDLP solver on: November 09, 2021, 12:23:49 AM
I've shared the basic pseudo code for RSA Bruteforce below. Can you please write a basic pseudo-code for this method?

Code:
GenerateRSAKeys()
   p => random big prime, below 64bits
   q => random big prime, below 64bits
   e => random small prime, below 16bits
   k => random small integer, below 16 bits
   N = p * q
   d = (k * ((p - 1) * (q - 1)) + 1) / e

   (e, N) => Public key
   (e, d, p, q) => Private key

RSAEncode(m, e, N) // m => message, e and N are public key
   h ≡ m ^ e mod N

RSADecode(h, d, N) // h => encrypted message, d is part of private key
   m ≡ h ^ d mod N

RSACrack_GetPrivateKeyFromPublicKey(e, N, minPrimeBitsLength)
   bitLength = GetBitsLength(N)
   k = 2
   // iterator uses sieve algorithm
   primes = all64BitsPrimes.Select(p => GetBitsLength(p) >= minPrimeBitsLength && GetBitsLength(p) <= (bitLength - minPrimeBitsLength))
   // Example Primes buffer uses 4GB memory, all below 64Bits primes use 1TB memory
   // use only odd numbers bit array
   // max 256 cycles
   index = -1
   for primesBuffer1 of primes
     index++
     for primesBuffer2 of primes.NextTo(index) // next buffers from index, including index. buffer. if you use ModMul, remove this line
       for p of primesBuffer1
         for q of primesBuffer2 // if you use ModMul, remove this line
           bitLengthA = GetBitsLength(p)
           bitLengthB = GetBitsLength(q)
           bitSum = bitLengthA + bitLengthB
           if (max(bitLengthA, bitLengthB) >= bitLength && bitSum <= bitLength)
             if (p * q == N) // or (N % p == 0) or ModMul(N+1, 10, p) == 10
               d = (k * ((p - 1) * (q - 1)) + 1) / e
               return (e, d, p, q)



For RSA this code results much faster.

I expect you to write basic pseudocode for Kangaroo. Thanks.

Code:
RSAHacking_GetPrivateKeyFromPublicKeyUsingModPowNoPrimeTable(e, N)
   k = 2
   SqrtN = Sqrt(N)
   if((SqrtN & 1) == 0) SqrtN++
   for(p = SqrtN; p > 2; p-=2)
     if (true/*You can use more filters for p*/ && ModPow(2, p-1, p) == 1 && ModMul(N+1, 10, p) == 10)
       q = N / p
       d = (k * ((p - 1) * (q - 1)) + 1) / e
       return (e, d, p, q)

[moderator's note: consecutive posts merged]
3  Bitcoin / Development & Technical Discussion / Re: Pollard's kangaroo ECDLP solver on: November 05, 2021, 03:33:27 PM
Hello, thank you to everyone who contributed to this project.
I want to try something and I need ModPow function for Int type.

All Mod functions use P.

Can a faster version be made for b=2?

I want to calculate 2 ^ e % m

For int type like this:

Code:
int ModPow(int b, int e, int m)
{
int result = 1;
if (1 & e)
result = b;
while (1) {
if (!e) break;
e >>= 1;
b = (b * b) % m;//ModMul
if (e & 1)
result = (result * b) % m;//ModMul
}
return result;
}
4  Local / Proje Geliştirme / Re: Bitcoin; Algoritma Üzerine Yöntemler on: January 10, 2021, 09:26:47 PM
Hayır! 1 ve 2 ^ 256 - 1 aralığında integer bir sayıya karşılık gelen private keyiniz için public address üretmek bir işlemken private key wif adresi de üretmek ayrı bir işlemdir. Private key zaten bu sayıdır. Siz her seferinde wif adresini üreterek çok zaman kaybediyorsunuz. Dolayısyla bakiyeli mevcut adres listesine sahipseniz private wif adres üreterek vakit kaybetmek istemezsiniz. Zira bir çakışma olmadan zaten ihtiyacınız da olmaz ancak bir çakışma bulursanız private key'e o zaman ihtiyacınız olabilir. Tabi bu yöntemle çalışmak için sıralı olarak oluşturduğunuz her 256 bit sayınıza denk gelen public adresi ürettikten sonra BinarySearch ile gerçek zamanlı olarak bakiyeli adres listesinde arama gerçekleştirmelisiniz. Binary Search çok hızlıdır. Binary Search ile kaç döngüde aramayı tamamlayacağından emin olmak için elinizdeki listenin adres sayısının 2 nin hangi kuvvetinden küçük olduğunu bulmalısınız.

Örneğin 35 milyon bakiyeli adres varsa arama döngüsü 26 kez çalışır, bulur ya da bulamaz. Binary Search kullanmadan bahsettiğim hızlara asla ulaşamazsınız.

Hele SQL Bulk vb. yöntemler de olsa disk ile muhattap oluyorsanız işiniz çok zor. Bu tüm işlemleri ölümüne yavaşlatır.
5  Local / Proje Geliştirme / Re: Bitcoin; Algoritma Üzerine Yöntemler on: January 10, 2021, 07:22:31 PM
Türklerin zeka problemi olduğu için illa private key i bir listede istiyor. Halbuki private key lere sadece bir çakışma bulursan ihtiyacın olur. Diğer durumlarda hangi aralığı taradığın bilgisini saklaman yeterli olur. 2 ^ 32 bitlik bir çözünürlük ile kaldığın yeri saklaman yeterli olur. Private key i yalnızca bir çakışma bulduğunda üretirsin. Fonksiyonunun pub keyi üretme hızı daha düşüktür. Her defasında private key i de ürettiğin için hızın çok düşüyor. Ben i7 makinemde 1-3M Key hız alıyorum kendi yöntemimle...
6  Local / Proje Geliştirme / Re: Bitcoin; Algoritma Üzerine Yöntemler on: January 09, 2021, 09:22:28 PM
@Kuz3y Arkadaşım bu liste zaten blockchain'deki bakiyeli adres listesi... Zaten tümünün bakiyesi var. Private key leri elinde olmadığı sürece işine yaramaz.

Ayrıca diskten veri okumak RAM den okumaya göre çok çok yavaş kalır. Tüm adres listesini sıralayıp bir arrayda tutup BinarySearch ile inanılmaz bir hız elde edersin.
7  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 23, 2020, 08:44:43 AM
Ya da şöyle yapalım. Ben benim verdiğim kodlara göre C# ile kodu yazayım fakat oradaki p, a, b sayıları secp256k1 Curve fonksiyonunda hangi sabitleri kullanıyor. Bunu secp256k1 için nasıl modifiye etmek gerekiyor?

Sanırım benim için en önemli kısım burası... Senin kodunu C# ile düzenleyip hazırladım. Burada secp256k1 için hangi sabitleri vermem gerekiyordu ya da curve G H ve N olarak ifade edilen curve sabitleri neler? Bunlar sabit mi yoksa nasıl belirleniyor?

Ayrıca Gx ve Gy ve x arasında bir bağıntı var mı yoksa random mu seçiliyor? Gx ve Gy için birbirlerine yakın aralarında asal iki sayı seçmek gerekiyorsa bu benim için sorun olmaz. Fermat'ın Little teoremiyle kolaylıkla çok büyük sayılar için seçebilirim. ModPow kullanarak fakat x ile aralarında bir bağıntı varsa onu öğrenmek isterim.



Code:
static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            BigInteger p = BigInteger.Parse("0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", NumberStyles.HexNumber);
            BigInteger a = BigInteger.Zero;
            BigInteger b = (BigInteger)7;


            var secp256k1 = new CurveFp(p, a, b);

            var G = new Point(secp256k1,
                BigInteger.Parse("55066263022277343669578718895168534326250603453777594175500187360389116729240"),
                BigInteger.Parse("32670510020758816978083085130507043184471273380659243275938904335757337482424"));

            var x = BigInteger.Parse("8723493475893459873498759834758934759837458973497593847598347598734985798982374987234");

            var PrivateKey = x;
            var GeneratorPoint = G;

            var PublicPoint = GeneratorPoint * PrivateKey;

            var xx = PublicPoint.X.ToString("X");

            var xy = PublicPoint.Y.ToString("X");

            var UncompressedPublicKey = "04" + xx + xy;

            var CompressedPublicKey = "";

            if (PublicPoint.Y % 2 == 0)
                CompressedPublicKey = "02" + xx;

            if (PublicPoint.Y % 2 == 1)
                CompressedPublicKey = "03" + xx;

            Console.WriteLine("Uncompressed Public Key: {0}", UncompressedPublicKey);
            Console.WriteLine("Compressed Public Key: {0}", CompressedPublicKey);

            Console.ReadLine();
        }
8  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 23, 2020, 07:44:59 AM
merhaba C# ta da olsa baska bir yerde de

Point1 + Point1  sonucu  "return PointNew"  için dönmesi EliptikEğriAritmetiğinde -> ECdobuble  kullanman gerekir

Point1 + Point2  sonucunu return etmen için EliptikEğriAritmetiğinde -> ECadd kullanman gerekir

Peki Point Nasıl olusacak ?

Onuda GeneratorPoint olarak Gx ve Gy ile üstteki python kodunda yazdım.

Sanırım gözünden kaçırmışsın yalnızca main fonksiyonda ilgili ECdouble işlevine de örnek gösterip hemen paylaşayım. secp256k1 farkını anlatabilir misin?

Code:
static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            // TODO: generate private key and public key

            // Örnek CurveFp ve Point nasıl kullanılır?

            var curve = new CurveFp(5, 2, 3);

            var point = new Point(curve, 19, 23);

            var point2 = new Point(curve, 17, 11);

            var sampleAdd = point + point2;

            var skaler = 31;

            var sampleMultiple = point * skaler;

            var doublePoint = point.Double();

            Console.WriteLine("Sample Add: {0}", sampleAdd);
            Console.WriteLine("Sample Multiple: {0}", sampleMultiple);
            Console.WriteLine("Sample Double: {0}", doublePoint);

            Console.ReadLine();
        }
9  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 23, 2020, 07:25:31 AM
Tekrar merhaba
anlattıklarım için python da örnek yazdım.

pythonda fastecdsa kütüphanesini kururyoruz

Merhaba!

Yazdıklarımı alıntının içerisine yazmışım. Neyse önemli değil. Python sanırım ne kadar hızlı bir kütüphane oluştursan da çok yavaş kalır. Bunun yerine C# önerebilirim. Sana çok hızlı uint256 kütüphanesi gösterebilirim. BigInteger yerine onu kullanırsın.

Paylaştığım kod hakkında ne düşünüyorsun? Orada public key ve private key nasıl üretilir farazi Base58Encode ve Base58Decode fonksiyonları olduğunu düşünüp örnek bir main fonksiyonu yazabilir misin?

private key de (2 ^ 256) - (2 ^ 32) olsun mesela... Gerçekten secp256k1 farkını anlamadım ve bilmiyorum. Sen biliyorsan lütfen bu kısmı anlat ki net şekilde anlamış olalım.

Code:
using System;
using System.Text;
using System.Numerics;

namespace TestEllipticCurve
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            // TODO: generate private key and public key

            // Örnek CurveFp ve Point nasıl kullanılır?

            var curve = new CurveFp(5, 2, 3);

            var point = new Point(curve, 19, 23);

            var point2 = new Point(curve, 17, 11);

            var sampleAdd = point + point2;

            var skaler = 31;

            var sampleMultiple = point * skaler;

            Console.WriteLine("Sample Add: {0}", sampleAdd);
            Console.WriteLine("Sample Multiple: {0}", sampleMultiple);

            Console.ReadLine();
        }

        class Point
        {
            public static readonly Point INFINITY = new Point(null, default(BigInteger), default(BigInteger));
            public CurveFp Curve { get; private set; }
            public BigInteger X { get; private set; }
            public BigInteger Y { get; private set; }

            public Point(CurveFp curve, BigInteger x, BigInteger y)
            {
                this.Curve = curve;
                this.X = x;
                this.Y = y;
            }
            public Point Double()
            {
                if (this == INFINITY)
                    return INFINITY;

                BigInteger p = this.Curve.p;
                BigInteger a = this.Curve.a;
                BigInteger l = ((3 * this.X * this.X + a) * InverseMod(2 * this.Y, p)) % p;
                BigInteger x3 = (l * l - 2 * this.X) % p;
                BigInteger y3 = (l * (this.X - x3) - this.Y) % p;
                return new Point(this.Curve, x3, y3);
            }
            public override string ToString()
            {
                if (this == INFINITY)
                    return "infinity";
                return string.Format("({0},{1})", this.X, this.Y);
            }
            public static Point operator +(Point left, Point right)
            {
                if (right == INFINITY)
                    return left;
                if (left == INFINITY)
                    return right;
                if (left.X == right.X)
                {
                    if ((left.Y + right.Y) % left.Curve.p == 0)
                        return INFINITY;
                    else
                        return left.Double();
                }

                var p = left.Curve.p;
                var l = ((right.Y - left.Y) * InverseMod(right.X - left.X, p)) % p;
                var x3 = (l * l - left.X - right.X) % p;
                var y3 = (l * (left.X - x3) - left.Y) % p;
                return new Point(left.Curve, x3, y3);
            }
            public static Point operator *(Point left, BigInteger right)
            {
                var e = right;
                if (e == 0 || left == INFINITY)
                    return INFINITY;
                var e3 = 3 * e;
                var negativeLeft = new Point(left.Curve, left.X, -left.Y);
                var i = LeftmostBit(e3) / 2;
                var result = left;
                while (i > 1)
                {
                    result = result.Double();
                    if ((e3 & i) != 0 && (e & i) == 0)
                        result += left;
                    if ((e3 & i) == 0 && (e & i) != 0)
                        result += negativeLeft;
                    i /= 2;
                }
                return result;
            }

            private static BigInteger LeftmostBit(BigInteger x)
            {
                BigInteger result = 1;
                while (result <= x)
                    result = 2 * result;
                return result / 2;
            }
            private static BigInteger InverseMod(BigInteger a, BigInteger m)
            {
                while (a < 0) a += m;
                if (a < 0 || m <= a)
                    a = a % m;
                BigInteger c = a;
                BigInteger d = m;

                BigInteger uc = 1;
                BigInteger vc = 0;
                BigInteger ud = 0;
                BigInteger vd = 1;

                while (c != 0)
                {
                    BigInteger r;
                    //q, c, d = divmod( d, c ) + ( c, );
                    var q = BigInteger.DivRem(d, c, out r);
                    d = c;
                    c = r;

                    //uc, vc, ud, vd = ud - q*uc, vd - q*vc, uc, vc;
                    var uct = uc;
                    var vct = vc;
                    var udt = ud;
                    var vdt = vd;
                    uc = udt - q * uct;
                    vc = vdt - q * vct;
                    ud = uct;
                    vd = vct;
                }
                if (ud > 0) return ud;
                else return ud + m;
            }
        }

        class CurveFp
        {
            public BigInteger p { get; private set; }
            public BigInteger a { get; private set; }
            public BigInteger b { get; private set; }
            public CurveFp(BigInteger p, BigInteger a, BigInteger b)
            {
                this.p = p;
                this.a = a;
                this.b = b;
            }
        }
    }
}
10  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 23, 2020, 07:03:08 AM
RSA için Şadi hocanın videosunu izlemeni öneririm. http://bilgisayarkavramlari.com/2008/03/19/rsa/

Yıllar oldu izledim. Hatta 24-32 bitlik RSA kriptosu için kodlar yazıp public key den private key üreten kodlar da yazıp konunun temel mantığının anlaşılması için yayınladım.

Aslında sormak istediğim çok  detay var. Büyük harflerin noktayı küçük harflerin genelde çarpan olan sayıları ifade ettiğini anladım fakat örneğin xx ifadesi x * x ile aynı anlamamı geliyor yoksa xx ayrı bir değişken mi?

Ayrıca en baştaki soruna dönecek olursak ECdouble, ECadd ve ECmultiply methodlarını sormuştun. Hemen yazayım fakat burada Curve fonksiyonun secp256k1 olması ne anlama geliyor? Buradaki kodlara bakarak aradaki farkı anlatabilir misin?

Sana hemen ECdouble, ECadd ve ECmultiply işlevleri için bir C# kodu yazayım.

Programın çıktısı şöyle ana programa bakarsan bir curve fonksiyonu nasıl tanımlanır? Sonra bir point ile diğer bir point nasıl toplanır ve bir point ile bir skaler nasıl çarpılır aynı matematikte olduğu gibi bir hal aldı ve senin işini çok kolaylaştıracak.

Şimdi bana secp256k1 farkını anlatabilir misin? TODO yazığım yere yalnızca Main fonksiyonunu kullanarak prviate ve public key üretip gönderebilir misin?

O kısım nasıl oluyor?

Programın çıktısı şöyle;

Code:
Hello World!
Sample Add: (0,-4)
Sample Multiple: (-1,3)

Code:
using System;
using System.Text;
using System.Numerics;

namespace TestEllipticCurve
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            // TODO: generate private key and public key

            // Örnek CurveFp ve Point nasıl kullanılır?

            var curve = new CurveFp(5, 2, 3);

            var point = new Point(curve, 19, 23);

            var point2 = new Point(curve, 17, 11);

            var sampleAdd = point + point2;

            var skaler = 31;

            var sampleMultiple = point * skaler;

            Console.WriteLine("Sample Add: {0}", sampleAdd);
            Console.WriteLine("Sample Multiple: {0}", sampleMultiple);

            Console.ReadLine();
        }

        class Point
        {
            public static readonly Point INFINITY = new Point(null, default(BigInteger), default(BigInteger));
            public CurveFp Curve { get; private set; }
            public BigInteger X { get; private set; }
            public BigInteger Y { get; private set; }

            public Point(CurveFp curve, BigInteger x, BigInteger y)
            {
                this.Curve = curve;
                this.X = x;
                this.Y = y;
            }
            public Point Double()
            {
                if (this == INFINITY)
                    return INFINITY;

                BigInteger p = this.Curve.p;
                BigInteger a = this.Curve.a;
                BigInteger l = ((3 * this.X * this.X + a) * InverseMod(2 * this.Y, p)) % p;
                BigInteger x3 = (l * l - 2 * this.X) % p;
                BigInteger y3 = (l * (this.X - x3) - this.Y) % p;
                return new Point(this.Curve, x3, y3);
            }
            public override string ToString()
            {
                if (this == INFINITY)
                    return "infinity";
                return string.Format("({0},{1})", this.X, this.Y);
            }
            public static Point operator +(Point left, Point right)
            {
                if (right == INFINITY)
                    return left;
                if (left == INFINITY)
                    return right;
                if (left.X == right.X)
                {
                    if ((left.Y + right.Y) % left.Curve.p == 0)
                        return INFINITY;
                    else
                        return left.Double();
                }

                var p = left.Curve.p;
                var l = ((right.Y - left.Y) * InverseMod(right.X - left.X, p)) % p;
                var x3 = (l * l - left.X - right.X) % p;
                var y3 = (l * (left.X - x3) - left.Y) % p;
                return new Point(left.Curve, x3, y3);
            }
            public static Point operator *(Point left, BigInteger right)
            {
                var e = right;
                if (e == 0 || left == INFINITY)
                    return INFINITY;
                var e3 = 3 * e;
                var negativeLeft = new Point(left.Curve, left.X, -left.Y);
                var i = LeftmostBit(e3) / 2;
                var result = left;
                while (i > 1)
                {
                    result = result.Double();
                    if ((e3 & i) != 0 && (e & i) == 0)
                        result += left;
                    if ((e3 & i) == 0 && (e & i) != 0)
                        result += negativeLeft;
                    i /= 2;
                }
                return result;
            }

            private static BigInteger LeftmostBit(BigInteger x)
            {
                BigInteger result = 1;
                while (result <= x)
                    result = 2 * result;
                return result / 2;
            }
            private static BigInteger InverseMod(BigInteger a, BigInteger m)
            {
                while (a < 0) a += m;
                if (a < 0 || m <= a)
                    a = a % m;
                BigInteger c = a;
                BigInteger d = m;

                BigInteger uc = 1;
                BigInteger vc = 0;
                BigInteger ud = 0;
                BigInteger vd = 1;

                while (c != 0)
                {
                    BigInteger r;
                    //q, c, d = divmod( d, c ) + ( c, );
                    var q = BigInteger.DivRem(d, c, out r);
                    d = c;
                    c = r;

                    //uc, vc, ud, vd = ud - q*uc, vd - q*vc, uc, vc;
                    var uct = uc;
                    var vct = vc;
                    var udt = ud;
                    var vdt = vd;
                    uc = udt - q * uct;
                    vc = vdt - q * vct;
                    ud = uct;
                    vd = vct;
                }
                if (ud > 0) return ud;
                else return ud + m;
            }
        }

        class CurveFp
        {
            public BigInteger p { get; private set; }
            public BigInteger a { get; private set; }
            public BigInteger b { get; private set; }
            public CurveFp(BigInteger p, BigInteger a, BigInteger b)
            {
                this.p = p;
                this.a = a;
                this.b = b;
            }
        }
    }
}

11  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 22, 2020, 11:51:46 PM
Ayrıca dikkat edersen benim paylaştığım kodlarda literal bir değer yok, bu da anlaşılmasını kolaylaştırıyor fakat sen 5, 27, 31 gibi sayılar kullanıyorsun hiç bir şey anlamıyorum. Bu sayılar nereden geldi ve ne için oradalar?
12  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 22, 2020, 11:23:05 PM
Ne yapmak istediğime gelince aslında girdiğim integer ile  nokta üretmek ve kontrol etmek istiyorum.Ör : 300 olsun

Burada tam olarak ne yapıyoruz? Örneğin 300 senin public key'in ve merkeze uzaklığı tam 300 olan X ve Y koordinatlarını içeren bir point de senin private key'in mi oluyor? Peki imza nasıl doğrulanıyor? Ya da nasıl encode ve decode yapıyorsun?

Örneğin senin public keyin 300 olsun.
Benim ki de 500 olsun.

MPubKey = 300
JPubKey = 500

Örneğin A = 5 gibi bir bilgimiz olsun.

Ben sana A bilgisini şifreleyip göndermek istiyorum. Bunun için senin public key'in olan 300 ile şifrelemeliyim ki sen de sana ait 300 için X ve Y koordinatlarını içeren sahip olduğun private key ile bu bilgiyi deşifre edip gönderdiğim bilgiyi çözümleyip 5 bilgisini çözümleyip al. Sonra senin de bana B = 6 bilgisini göndermek istediğini farz edelim. Sen de bana benim public key imi kullanarak şifrele ve gönder. Bende de 500 public keyine ait X ve Y koordinatlarını içeren bir private key olması durumunda ben de bu şifreyi çözebilirim ki zaten benim public key im bu ilk olarak belirlenen bu x ve y koordinatlarını içeren private key den üretildiği için ben private keyim ile senin gönderdiğin bu 6 bilgisini gönderdiğin sayıdan oluşturabilmeliyim.


O halde Encode ve Decode işlemlerinin nasıl yapıldığını açıklayabilir misin?

C# için temel bir bir kod yazalım. Bu ECDSA keyini değil de basit bir merkeze uzaklık kodu olsun. ECDSA ile farkını anlatabilir misin? Ya da EllipticCurve bunu nasıl yapıyor?


Şimdi aşağıdaki kod simetrik mi yoksa asimetrik mi oldu? Bu basitlikte ve Point ve uzaklık yöntemiyle bu kodu asimetrik yapabilir miyiz? Zaten asimetrikse bu halde kalsın basit de olsa konuyu anlamak için örnek bir kod olabilir.

Code:
public class LLDSAKey
{
     public double X;
     public double Y;

     public LLDSAKey(double X, double Y)
     {
        this.X = X;
        this.Y = Y;
     }

     public int GetPubKey() // Merkeze olan uzaklık (bir noktanın merkeze uzaklığı)
     {
        return Math.Floor(Math.Sqrt(this.X ^ 2 + this.Y ^ 2)); // Merkeze olan uzaklık için karelerinin toplamını al ve karekökünü hesaplayıp en yakın tam sayıya yuvarla...
     }
}

public class LLDSACrypto
{
    public int Encode(int message, int pubkey)
    {
        return message * pubkey;
    }

    public int Decode(int cryptedMessage, LLDSAKey key)
    {
       return cryptedMessage / Math.Floor(Math.Sqrt(key.X ^ 2 + key.Y ^ 2));
    }
}
13  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 22, 2020, 06:04:35 PM
Sen beni anlamamışsın. Örneğin ben RSA kriptolarının nasıl çalıştığını ve nasıl public key üretildiğini biliyorum.

Şimdi burada ilk belirlediğin sayı private keyimiz mi yoksa ona yakın bir asal sayı mı seçiyorsun? Sonraki ona yakın bir asal sayı daha var onu neden seçtin? Sonra hangi matematiksel işlemlerden sonra Gx ve Gy yi belirliyorsun. Örneğin RSA kriptolarında Fermat teoreminden faydalanılıyor. Ben burada ne yapıldığını hâlâ anlamadım. Daha açıklayıcı şekilde öncelikle özetle "EllipticCurve nedir?" ile başlayıp, (1  ile 2 ^ 256 - 2) aralığında seçtiğimiz private key ile Wif adresini ve tüm public key türlerini oluştururken EllipticCurve işlevinin tüm detaylarını daha açıklayıcı anlatabilir misin? Ayrıca tüm bunlar hangi teoremlere dayanıyor.
14  Economy / Micro Earnings / Re: Balkancoin faucet: Earn up to 50 BKC every 12 hours. on: December 22, 2020, 05:46:10 AM
I have recommended this coin because it has long been the most profitable coin among Cryptonight coins. It had a working faucet on its site, but it became unavailable right after I posted. Mining is still possible and it is still the most profitable coin for the coin I mentioned.

https://www.cryptunit.com/
15  Local / Proje Geliştirme / Re: Bitcoin; Algoritma Üzerine Yöntemler on: December 22, 2020, 05:28:16 AM
Bu adres arama işinden vazgeçeceğim zaman son kullanım ve tüm adresleri tekrar kontroldan sonra ya silecegim yada istek olursa paylaşacağım. Benim kontrolümden birşey çıkmadı başkası bakınca birşey çıkacak demiyorum. Adres ve privatekey lerden yola çıkarak tersine mühendislik için belki bir ışık tutabilir. Benim harcadıgım 2 yılı o harcamamış olur.

Farkındayım arkadaş çok yavaş bir yöntem kullanıyor. Bakiyeli adreslerle bir çakışma yakalamak için VanitySearch gibi bir yöntemle kendi işlemcimde (2. Nesil Intel Core i7) 3 milyon adres üretebildiğimi gördüm. Her saniye üretilen bu 3 milyon adresin en az birinin blockchain deki bir adresle çakıştıran kod tüm adresleri hafızada tutuğu için ve sıralı bir liste olduğundan çok hızlı sorgulanıyor. Random 96 bit genişliğinde bir aralıkta en az bir adres bulunabileceğini düşünüyorum.

Böyle bir bilgiyi de forumdakiler nimet zannedip bu konuda paylaşım yapmaktan imtina ediyor. Zaten bu kadar kolay olsaydı birileri bunu çoktan denemiş ve başarmış olup Bitcoin fantazisini tarih yapacaktı.

Bakalım @bitcamilo buna ne cevap verecek?
16  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 22, 2020, 02:07:14 AM
Bu konudaki matematiği benden daha iyi biliyor olabilirsin. Sen de bana bu konuda daha detaylı bilgi verebilir misin?

Örneğin senin aradığın temel kodu ifade eden şöyle bir kod yazalım. Ancak burada x ve y kaç bitlik integer sayılar olmalı ve ECdouble için ne kadar duyarlı bir kayan noktalı sayı gerekiyor?

Bu temel kod üzerinden bana adım adım EllipticCurve'nin işlevini anlatabilir misin? ECdouble işlevi de Point mi döndürüyor?

Code:
class Point
{
    public:
        long long int x, y;

    public: Point(long long int _x, long long int _y)
    {
        x = _x;
        y = _y;
    }

    public: void print()
    {
        cout << "(";
        cout << x;
        cout << ", ";
        cout << y;
        cout ")";
    }
};

class EllipticCurve
{
    public:
        int a;
        int b;
        unsigned int m;

    public: EllipticCurve(int _a, int_b, unsigned int modul)
    {
        a = _a;
        b = _b;
        m = modul;
    }

    public: Point generate(unsigned long long int x)
    {
        // looks for Points on the curve with the given x coordinate
        // returns the first matching point
    }

    public: Point add(Point p, Point q)
    {
        // complex addition function with if-else trees
        // the function code is not needed for this question
    }

    public: Point mul(Point p, unsigned int n)
    {
        // see above
    }
};
17  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 22, 2020, 01:56:42 AM
Bende CUDA8 desteği olan eski bir grafik kartı var. CUDA8 ve CUDA 10.x arasında çok fark olabilir. Performans açısından pek çok farklılık oluyor. CUDA8 için çok vaktimi almazsa bir bakayım. CUDA 10.x için modifikasyon yapmak durumunda kalabilirsin.
18  Local / Türkçe (Turkish) / Re: Bitcoin Algoritmasi 256-SHA Hacklenebilir mi ? on: December 22, 2020, 12:27:23 AM
Sonuçta bu algoritmayıda üreten bir insan değil mi ? Hemde Amerika'da bir şirket.Peki kendi ürettikleri algoritma ile çalışan bitcoini nasıl ve neden hackleyemiyorlar ?
Demek istediğim private keyleri kendi icat ettikleri algoritma ile tahmin edemiyorlarmı ?

pek mümkün değil çünkü stringleri tuttursanız dahi string üzerinden key üretilmiyor.

OpenSSL deki random_bit fonksiyonu kullanılıyor. Bu bitlerin tahmin edilemesi üzerine toplarca akademik makale var. kısaca sha256 icindeki string data cok uzun bir bir karmaşasıdır.

2013 teki Brainwallet faciasından sonra bu sekilde cüzdan üretimi durdu. Bulan buldu (:

Şaka mısınız? Örneğin bu adreste stringleri SHA256 algoritmasından geçirdikten sonra bu hash ile bir key üreterek şu linkini vereceğim kelimeleri girdiğiniz taktirde işlem görmüş 18 bin küsür adresi hacklemiş olacaksınız. Evet cüzdanlar boşaltılmış fakat zaman zaman yine aynı adreslere yeni bitcoin gönderiyorlar ve bu yeni gelenler için bir listener hazırlarsanız gönderdikleri anda haberiniz olur.

Hemen bu cüzdanları boşaltın demiyorum elbette ancak daha güvenli kurumlara adresi çözümlediğinizi bildirerek ödül kazanabilirsiniz. 30 BTC ye kadar ödül veren kurumlar var.

Şu adres inceleyin. Yukarıda verdiğim kod bu strigler ile nasıl key üretebileceğinizi gösteriyor.

https://eli5.eu/brainwallet/
19  Local / Türkçe (Turkish) / Re: GPU ile Eliptik Eğri Aritmetiği ve Programlama Hakkında on: December 21, 2020, 11:19:58 PM
Verdiğim kod bu işlemleri zaten yapıyor.

Code:
//first we hash the string
SHA256 (string, strlen(string), hash);

Yukarıdaki kod satırını kaldırıp belirlediğin 0 ile (2 ^ 256 - 1) aralığındaki bir sayının 32 baytlık byte dizisini direk hash isimli değişkene verirsen zaten bu kod sana bu sayıya karşılık gelen priv ve pub keyleri verecektir. Bir döngü içerisinde senin belirleyeceğin matematikteki seyrek sayı dizilerinin bir kümesini test etmek isteyebilirsin. Malum bu brute force yönteminde birer birer artırmak yerine x artırarak işlemin daha hızlı sonuçlanmasını sağlayabiliyorsun. x ne kadar büyük olursa işlem o kadar çabuk tamamlanır. x elbette gerçekten çok büyük olursa Smiley

BigInt kullanmak yerine uint256 kullanmak çok fazla hız kazandırır.

Code:
uint256 N = 0;
uint256 X = [your magic number];
while(N < MAX_N) {
  N += X;
  if(checkPublicKeyInBlockChain(N)) {
    logger(N);
  }
}

Elbette büyük marketlerin programcıları bu ihtimalleri düşünerek N  sayısını asal bir sayı olarak seçmişlerdir gibi bir ön kabulum var. Ne de olsa asal olmayan bir sayı seçerlerse bu yöntemler ile blockchain deki işlem görmüş yaklaşık 900 milyon adresten birini denk getirmeniz daha kolay olurdu.

Dolayısıyla N için matematikteki seyrek sahte asalları kullanarak çok hızlı bir algoritma elde edebilirsin. Bu sayıların 256 bit içerisindeki karşılıkları gerçekten çok seyrektir ve kullanmış olma ihtimalleri de oldukça yüksektir.

Öncelikle karşılaştırma algoritmanı nasıl kurguladığın önemlidir. Geriye kalanlar zaten çözülmüş problemler...

GPU konusuna gelince, NVIDIA ekran kartları için CUDA, AMD anakartları için de OPENCL platformlarını kullanabilirsin. Örnek bir kod görmek istersen VanitySearch projesinin kodlarına bakabilirsin. Gerçekten daha iyi bir kod görmek istiyorsan xmrig projesinin kodlarını incele! Bu Monero madenciliğini GPU üzerinden yapmak için RandomX hash algoritmasını kullanıyor olsa da CUDA ve OPENCL kullanımının nasıl yapıldığını öğrenmen için sana referans olabilir. Alttan alta monero madenciliği yap daha çok kazanırsın gibi bir mesaj da veriyor olabilirim Smiley
20  Local / Türkçe (Turkish) / Re: Bitcoin Algoritmasi 256-SHA Hacklenebilir mi ? on: December 21, 2020, 09:43:17 PM
Edemiyorlar! Milyonlarca olasılık var ve bu algoritmalar tersine çalışacak şekilde tasarlanmamışlardır; tek yönlüdür! Amaç da budur aslında. Güvenliği en üst düzeyde olan bir şifreleme yani... Önceden bilinebilirlik tarafı sadece aynı kelimeler içindir. Mesela "kalem" kelimesinin SHA-256 çevrimi şöyledir:
Quote
0e6a9c8a7ef32b695cf07d9180e253fe4ee604b9b6d5244c14ab089a6586936f

Kalem kelimesini SHA-256'ya her çevirdiğimizde aynı sonucu alırız! Fakat her harfi tek tek çevirmeye kalktığımızda farklı farklı sonuçlar ortaya çıkar. Yani her bir karakter, yanına gelen diğer karakterle birlikte benzersiz bir koda dönüşür.

Eğer "kalemci" kelimesini çevirmeye kalkarsak sonuç şöyle çıkacaktır:
Quote
79522a0c5ea73889c79702c5741328ba3ad3cc266bf72cc238671afe43b47976

Sadece arkasına 2 harf eklememize rağmen hash kodu tamamen farklı bir dizilime dönüştü.

Tek bir kelime de yazsak, uzun bir cümle de yazsak; sonuçta bize 64 karakterden oluşan bir kod veriyor.

Konuyu daha iyi anlamak açısından şu makaleyi okumanızı tavsiye ederim: https://medium.com/@ahmetseyhan/sha-256-kriptografik-hash-algoritmas%C4%B1-294d13f0ca5d

Arkadaşım biz geri zekalı mıyız da SHA256'ın çıktısı üzerinden hareket edip olası tüm kombinasyonları deneyelim?

örneğin "kalem" kelimesinde ya da "kalemci" de bir bakiye olmayabilir ancak çeşitli dillerdeki sözcüklerin bir listesini edindiğimizde ASCII, UTF8 ya da Unicode encoding kullanarak elimdeki yaklaşık her dil için 400k olan sözlüklerin ürettikleri public keylerin mevcut bakiyeli bitcoin cüzdanları ile çakıştırıp hızla açık bir cüzdan olup olmadığını sorgulayabiliriz. Bir sözlük benim bilgisayarımda dakikalar sürüyor. Tüm diller için çeşitli sözlükler edinerek saatler içerisinde tüm dillerdeki kelimelerde bakiye olup olmadığını öğrenebiliyoruz. Hatta bu adreslere zaman zaman tekrar ve tekrar bitcoin gönderiyorlar. İyi planlanmış bir listener ile gönderildiği anda haberimiz olabilir.

Size örnek bir node.js kodu vereyim.

Code:
const WebSocket = require('ws');
const fs = require('fs');
var bs = require('binarysearch');

const jsonfile = require('jsonfile');

const eli5 = fs.readFileSync('./btc_brainwallet_v18569_pub_cpub.txt').toString().split('\n');

eli5.sort();

const ws = new WebSocket('wss://ws.blockchain.info/inv');

ws.on('open', function open() {
    console.log('Connected!');
    ws.send('{"op":"unconfirmed_sub"}');
});

var count = 0;
var priorAddress = null;

ws.on('message', function incoming(txraw_str) {
    var start = new Date();
    var txraw = JSON.parse(txraw_str);
    var hash = txraw.x.hash;
    var addresses = txraw.x.out.map(o => o.addr);
    
    for(var index in addresses) {
        var address = addresses[index];
        if(address && (address != priorAddress)) {
            if(address[0] == '1') {
                
                var search_start = new Date();
                var findex = bs(eli5, address);
                var search_end = new Date()

                console.log(address, (new Date((txraw.x.time * 1000))).toLocaleString());

                if(findex >= 0) {
                    console.log(address, findex);
                    var fileName = './founds/found.eli5.'+ address + '.' + hash +'.txt';
                    var content =   address +
                                    '\nIndex: ' + findex.toString() +
                                    '\nHash: ' + hash +
                                    '\nCurrent Date: ' + start.toLocaleString() +
                                    '\nTransaction Date: ' + new Date(time * 1000).toLocaleString() +
                                    '\nSearch Finished: ' + search_end.toLocaleString() +
                                    '\nDiff: ' + (search_end.getTime() - start.getTime()).toString() +
                                    '\n' +
                                    '\n' + JSON.stringify(txraw, null, 2)
                    fs.writeFileSync(fileName, content);
                    console.log("File written successfully\n" + fileName);
                }
            }
        }
        priorAddress = address;
    }
    
    var end = new Date()
});

Elbette bakiyeli bir cüzdan gördüğünüzde bunu boşaltın demiyorum fakat bunun ispatını yaptığınız taktirde size ödül vaadeden pek çok görece daha güvenli kurumlar var. Onlar aracılığı ile ödüller kazanabilirsiniz.

Örneğin şu sitede bu türden kelimelerle üretilmiş işlem görmüş adreslerin bir listesi var.

https://eli5.eu/brainwallet/

Şu C kodunu derleyip sizler de bu konu üzerinde çalışmaya başlayabilirsiniz. Python görece daha yavaş kalıyor. C dilini tavsiye ederim.

Code:
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
#include <openssl/sha.h>
#include <openssl/ssl.h>
#include <openssl/ec.h>
#include <openssl/ripemd.h>

int create_address_from_string(const unsigned char *string,
unsigned char *address,
unsigned char *priv_key,
bool base58,
bool debug,
EC_GROUP *precompgroup);
void print_hex(u_int8_t * buffer, unsigned int len);
void base58_encode(unsigned char *data, unsigned int len, char *result);
void prepare_for_address(unsigned char *data, int datalen, char start_byte);


int main(int argc, char *argv[]) {
    unsigned char message[32] = "password";
    unsigned char address[64];
    unsigned char priv_key[64];

    if (create_address_from_string(message, address, priv_key, true, false, NULL) == 1) {
printf("address: %s\n", address);
printf("private key: %s\n", priv_key);
return 0;
}
else {
printf("Something went wront :(\n");
return 1;
}
}

/* creates a bitcoin address+private key from the SHA256
 *  hash of string. converts to base58 if base58 is 'true'
 *  returns 1 if successful, 0 if not*/
int create_address_from_string(const unsigned char *string,
unsigned char *address,
unsigned char *priv_key,
bool base58,
bool debug,
EC_GROUP *precompgroup) {

    u_int8_t * hash = malloc(SHA256_DIGEST_LENGTH);
    BIGNUM * n = BN_new();

    //first we hash the string
    SHA256 (string, strlen(string), hash);
//then we convert the hash to the BIGNUM n
    n = BN_bin2bn(hash, SHA256_DIGEST_LENGTH, n);

    BIGNUM * order = BN_new();
    BIGNUM * nmodorder = BN_new();
BN_CTX *bnctx;
bnctx = BN_CTX_new();

    //then we create a new EC group with the curve secp256k1
EC_GROUP * pgroup;
if (precompgroup == NULL)
pgroup = EC_GROUP_new_by_curve_name(NID_secp256k1);
else
//unless one has been passed to this function. in which case we use that curve.
pgroup = precompgroup;


    if (!pgroup) {
     printf("ERROR: Couldn't get new group\n");
     return 0;
    }

    //now we need to get the order of the group, and make sure that
    //the number we use for the private key is less than or equal to
    //the group order by using "nmodorder = n % order"
    EC_GROUP_get_order(pgroup, order, NULL);
    BN_mod(nmodorder, n, order, bnctx);

    if (BN_is_zero(nmodorder)) {
     printf("ERROR: SHA256(string) %% order == 0. Pick another string.\n");
     return 0;
    }

    //now we create a new EC point, ecpoint, and place in it the secp256k1
    //generator point multiplied by nmodorder. this newly created
    //point is the public key


    EC_POINT * ecpoint = EC_POINT_new(pgroup);

if (!EC_POINT_mul(pgroup, ecpoint, nmodorder, NULL, NULL, NULL))
{
     printf("ERROR: Couldn't multiply the generator point with n\n");
     return 0;
    }

    if (debug) {
        BIGNUM *x=NULL, *y=NULL;
        x=BN_new();
        y=BN_new();

        if (!EC_POINT_get_affine_coordinates_GFp(pgroup, ecpoint, x, y, NULL)) {
         printf("ERROR: Failed getting coordinates.");
         return 0;
        }

     printf ("x: %s, y: %s\n", BN_bn2dec(x), BN_bn2dec(y));

        BN_free(x);
        BN_free(y);
    }

    //then we need to convert the public key point to data
    //first we get the required size of the buffer in which the data is placed
    //by passing NULL as the buffer argument to EC_POINT_point2oct
    unsigned int bufsize = EC_POINT_point2oct (pgroup, ecpoint, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL);
    u_int8_t * buffer = malloc(bufsize);
    //then we place the data in the buffer
    int len = EC_POINT_point2oct (pgroup, ecpoint, POINT_CONVERSION_UNCOMPRESSED, buffer, bufsize, NULL);
    if (len == 0) {
     printf("ERROR: Couldn't convert point to octet string.");
     return 0;
    }

    //next we need to hash the public key data. first with SHA256, then with RIPEMD160
    SHA256(buffer, len, hash);
    u_int8_t * ripemd = malloc(RIPEMD160_DIGEST_LENGTH+1+4);
    RIPEMD160(hash, SHA256_DIGEST_LENGTH, ripemd);

    if (base58 == true) {
//here we add the version byte to the beginning of the public key and four checksum
//bytes at the end
prepare_for_address(ripemd, RIPEMD160_DIGEST_LENGTH, 0);


if (debug)
print_hex(ripemd, RIPEMD160_DIGEST_LENGTH+1+4);

//and we convert the resulting data to base58
base58_encode(ripemd, RIPEMD160_DIGEST_LENGTH+1+4, address);
    } else {
     memcpy(address, ripemd, RIPEMD160_DIGEST_LENGTH);
    }


    //now we need to convert the big number nmodorder (private key) to data
    int buflen = BN_num_bytes(nmodorder);
    u_int8_t * buf = malloc(buflen+1+4);
    int datalen;

    //nmodorder is converted to binary representation
    datalen = BN_bn2bin(nmodorder, buf);


    if (base58 == true) {
//and we add version byte and four byte checksum to the data
prepare_for_address(buf, datalen, 0x80);

        //and convert this to base58
        base58_encode(buf, datalen+5, priv_key);
    } else {
     memcpy(priv_key, buf, datalen+5);
    }

    free(hash);
    free(buffer);
    free(ripemd);
    free(buf);
    BN_free(n);
    BN_free(order);
    BN_free(nmodorder);
    if (precompgroup == NULL)
     EC_GROUP_free(pgroup);
    EC_POINT_free(ecpoint);
    BN_CTX_free(bnctx);
    return 1;
}

/*prepares data to be converted to address. specifically, it adds
 start_byte to the beginning and a four-byte doubleSHA256 checksum to the end */
void prepare_for_address(unsigned char *data, int datalen, char start_byte) {
unsigned char *tmpbuf = malloc(datalen);
    //get data into a temporary buffer
    memcpy(tmpbuf, data, datalen);
    //shift data one byte forward, to make room for star_byte
    memcpy(data+1, tmpbuf, datalen);
    data[0] = start_byte;

    unsigned char *hash = malloc(SHA256_DIGEST_LENGTH);
    SHA256(data, datalen+1, hash);
    SHA256(hash, SHA256_DIGEST_LENGTH, hash);

    //copy four first bytes from hash to the end of data (checksum bytes)
    memcpy(data+datalen+1, hash, 4);
    free(tmpbuf);
    free(hash);
}

void print_hex(u_int8_t * buffer, unsigned int len) {
int x;
for (x = 0; x < len; x++) {
printf("%.2x",buffer[x]);
}
printf("\n");
}

/*return the base58 encoding of data*/
void base58_encode(unsigned char *data, unsigned int len, char *result) {
const char code_string[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";

    BIGNUM *x, *rem, *base, *tmp, *tmp2;
    x = BN_new();
rem = BN_new();
base = BN_new();
tmp = BN_new();
char * output_string = malloc(64);

x = BN_bin2bn(data, len, x);

BN_set_word(rem, 1);
BN_set_word(base, 58);

BN_CTX *bnctx;
bnctx = BN_CTX_new();

int i = 0;
while (!BN_is_zero(x)) {
BN_div(tmp, rem, x, base, bnctx);
output_string[i++] = code_string[BN_get_word(rem)];


tmp2 = x;
x = tmp;
tmp = tmp2;
}


//public key
int i2 = 0;
while (data[i2] == 0) {
output_string[i++] = code_string[0];
i2++;
}

int base58len = i;
while (i>=0) {
result[base58len-i] = output_string[i-1];
i--;
}
result[base58len] = 0;

BN_free(x);
BN_free(base);
BN_free(rem);
BN_free(tmp);
BN_CTX_free(bnctx);
free(output_string);
}

Pages: [1] 2 »
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!