main.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /*
  2. * Спасибо PurpleI2P Project за активное содействие в написании этого кода.
  3. * notabug.org/acetone/SimpleYggGen-CPP
  4. *
  5. * acetone, lialh4 (c) GPLv3
  6. *
  7. */
  8. #include <openssl/evp.h> // библиотека OpenSSL
  9. #include <openssl/sha.h>
  10. #include <iostream> // вывод на экран
  11. #include <iomanip> // форматированный вывод строк
  12. #include <ctime> // системное время
  13. #include <bitset> // побитовое чтение
  14. #include <cstring> // memcmp - побайтовое сравнение
  15. #include <vector>
  16. #define KEYSIZE 32
  17. ////////////////////////////////////////////////// Заставка и прочая вода
  18. const char randomtable[90] =
  19. {
  20. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  21. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
  22. 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  23. 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
  24. 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
  25. 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  26. 'Y', 'Z', '!', '@', '(', ')', '/', '-', '#', '+',
  27. '$', '%', '^', '&', '*', '`', '~', '>', '<', '?',
  28. '{', '}', '[', ']', ';', ':', '_', '=', '|', '\''
  29. };
  30. std::string getrandom(int entropy, unsigned int size_of_line)
  31. {
  32. std::string random_value;
  33. while(random_value.size() < size_of_line)
  34. {
  35. random_value += randomtable[(std::rand() % entropy)];
  36. }
  37. random_value.shrink_to_fit();
  38. return random_value;
  39. }
  40. void intro()
  41. {
  42. srand(time(NULL));
  43. int rv = 60;
  44. std::cout << std::endl
  45. << "| SimpleYggGen C++ 1.0-headhunter |" << getrandom(2,44) << std::endl
  46. << "| OpenSSL inside: x25519 -> sha512 |" << getrandom(rv, 2) << " " << getrandom(rv, 5) << " " << getrandom(rv, 6) << " " << getrandom(rv, 5) << " " << getrandom(rv, 2) << std::endl
  47. << "| notabug.org/acetone/SimpleYggGen-CPP |" << getrandom(rv, 2) << " " << getrandom(rv,13) << " " << getrandom(rv, 6) << " " << getrandom(rv, 5) << " " << getrandom(rv, 10) << std::endl
  48. << "| |" << getrandom(rv, 2) << " " << getrandom(rv, 5) << " " << getrandom(rv, 5) << " " << getrandom(rv, 3) << " " << getrandom(rv, 2) << std::endl
  49. << "| developers: lialh4, acetone, orignal |" << getrandom(rv, 10) << " " << getrandom(rv,13) << " " << getrandom(rv, 5) << " " << getrandom(rv, 6) << " " << getrandom(rv, 2) << std::endl
  50. << "| GPLv3 (c) 2020 |" << getrandom(rv, 2) << " " << getrandom(rv, 5) << " " << getrandom(rv, 5) << " " << getrandom(rv, 2) << std::endl
  51. << "| " << __DATE__ << " " << __TIME__ << " |" << getrandom(2,44) << std::endl;
  52. }
  53. ////////////////////////////////////////////////// Суть вопроса
  54. struct BoxKeys
  55. {
  56. uint8_t PublicKey[KEYSIZE];
  57. uint8_t PrivateKey[KEYSIZE];
  58. };
  59. BoxKeys getKeyPair(void)
  60. {
  61. BoxKeys keys;
  62. size_t len = KEYSIZE;
  63. EVP_PKEY_CTX * Ctx;
  64. EVP_PKEY * Pkey = nullptr;
  65. Ctx = EVP_PKEY_CTX_new_id (NID_X25519, NULL);
  66. EVP_PKEY_keygen_init (Ctx);
  67. EVP_PKEY_keygen (Ctx, &Pkey);
  68. EVP_PKEY_get_raw_public_key (Pkey, keys.PublicKey, &len);
  69. EVP_PKEY_get_raw_private_key (Pkey, keys.PrivateKey, &len);
  70. EVP_PKEY_CTX_free(Ctx);
  71. EVP_PKEY_free(Pkey);
  72. return keys;
  73. }
  74. int Ones(unsigned char HashValue[SHA512_DIGEST_LENGTH])
  75. {
  76. unsigned char byte;
  77. bool done;
  78. int lOnes=0;
  79. int nBits=0;
  80. unsigned char temp[SHA512_DIGEST_LENGTH];
  81. memset(temp, 0, sizeof(temp));
  82. int z = 0;
  83. std::vector<std::bitset<8>> bytes;
  84. for(auto i = 0; i < SHA512_DIGEST_LENGTH; i++)
  85. {
  86. bytes.push_back(HashValue[i]);
  87. }
  88. for(auto bits : bytes){
  89. for(int i = 7; i >= 0; --i)
  90. {
  91. if(bits[i] == 1 && !done)
  92. {
  93. ++lOnes;
  94. continue;
  95. }
  96. if(bits[i] == 0 && !done)
  97. {
  98. done = true;
  99. continue;
  100. }
  101. byte = (byte << 1) | (bits[i] > 0 ? 1 : 0);
  102. ++nBits;
  103. if(nBits >= 8)
  104. {
  105. nBits = 0;
  106. temp[++z] = byte;
  107. }
  108. }
  109. }
  110. return lOnes;
  111. }
  112. void miner()
  113. {
  114. unsigned char HashValue[SHA512_DIGEST_LENGTH];
  115. uint8_t PublicKeyBest[KEYSIZE];
  116. uint8_t PrivateKeyBest[KEYSIZE];
  117. // ------------------------ ОСНОВНОЙ ЦИКЛ
  118. int bitcount = 9; // переменная для хранения наибольшего количества единиц (не с нуля начинаем)
  119. int totalcount= 0; // счетчик основного цикла
  120. bool count50 = false; // счетчики для отображения прогресса
  121. bool count100 = true;
  122. bool count500 = true;
  123. while(true)
  124. {
  125. BoxKeys myKeys = getKeyPair();
  126. SHA512(myKeys.PublicKey, KEYSIZE, HashValue);
  127. int newones = Ones(HashValue);
  128. if(newones > bitcount)
  129. {
  130. bitcount = newones;
  131. for(int i = 0; i < KEYSIZE; ++i)
  132. {
  133. PublicKeyBest[i] = myKeys.PublicKey[i];
  134. PrivateKeyBest[i] = myKeys.PrivateKey[i];
  135. }
  136. std::cout << "\nAddress: [2" << std::setw(2) << std::setfill('0') << std::hex << bitcount << ":...]" << std::endl;
  137. std::cout << "PublicKey: ";
  138. for(int i = 0; i < 32; ++i)
  139. {
  140. std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)PublicKeyBest[i];
  141. }
  142. std::cout << std::endl;
  143. std::cout << "PrivateKey: ";
  144. for(int i = 0; i < 32; ++i)
  145. {
  146. std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)PrivateKeyBest[i];
  147. }
  148. std::cout << std::endl;
  149. count50 = false;
  150. count100 = true;
  151. count500 = true;
  152. totalcount = 0;
  153. }
  154. ++totalcount;
  155. if(totalcount % 50000 == 0 && !count50)
  156. {
  157. std::cerr << "50k ";
  158. std::cerr.flush();
  159. count50 = true;
  160. count100 = false;
  161. continue;
  162. }
  163. if(totalcount % 100000 == 0 && !count100)
  164. {
  165. std::cerr << "100k ";
  166. std::cerr.flush();
  167. count100 = true;
  168. count500 = false;
  169. continue;
  170. }
  171. if(totalcount % 500000 == 0 && !count500)
  172. {
  173. std::cerr << "500k ";
  174. std::cerr.flush();
  175. count500 = true;
  176. continue;
  177. }
  178. if(totalcount % 500000 == 0)
  179. {
  180. std::cerr << "# ";
  181. std::cerr.flush();
  182. }
  183. }
  184. }
  185. // ------------------------------------------------------
  186. int main()
  187. {
  188. intro();
  189. miner();
  190. }