Search content
Sort by

Showing 20 of 47 results by s.john
Post
Topic
Board Bitcoin Discussion
Re: Lubian hack
by
s.john
on 14/08/2025, 20:27:45 UTC
I think you misunderstood.

They didn’t catch the hacker, and he is still unknown. The hack itself was only recently discovered after 5 years.


You can find details here: https://bitcointalk.org/index.php?topic=5553496.0
Post
Topic
Board Bitcoin Discussion
Topic OP
The Largest Financial Theft in History : LuBian Bitcoin Hack
by
s.john
on 09/08/2025, 18:36:34 UTC
Back in December 2020, something went down in Bitcoin history that barely made any noise at the time… but it turns out it was the biggest theft ever recorded, not just in crypto, but in all of finance.

I’m talking about the LuBian mining pool hack.

LuBian was a Chinese mining pool, ranked among the top in the world back then. Huge hashrate, big reserves, and apparently… some really bad security. Their wallet system was using 32-bit private key entropy (basically the equivalent of locking Fort Knox with a bike lock).

On Dec 28–29, 2020, someone brute-forced those weak keys and swept 127,426 BTC into their own wallets. At the time, that stash was worth about $3.5 billion. For context:

Central Bank of Iraq robbery (2003) → $1B

Mt. Gox collapse (2014) → $450M

Ronin hack (2022) → ~$620M


LuBian’s loss was triple the size of any confirmed theft in finance up to that point.

Here’s the crazy part: instead of going public with a scandal, LuBian just quietly shut down in early 2021. They even tried something desperate — sending 1,500+ OP_RETURN messages on the blockchain begging the hacker to return the coins (costing them 1.4 BTC in fees). No luck, of course.

Fast-forward to today, those 127k BTC are worth around $14.5 BILLION. That’s more than any bank robbery, gold heist, or cyber attack in history. The coins haven’t moved (except some consolidation in July 2024), and the address is now one of the top 13 biggest in Bitcoin.

This is wild for a few reasons:

1. It was a single hit, pulled off in hours.


2. The loot is visible on-chain for everyone to see.


3. Nobody’s been caught, and the funds are basically untouchable without triggering worldwide alerts.



This is the ultimate “perfect crime” in crypto, not because it was smart (their security hole was embarrassingly bad), but because the thief is still sitting on the largest untouched fortune in history.

More details here:
https://rekt.news/the-one-that-got-away
Post
Topic
Board Development & Technical Discussion
Re: Incorrect BIP49 Address Derivation from 24-Word Mnemonics
by
s.john
on 22/12/2024, 08:36:46 UTC
it doesn't look like you have a clue about that what this code contains.
so why you're presume addresses should be correct? and why you'd concluded they're incorrect?

I will explain it to you like if you were 5 yo

-1 run the program

-2 the program generate 2 txt files

-3 One contains the generated mnemonics and the other contains the btc bip49 addresses derived from those mnemonics

-4 the addresses don't match the mnemonics generated you can check it here https://iancoleman.io/bip39/
Post
Topic
Board Development & Technical Discussion
Topic OP
Incorrect BIP49 Address Derivation from 24-Word Mnemonics
by
s.john
on 20/12/2024, 19:08:10 UTC
the problem I’m facing is the incorrect derivation of addresses from the 24 words mnemonics.

As you can see, after running the program, you will get two text files: one for the mnemonics and the other for the addresses.

The mnemonics are correct, but the addresses are not.

I want to correctly derive the BIP49 addresses from the mnemonics and save them into a text file.

https://github.com/johnnstewart/mt-gpu/tree/main
Post
Topic
Board Development & Technical Discussion
Re: "Fixing 24-Word Mnemonic Support in bip39-solver-gpu"
by
s.john
on 15/12/2024, 09:01:50 UTC

I read what mcdouglasx said and took it as a challenge for myself. Take a good look at what I did: The ipad_key and opad_key arrays with 128 bytes each to perform HMAC operations. When the mnemonic_length exceeds 128 bytes (24 words), the remainder of the key is not being processed correctly. Therefore, it would be necessary to implement a key normalization process that complies with HMAC. If the key is larger than the block size (128 bytes for SHA-512), it must first be hashed to reduce its size. Then, it should be padded with zeros to reach 128 bytes if needed.

