Post
Topic
Board Development & Technical Discussion
Re: Pollard's kangaroo ECDLP solver
by
alek76
on 20/05/2020, 22:54:59 UTC
Hi, i'm having some issues saving the private key once found, it does not get saved?

It does not save. Are you compiling your own version? If so, I can give you a code snippet to add to source file that will generate a saved file with pub and priv key.

No i'm just using the release version, ah that's a little concerning, would be nice to save in case of a power outage, crash or accidental cmd close.
It looks something like this:
in Kangaroo.cpp
Code:
bool Kangaroo::output(string msg) {
 
  FILE *f = stdout;
  f = fopen("Result.txt", "a");
   
  if (f == NULL) {
  printf("[error] Cannot open file Result.txt for writing! \n");
  f = stdout;
  return false;
  }
  else {
  fprintf(f, "%s\n", msg.c_str());
  fclose(f);
  printf("[i] Success saved to file Result.txt\n");
  return true;
  }
}
and
Code:
bool  Kangaroo::CheckKey(Int d1,Int d2,uint8_t type) {

  // Resolve equivalence collision

  if(type & 0x1)
    d1.ModNegK1order();
  if(type & 0x2)
    d2.ModNegK1order();

  Int pk(&d1);
  pk.ModAddK1order(&d2);

  Point P = secp->ComputePublicKey(&pk);

  if(P.equals(keyToSearch)) {
    // Key solved   
#ifdef USE_SYMMETRY
    pk.ModAddK1order(&rangeWidthDiv2);
#endif
    pk.ModAddK1order(&rangeStart);   
    Point PR = secp->ComputePublicKey(&pk);
    ::printf("\nKey#%2d [%dN]Pub:  0x%s \n",keyIdx,type,secp->GetPublicKeyHex(true,keysToSearch[keyIdx]).c_str());
    // Save Priv
std::string prvkey = pk.GetBase16().c_str();
bool save_pk = output(prvkey + string(":") + string("04") + PR.x.GetBase16().c_str() + PR.y.GetBase16().c_str() );
if( PR.equals(keysToSearch[keyIdx]) ) {
      ::printf("       Priv: 0x%s \n",pk.GetBase16().c_str());
    } else {
      ::printf("       Failed !\n");
      ::printf("       Priv: 0x%s \n",pk.GetBase16().c_str());
      return false;
    }
    return true;
  }

  if(P.equals(keyToSearchNeg)) {
    // Key solved
    pk.ModNegK1order();
#ifdef USE_SYMMETRY
    pk.ModAddK1order(&rangeWidthDiv2);
#endif
    pk.ModAddK1order(&rangeStart);
    Point PR = secp->ComputePublicKey(&pk);
    ::printf("\nKey#%2d [%dS]Pub:  0x%s \n",keyIdx,type,secp->GetPublicKeyHex(true,keysToSearch[keyIdx]).c_str());
// Save Priv
std::string prvkeyNeg = pk.GetBase16().c_str();
bool save_pk = output(prvkeyNeg + string(":") + string("04") + PR.x.GetBase16().c_str() + PR.y.GetBase16().c_str() );
if(PR.equals(keysToSearch[keyIdx]) ) {
      ::printf("       Priv: 0x%s \n",pk.GetBase16().c_str());
    } else {
      ::printf("       Failed !\n");
      ::printf("       Priv: 0x%s \n",pk.GetBase16().c_str());
      return false;
    }
    return true;
  }

  return false;

}
Add in Kangaroo.h
Code:
bool output(std::string msg);
But I do not need this, I use my version. Where the problem with RAM is solved, can change the number of files to save DP. But the problems with disk space have begun Smiley
GPU #0 Tesla P100-PCIE-16GB (56x64 cores) Grid(112x128) (177.0 MB used; GRP size: 128)

Maybe it will be on Github.