Author

Topic: Die erste Primzahl mit 21 zusammenhängenden Stellen in e (Read 195 times)

hero member
Activity: 784
Merit: 544
Sodelle, ich liege bestimmt falsch, aber sollte ich richtig liegen, dann ist der Rechenaufwand überraschenderweise übersichtlich!

Ich komme auf exakt

Code:
720*(sum(1:22) + sum(1:21) + sum(1:20) + sum(1:19) + sum(1:18) + sum(1:17) + sum(1:16)) = 967680

mögliche Zahlen für den Privatekey (wenn alle Zeichen unterschiedlich wären, mit multiplen Zeichen im String sind es sogar noch weniger???). Wenn meine Annahme stimmt.

Erklärung an einem rekursiven Beispiel:

abc123
ab1c23
ab12c3
ab123c
das waren vier Möglichkeiten

a1bc23
a1b2c3
a1b23c
das waren drei Möglichkeiten

a12bc3
a12b3c
das waren zwei Möglichkeiten

a123bc
das war eine Möglichkeit

=> 4 + 3 + ... + 1 (aus 123 folgen vier mögliche Verteilungen im ersten Schritt, dann drei, etc. pp.)

abc23 (wir lassen die 1 unter den Tisch fallen da diese nur verwirrt, eigentlich müßte dort 1abc23 stehen)
ab2c3
ab23c

a2bc3
a2b3c

a23bc

=> 3 + ... + 1 (aus 23 folgen drei mögliche Verteilungen im ersten Schritt, dann zwei, dann eine)

abc3 (wir lassen die 2 unter den Tisch fallen da diese nur verwirrt, eigentlich müßte dort 12abc3 stehen)
ab3c

a3bc

=> 2 + 1 (aus 3 folgen zwei mögliche Verteilungen im ersten Schritt, dann eine)

abc (wir lassen die 3 unter den Tisch fallen da diese nur verwirrt, eigentlich müßte dort 123abc stehen)

=> 1

Da drei Buchstaben durch 3 Ziffern wandern, ergibt das 4 + ...+ 1 + 3 + ... + 1 + 2 + 1 + 1 = 20 Möglichkeiten!

Der Induktionsbeweis, dass das auch für andere Anzahlen von Buchstaben und Ziffern gilt ist trivial.  Wink

q.e.d.
hero member
Activity: 784
Merit: 544
So, es gibt jetzt eine Hilfestellung vom Betreiber:

Quote
Without further ado, here are some clarification and hints to help you solve the puzzle:

1. The first 21-digit prime found in consecutive digits of e is: 957496696762772407663
2. The private key you derive from Satoshi’s portrait is a big integer, not Wallet Import Format (WIF)
3. The filename of the picture is irrelevant
4. The next step involves converting some words from the portrait, without I/O, into a 27-digit number
5. Go back to step 4) again if you can’t figure it out

https://phemex.com/references/articles/a-letter-from-max

Ich weiss nicht, was "without I/O" bedeuten soll.

Ohne dieses Wissen ist meine Annahme nun, dass man die 21-stellige Primzahl mit Buchstaben und Zahlen aus Wörtern im Bild vermischen muss (wozu ist das Wissen über die Primzahl sonst gut), dass der entsprechende 27-stellige Privatekey rauskommt. Dieser ist wahrscheinlich in hexadezimalen Ziffern geschrieben. Das ist zwar ein ziemlich kleiner Privatekey, aber doch schon nicht mehr sinnvoll zu brute forcen.

In den Wörtern im Bild gibt es eine 1, 2, B, C, E, F (die kleinen Buchstaben und Sonderzeichen nicht mitgezählt).

Eine beliebige Permutation dieser Zeichen (Primzahl + 1, 2, B, C, E , F) kann nicht die Lösung sein, da es davon 27! gibt, was ungefähr 1.1*10^28 Möglichkeiten entspricht (etwas weniger, da manche Zeichen mehrfach vorkommen). Das wäre imho aussichtslos.

Sollte die Primzahl eine Rolle spielen (in der oberen Hilfestellung steht nicht, dass die Primzahl irrelevant ist), dann ist, so denke ich, die Reihenfolge der Ziffern in der Zahl wichtig, da man, falls diese permutiert werden dürften, einfach alle Ziffern im Bild hätte verteilen können und der ganze Kram mit der Primzahl unnötig gewesen wäre ...