The changes I made to the file int_to_address.cl look like this:
Code:
__kernel void int_to_address(ulong mnemonic_start_hi, ulong mnemonic_start_lo, __global uchar * target_mnemonic, __global uchar * found_mnemonic) {
    ulong idx = get_global_id(0);

    ulong mnemonic_lo = mnemonic_start_lo + idx;
    ulong mnemonic_hi = mnemonic_start_hi;

    // ... [existing code to construct 'bytes' and 'mnemonic']

    // Constructing the mnemonic
    uchar mnemonic[180] = {0};
    uchar mnemonic_length = 11;
    for(int i = 0; i < 12; i++) {
        int word_index = indices[i];
        int word_length = word_lengths[word_index];
        mnemonic_length += word_lengths[word_index];
    }

    int mnemonic_index = 0;
    for (int i = 0; i < 12; i++) {
        int word_index = indices[i];
        int word_length = word_lengths[word_index];
       
        for(int j = 0; j < word_length; j++) {
            mnemonic[mnemonic_index] = words[word_index][j];
            mnemonic_index++;
        }
        mnemonic[mnemonic_index] = 32; // Space
        mnemonic_index++;
    }
    mnemonic[mnemonic_index - 1] = 0; // Null termination

    // Key Normalization
    uchar normalized_key[128] = {0};
    if (mnemonic_length > 128) {
        // If the mnemonic is larger than 128 bytes, hash it with SHA-512
        sha512(&mnemonic, mnemonic_length, &normalized_key);
        // Remaining bytes are already zero-padded (done at initialization)
    } else {
        // If the mnemonic is less than or equal to 128 bytes, copy it directly
        for(int i = 0; i < mnemonic_length; i++) {
            normalized_key[i] = mnemonic[i];
        }
        // Remaining bytes are already zero-padded
    }

    // Initialization of ipad_key and opad_key
    uchar ipad_key[128];
    uchar opad_key[128];
    for(int x = 0; x < 128; x++) {
        ipad_key[x] = 0x36;
        opad_key[x] = 0x5c;
    }

    // Apply XOR with the normalized key
    for(int x = 0; x < 128; x++) {
        ipad_key[x] ^= normalized_key[x];
        opad_key[x] ^= normalized_key[x];
    }

    // Continue seed derivation process
    uchar seed[64] = {0};
    uchar sha512_result[64] = {0};
    uchar key_previous_concat[256] = {0};
    uchar salt[12] = {109, 110, 101, 109, 111, 110, 105, 99, 0, 0, 0, 1};
    for(int x = 0; x < 128; x++) {
        key_previous_concat[x] = ipad_key[x];
    }
    for(int x = 0; x < 12; x++) {
        key_previous_concat[x + 128] = salt[x];
    }

    sha512(&key_previous_concat, 140, &sha512_result);
    copy_pad_previous(&opad_key, &sha512_result, &key_previous_concat);
    sha512(&key_previous_concat, 192, &sha512_result);
    xor_seed_with_round(&seed, &sha512_result);

    for(int x = 1; x < 2048; x++) {
        copy_pad_previous(&ipad_key, &sha512_result, &key_previous_concat);
        sha512(&key_previous_concat, 192, &sha512_result);
        copy_pad_previous(&opad_key, &sha512_result, &key_previous_concat);
        sha512(&key_previous_concat, 192, &sha512_result);
        xor_seed_with_round(&seed, &sha512_result);
    }

    // ... [existing code for key generation and address verification]

    if(found_target == 1) {
        found_mnemonic[0] = 0x01;
        for(int i = 0; i < mnemonic_index; i++) {
            target_mnemonic[i] = mnemonic[i];
        }
    }
}