Für die sechs zusätzlichen Zeichen gibt es 720 = 6! Möglichkeiten. Wenn man jetzt für jede Permutation dieser Zeichen, diese in der Primzahl verteilt, aber die Reihenfolge dieser sechs Zeichen aufrecht erhält, dann hat man viel weniger Möglichkeiten. Als Beispiel die Permutation 12BCEF:

12BCEF957496696762772407663
12BCE9F57496696762772407663
12BCE95F7496696762772407663
...
12BCE957496696762772407663F
12BC9EF57496696762772407663
12BC9E5F7496696762772407663
12BC9E57F496696762772407663
...
12BC9E57496696762772407663F
...
95749669676277240766312BCEF

Das ist jetzt Kombinatorik, bei der Berechnung der Möglichkeiten mache ich mir aber einen Knoten ins Hirn, vielleicht liefere ich die Zahl noch nach ... oder jemand übernimmt die Denkarbeit.
staff
Activity: 2548
Merit: 2709
Join the world-leading crypto sportsbook NOW!
wow 2x die gehirnwindungen verbogen beim lesen vom thread... und da spreche ich nur vom lesen und nicht selbst erarbeiten Shocked respekt trantute2 Cool

zur lösung kann ich nicht viel beitragen aber hier ein paar grundsätzliche infos für alle die interesse haben.
so erspart ihr euch etwas googlearbeit Smiley

https://phemex.com/references/articles/try-to-solve-our-2-btc-puzzle
in anderen forenteilen wird auch bereits drüber geplaudert.
und hier: https://twitter.com/Phemex_official/status/1219832609271771136?s=20
die neueste ankündigung... sind nurmehr ein paar stunden (January 23, 02:00pm (UTC)) bis zum nächsten "großen" hinweis.
hero member
Activity: 784
Merit: 544
ist die:

957496696762772407663

und taucht schon hier auf:

2.718281828459045235360287471352662497757247093699959574966967627724076630353547 ...

Das ist nicht ungewöhnlich, da (pi(10^22) - pi(10^21))/(10^22 - 10^21) immer noch relativ klein ist (pi(x) ist grob gleich x/log(x)). D.h. selbst bei so großen Zahlen ist, wenn ich mich nicht verrechnet habe, jede ca. 50te Zahl eine Primzahl. Diese läßt sich logischerweise in drei Siebener-Gruppen oder sieben Dreier-Gruppen "zerlegen" ...

Warum? Deshalb:

https://cryptomonday.de/21-bitcoin-zu-verschenken-wer-loest-das-mysterioese-btc-puzzle/
https://www.blockchain.com/btc/address/1h8BNZkhsPiu6EKazP19WkGxDw3jHf9aT