And in the file just_seed.cl, it turned out like this:
Code:
__kernel void just_seed(ulong mnemonic_start_hi, ulong mnemonic_start_lo, __global uchar * target_mnemonic, __global uchar * found_mnemonic) {
    ulong idx = get_global_id(0);

    ulong seed_start = idx * 64;
    ulong mnemonic_lo = mnemonic_start_lo + idx;
    ulong mnemonic_hi = mnemonic_start_hi;

    // ... [existing code to build 'bytes' and 'mnemonic']

    // Mnemonic construction
    uchar mnemonic[180];
    int mnemonic_index = 0;
    for (int i = 0; i < 12; i++) {
        int word_index = indices[i];
        int word_length = word_lengths[word_index];
       
        for(int j = 0; j < word_length; j++) {
            mnemonic[mnemonic_index] = words[word_index][j];
            mnemonic_index++;
        }
        mnemonic[mnemonic_index] = 32; // Space
        mnemonic_index++;
    }
    mnemonic[mnemonic_index - 1] = 0; // Null termination

    uchar mnemonic_length = 11 + word_lengths[indices[0]] + word_lengths[indices[1]] + word_lengths[indices[2]] + word_lengths[indices[3]] + word_lengths[indices[4]] + word_lengths[indices[5]] + word_lengths[indices[6]] + word_lengths[indices[7]] + word_lengths[indices[8]] + word_lengths[indices[9]] + word_lengths[indices[10]] + word_lengths[indices[11]];

    // Key normalization
    uchar normalized_key[128] = {0};
    if (mnemonic_length > 128) {
        // If the mnemonic is larger than 128 bytes, hash with SHA-512
        sha512(&mnemonic, mnemonic_length, &normalized_key);
        // Fill remaining bytes with zeros (already done during initialization)
    } else {
        // If the mnemonic is 128 bytes or less, copy directly
        for(int i = 0; i < mnemonic_length; i++) {
            normalized_key[i] = mnemonic[i];
        }
        // Remaining bytes are already filled with zeros
    }

    // Initialization of ipad_key and opad_key
    uchar ipad_key[128];
    uchar opad_key[128];
    for(int x = 0; x < 128; x++) {
        ipad_key[x] = 0x36;
        opad_key[x] = 0x5c;
    }

    // Apply XOR with normalized key
    for(int x = 0; x < 128; x++) {
        ipad_key[x] ^= normalized_key[x];
        opad_key[x] ^= normalized_key[x];
    }

    // Continue the seed derivation process
    uchar seed[64] = { 0 };
    uchar sha512_result[64] = { 0 };
    uchar key_previous_concat[256] = { 0 };
    uchar salt[12] = { 109, 110, 101, 109, 111, 110, 105, 99, 0, 0, 0, 1 };
    for(int x = 0; x < 128; x++) {
        key_previous_concat[x] = ipad_key[x];
    }
    for(int x = 0; x < 12; x++) {
        key_previous_concat[x + 128] = salt[x];
    }

    sha512(&key_previous_concat, 140, &sha512_result);
    copy_pad_previous(&opad_key, &sha512_result, &key_previous_concat);
    sha512(&key_previous_concat, 192, &sha512_result);
    xor_seed_with_round(&seed, &sha512_result);

    for(int x = 1; x < 2048; x++) {
        copy_pad_previous(&ipad_key, &sha512_result, &key_previous_concat);
        sha512(&key_previous_concat, 192, &sha512_result);
        copy_pad_previous(&opad_key, &sha512_result, &key_previous_concat);
        sha512(&key_previous_concat, 192, &sha512_result);
        xor_seed_with_round(&seed, &sha512_result);
    }
}

This was my work, test it to see if everything is running fine and let me know




I've made a lot of changes to some of the kernel files and the host file, but the problem I’m facing is the incorrect derivation of addresses from the 24 words mnemonics. As you can see, after running the program, you will get two text files: one for the mnemonics and the other for the addresses. The mnemonics are correct, but the addresses are not. I want to correctly derive the BIP49 addresses from the mnemonics and save them into a text file.

https://github.com/johnnstewart/mt-gpu/tree/main
Post
Topic
Board Development & Technical Discussion
Topic OP
"Fixing 24-Word Mnemonic Support in bip39-solver-gpu"
by
s.john
on 12/12/2024, 05:11:13 UTC
when trying the code of this repo
https://github.com/johncantrell97/bip39-solver-gpu
when i try with any mnemonic longer than 128 chars (24 words for example), the resulting seed is wrong. I see the work done with the ipad/opad which is 128 byte long, can anyone give me a pointer on how to adapt the code to support longer mnemonics 24 words specifically?
Post
Topic
Board Bitcoin Discussion
Merits 1 from 1 user
Re: == 2024 Bitcoin halving tribute puzzle - Challenge to win 10,000,000 sats! ==
by
s.john
on 21/04/2024, 18:08:40 UTC
⭐ Merited by Cricktor (1)
I've made this website btc-puzzle.netlify.app

It's just like having the cards in your hands.  The website is responsive so that you can use it on your phone or tablet too.

How to use:

Flip the Black Card: Hit "Q" or tap/click the "Flip the Black Card" button.
Flip the Silver Card: Hit "W" or tap/click the "Flip Silver Card" button.

Moving Cards:
On Desktop: Click and hold Card B, then move your mouse.
On Mobile/Tablet: Tap and hold Card B, then drag your finger.

Keyboard Controls:
Arrow keys can Control the silver key movement.

The source code is here

https://github.com/johnnstewart/btc-puzzle

Post
Topic
Board Bitcoin Discussion
Merits 1 from 1 user
Re: == Bitcoin challenge transaction: ~1000 BTC total bounty to solvers! ==UPDATED==
by
s.john
on 20/09/2023, 03:12:38 UTC
⭐ Merited by albert0bsd (1)
I think the puzzle creator should reveal the public keys for all the keys bigger than 120bit except 124, 134, 144, 154, this will make the challenge reflect the true strength of bitcoin security.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
s.john
on 20/09/2023, 03:11:40 UTC
I think the puzzle creator should reveal the public keys for all the keys bigger than 120bit except 124, 134, 144, 154, this will make the challenge reflect the true strength of bitcoin security.
Post
Topic
Board Bitcoin Discussion
Merits 5 from 1 user
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
s.john
on 17/04/2023, 19:13:59 UTC
⭐ Merited by NotATether (5)
this is not the right place to ask for money, this thread is meant for storming and sharing ideas about solving the challenge.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
s.john
on 17/04/2023, 18:14:16 UTC
Let's remember that this is not really a "puzzle" or a game, it's crude measuring instrument, of the cracking strength of the community, that's the purpose of this challenge.
Post
Topic
Board Bitcoin Discussion
Re: Bitcoin puzzle transaction ~32 BTC prize to who solves it
by
s.john
on 17/04/2023, 02:32:07 UTC
I think the puzzle creator should reveal the public keys for all the keys bigger than 120bit
Post
Topic
Board Development & Technical Discussion
Re: REWARD offered for hash collisions for SHA1, SHA256, RIPEMD160 and other
by
s.john
on 20/03/2023, 01:04:05 UTC

Second attempt, this time on SHA-256.

We take this and use it as our public key:

[6]dacb99a98b80d48adbd8b94c9a7905996503d2ab
Then we perform a SHA-256 on it to get our hash of pub ready to convert to an address:
[5]32f51406f6d584a5b62365de425d01f308fc56a33682492284cc7577ceeb8868
Now we do a RMD160 on it:
6c161fcca8bbd0fe7a393b11b0499bb0754e3f7f
And the resulting address is:
[4]1ArWUwF2WfPnDubReohn2vtPodfPpG5Evq

Once again we have arrived at the scene of a collision, if you find the actual public key of [4], and perform a SHA-256 on it, you will see that the result is the same as[5], which means [6] and the actual public key of [4] which are different in value and length etc, collide with a similar SHA-256 hash, 2 different inputs, producing 1 unchanged output.




Let's pretend there was funds in the address in your example 1ArWUwF2WfPnDubReohn2vtPodfPpG5Evq ,  still they won't be able to move those funds since they don't know the private key of that address, the steps you provided is not enough to do that.
Post
Topic
Board Off-topic
Re: Im looking for good compfortable car asap
by
s.john
on 28/04/2022, 22:29:20 UTC
Mercedes-Maybach GLS will meet your needs for comfortable and smooth driving
Post
Topic
Board Politics & Society
Re: Lets remove all or most of the darkness from the world together
by
s.john
on 28/04/2022, 22:22:40 UTC
this is only gonna lead to the creation of a new kind of cult the only solution to defeating the darkness starts from the will of the individual to change and act kindly to others and to spread love and good in every moment of their life, that's because we live in a world governed by chaos and cant be controlled
Post
Topic
Board Altcoin Discussion
Re: Teach me to invest in NFTs.
by
s.john
on 28/04/2022, 22:13:29 UTC
this is not financial advice but if you want to invest in NFT project you should look for things like the artist's history the team the roadmap the community and the utility
Post
Topic
Board Politics & Society
Re: Library ? Or Internet ?
by
s.john
on 28/04/2022, 22:06:57 UTC
you summed it up very accurately the internet is a natural evolution for the library but the biggest disadvantage for the internet against the library is the flood of trivial information plus misinformation it's the biggest problem the internet is facing today
Post
Topic
Board Off-topic
Re: Elon Musk Purchases Twitter for $44 Billion 😍😍😍
by
s.john
on 28/04/2022, 21:56:25 UTC
it's gonna be an interesting era for Twitter I don't expect drastic changes immediately but I think they will slowly try to make it more a profitable platform that's for sure
Post
Topic
Board Off-topic
Re: Would you buy a used car?
by
s.john
on 28/04/2022, 21:52:07 UTC
if the car is in good shape and the owner has been taken care of then why not
Post
Topic
Board العربية (Arabic)
Re: مؤتمر البيتكوين
by
s.john
on 09/04/2022, 22:44:17 UTC
في انتظار قيام دولة كبرى بتبني البتكوين كعملة رسمية , دولة كبرى واحدة كفيلة بجعل العديد من الدول ان تعيد النظر حول البيتكوين