Immer auch das Originalbild beachten, da sind vllt. Informationen versteckt (https://de.wikipedia.org/wiki/Steganographie). Da ist ein einziger schwarzer Pixel ausserhalb des Gesichts im rechten unteren Viertel des Bildes (man muss dazu etwas reinzoomen). Das ist bestimmte kein Zufall. Desweiteren scheint die 21 eine Rolle zu spielen (Annahme von mir).

Bye.

Gefunden via deterministischem von mir angepassten (256bit) Miller-Rabin-Test (https://de.wikipedia.org/wiki/Miller-Rabin-Test und https://rosettacode.org/wiki/Miller%E2%80%93Rabin_primality_test):

Code:
// gcc -Wall .c -o  -lcrypto -std=c99
#include
#include
#include
#include

#include

using namespace boost::multiprecision;

/*static char *qtoa(uint256_t n){
   static char buf[80];
   unsigned int i, j, m = 79;
   memset(buf, 0, 80);
   for (i = 256; i-- > 0;){
      int carry = !!(n & ((uint256_t)1 << i));
      for (j = 79; j-- > m + 1 || carry;){
         int d = 2*buf[j] + carry;
         carry = d > 9;
         buf[j] = carry ? d - 10 : d;
      }
      m = j;
   }
   for (i = 0; i < 78; i++){
      if (buf[i]){
         break;
      }
   }
   for (j = i; j < 79; j++){
      buf[j] += '0';
   }
   return buf + i;
}*/

// calcul a^n%mod
uint256_t power(uint256_t a, uint256_t n, uint256_t mod)
{
    uint256_t power = a;
    uint256_t result = 1;
    while (n)
    {
        if (n & 1)
            result = (result * power) % mod;

        power = (power * power) % mod;

        n >>= 1;
    }
    return result;
}

// n−1 = 2^s * d with d odd by factoring powers of 2 from n−1
bool witness(uint256_t n, uint256_t s, uint256_t d, uint256_t a)
{
    uint256_t x = power(a, d, n);
    uint256_t y;
    while (s) {
        y = (x * x) % n;
        if (y == 1 && x != 1 && x != n-1)
            return false;
        x = y;
        --s;
    }
    if (y != 1)
        return false;
    return true;
}

/*
 * if n < 1,373,653, it is enough to test a = 2 and 3;
 * if n < 9,080,191, it is enough to test a = 31 and 73;
 * if n < 4,759,123,141, it is enough to test a = 2, 7, and 61;
 * if n < 1,122,004,669,633, it is enough to test a = 2, 13, 23, and 1662803;
 * if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11;
 * if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13;
 * if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17;
 * if n < 318,665,857,834,031,151,167,461, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37.
 */

bool is_prime_mr(uint256_t n)
{
    if (((!(n & 1)) && n != 2 ) || (n < 2) || (n % 3 == 0 && n != 3))
        return false;
    if (n <= 3)
        return true;

    uint256_t d = n / 2;
    uint256_t s = 1;
    while (!(d & 1)) {
        d /= 2;
        ++s;
    }

    if (n < 1373653)
        return witness(n, s, d, 2) && witness(n, s, d, 3);
    if (n < 9080191)
        return witness(n, s, d, 31) && witness(n, s, d, 73);
    if (n < 4759123141)
        return witness(n, s, d, 2) && witness(n, s, d, 7) && witness(n, s, d, 61);
    if (n < 1122004669633)
        return witness(n, s, d, 2) && witness(n, s, d, 13) && witness(n, s, d, 23) && witness(n, s, d, 1662803);
    if (n < 2152302898747)
        return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) && witness(n, s, d, 7) && witness(n, s, d, 11);
    if (n < 3474749660383)
        return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) && witness(n, s, d, 7) && witness(n, s, d, 11) && witness(n, s, d, 13);
    if (n < 341550071728321)
        return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) && witness(n, s, d, 7) && witness(n, s, d, 11) && witness(n, s, d, 13) && witness(n, s, d, 17);

    return witness(n, s, d, 2) && witness(n, s, d, 3) && witness(n, s, d, 5) && witness(n, s, d, 7) && witness(n, s, d, 11) && witness(n, s, d, 13) && witness(n, s, d, 17) && witness(n, s, d, 19) && witness(n, s, d, 23) && witness(n, s, d, 29) && witness(n, s, d,
 31) && witness(n, s, d, 37);
}

void padstring(char hexstring[], char *buf){
   int l = strlen(hexstring);
   for (int i = 0; i < 64 - l; i++)
      buf[i] = '0';

   for (int i = 0; i < l; i++)
      buf[64 - l + i] = hexstring[i];
}

uint256_t string2int256(char hexstring[]){
   unsigned char val[32];
   for (int i = 0; i < 32; i++)
      sscanf(&hexstring[2*i], "%2hhx", &val[i]);

   uint256_t ret = 0;
   for (int i = 0; i < 32; i++){
      ret = ret << 8;
      ret = ret | val[i];
   }

   return ret;
}

int main(int argc, char *argv[]){
   char buf[128] = {0};
   padstring(argv[1], buf);
   uint256_t x = string2int256(buf);
   printf("%d\n", is_prime_mr(x));

   return 0;
}

Compilieren via (die benötigten Biblotheken vorausgesetzt):

Code:
g++ -Wall mr.c -o mr

Input sollte in Hexadezimal erfolgen:

Code:
echo "obase=16;ibase=10;957496696762772407663" | bc

und

Code:
./mr 33E7EF9CABBAF6C56F

ergibt 1.
Jump to: