diff --git a/Makefile b/Makefile index ee25ae1..ce76ca5 100644 --- a/Makefile +++ b/Makefile @@ -23,11 +23,11 @@ ifneq (, $(findstring mingw, $(SYS))$(findstring cygwin, $(SYS))) else ifeq ($(STATIC),yes) LIBPATH = /usr/lib/$(SYS) - LDLIBS = -pthread $(LIBPATH)/libcrypto.a -lpthread -ldl + LDLIBS = -pthread $(LIBPATH)/libsodium.a -lpthread -ldl else ifeq ($(STATIC),full) LIBPATH = /usr/lib/$(SYS) LDFLAGS += -static - LDLIBS = -pthread $(LIBPATH)/libcrypto.a -lpthread -ldl + LDLIBS = -pthread $(LIBPATH)/libsodium.a -lpthread -ldl else LDLIBS = -lcrypto -lpthread endif diff --git a/Makefile.mingw b/Makefile.mingw index 581e685..47ccf9c 100644 --- a/Makefile.mingw +++ b/Makefile.mingw @@ -2,7 +2,7 @@ WINDRES = windres SYG_RC = windows/resource.rc LDFLAGS += -Wl,-Bstatic -LDLIBS = -static-libgcc -lcrypto -lws2_32 -lpthread +LDLIBS = -static-libgcc -lsodium -lws2_32 -lpthread SYG_OBJS += $(patsubst %.rc,obj/%.o,$(SYG_RC)) diff --git a/README.md b/README.md index 89fffdf..bfae40d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ * Install required packages ```bash -pacman -S make mingw-w64-x86_64-gcc mingw-w64-x86_64-openssl +pacman -S make mingw-w64-x86_64-gcc mingw-w64-x86_64-libsodium ``` * Compile application @@ -22,7 +22,7 @@ make * Install required packages ``` -sudo apt-get install make g++ libssl-dev +sudo apt-get install make g++ libsodium-dev ``` * Compile application diff --git a/sygcpp.cpp b/sygcpp.cpp index fe9fe61..bb00e16 100644 --- a/sygcpp.cpp +++ b/sygcpp.cpp @@ -10,9 +10,6 @@ * */ -#include // библиотека OpenSSL -#include -#include #include // вывод на экран #include #include @@ -25,24 +22,36 @@ #include // для паузы в заставке #include +// криптография +#include +#include +#include + +// преобразование в IPv6 +#ifdef _WIN32 + #include +#else + #include +#endif + ////////////////////////////////////////////////// Заставка void intro() { std::cout << std::endl - << " +----------------------------------------------------------------------------+" << std::endl - << " | SimpleYggGen C++ 1.1-train |" << std::endl - << " | OpenSSL inside: x25519 -> sha512 |" << std::endl - << " | notabug.org/acetone/SimpleYggGen-CPP |" << std::endl - << " | |" << std::endl - << " | developers: acetone, lialh4, orignal, R4SAS |" << std::endl - << " | GPLv3 (c) 2020 |" << std::endl + << " +--------------------------------------------------------------------------+" << std::endl + << " | SimpleYggGen C++ 2.0-outrunning |" << std::endl + << " | OpenSSL inside: x25519 -> sha512 |" << std::endl + << " | notabug.org/acetone/SimpleYggGen-CPP |" << std::endl + << " | |" << std::endl + << " | developers: acetone, lialh4, orignal, R4SAS, Vort |" << std::endl + << " | GPLv3 (c) 2020 |" << std::endl << " +"; - for(int i = 0; i < 76; ++i) + for(int i = 0; i < 74; ++i) { std::cout << "-"; std::cout.flush(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } std::cout << "+" << std::endl; } @@ -59,8 +68,9 @@ int conf_high = 0; std::string conf_search; std::string log_file; +std::chrono::time_point startTime; uint64_t totalcount = 0; // счетчик основного цикла -uint64_t totalcountfortune = 0; // счетчик нахождений +uint64_t totalcountfortune = 0; // счетчик найденного bool newline = true; // используется для вывода счетчика int config() @@ -160,25 +170,15 @@ struct BoxKeys BoxKeys getKeyPair() { BoxKeys keys; - size_t len = KEYSIZE; - - EVP_PKEY_CTX * Ctx; - EVP_PKEY * Pkey = nullptr; - Ctx = EVP_PKEY_CTX_new_id (NID_X25519, NULL); - - EVP_PKEY_keygen_init (Ctx); - EVP_PKEY_keygen (Ctx, &Pkey); - - EVP_PKEY_get_raw_public_key (Pkey, keys.PublicKey, &len); - EVP_PKEY_get_raw_private_key (Pkey, keys.PrivateKey, &len); - - EVP_PKEY_CTX_free(Ctx); - EVP_PKEY_free(Pkey); - + randombytes(keys.PrivateKey, KEYSIZE); + keys.PrivateKey[0] &= 248; + keys.PrivateKey[KEYSIZE - 1] &= 127; + keys.PrivateKey[KEYSIZE - 1] |= 64; + crypto_scalarmult_curve25519_base(keys.PublicKey, keys.PrivateKey); return keys; } -int getOnes(const unsigned char HashValue[SHA512_DIGEST_LENGTH]) +int getOnes(const unsigned char HashValue[crypto_hash_sha512_BYTES]) { bool done = false; int lOnes = 0; // кол-во лидирующих единиц @@ -200,7 +200,7 @@ int getOnes(const unsigned char HashValue[SHA512_DIGEST_LENGTH]) return lOnes; } -std::string getAddress(unsigned char HashValue[SHA512_DIGEST_LENGTH]) +std::string getAddress(unsigned char HashValue[crypto_hash_sha512_BYTES]) { // функция "портит" массив хэша, т.к. копирование массива не происходит int lErase = getOnes(HashValue) + 1; // лидирующие единицы и первый ноль @@ -228,44 +228,15 @@ std::string getAddress(unsigned char HashValue[SHA512_DIGEST_LENGTH]) } } - std::string address; - bool shortadd = false; - std::stringstream ss(address); - ss << 0x02 << std::setw(2) << std::setfill('0') << std::hex << lErase - 1 << ":"; - // 2 - константа подсети Yggdrasil, второй байт - кол-во лидирующих единиц в хешэ + uint8_t ipAddr[16]; + ipAddr[0] = 0x02; + ipAddr[1] = lErase - 1; + for (int i = 0; i < 14; ++i) + ipAddr[i + 2] = HashValue[i]; - for(int i = 0; i < 14; ++i) - { - if(i % 2 == 0) // если работаем с первым байтом секции - { - if(HashValue[i] == 0) // если байт нулевой - { - if(HashValue[i+1] == 0) // если следующий байт нулевой - { - if(HashValue[i+2] == 0 && i+2 < 13 && HashValue[i+3] == 0 && i+3 <= 13 && !shortadd) - { - ss << ":"; - i += 3; - shortadd = true; - continue; - } else { - ss << "0"; - ++i; - } - } - } else { - ss << std::hex << (int)HashValue[i]; - } - } else { // если работаем со вторым байтом секции - if(HashValue[i-1] == 0) // если предыдущий первый байт был нулевой, нули сокращаем - ss << std::hex << (int)HashValue[i]; - else - ss << std::setw(2) << std::setfill('0') << std::hex << (int)HashValue[i]; - } - if(i != 13 && i % 2 != 0) // не выводим двоеточие в конце адреса и после первого байта секции - ss << ":"; - } - return ss.str(); + char ipStrBuf[46]; + inet_ntop(AF_INET6, ipAddr, ipStrBuf, 46); + return std::string(ipStrBuf); } void getConsoleLog() @@ -281,8 +252,14 @@ void getConsoleLog() } std::time_t realtime = std::time(NULL); - std::cout << " # count [ " << std::dec << std::setfill('.') << std::setw(19) << totalcount << " ] [ " - << std::setw(15) << totalcountfortune << " ] " << std::asctime(std::localtime(&realtime)); + auto stopTime = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(stopTime - startTime); + startTime = stopTime; + float khs = 250000000.0 / duration.count(); + std::cout << " [ " << std::setw(7) << std::fixed << std::setprecision(3) << std::setfill('_') << khs << " kH/s ] " + << "T: [ " << std::setfill('_') << std::left << std::dec << std::setw(16) << totalcount << " ] " + << "F: [ " << std::right << std::setw(3) << totalcountfortune << " ] " + << std::asctime(std::localtime(&realtime)); std::cout.flush(); } mtx.unlock(); @@ -290,15 +267,16 @@ void getConsoleLog() void highminer() { - unsigned char HashValue[SHA512_DIGEST_LENGTH]; + unsigned char HashValue[crypto_hash_sha512_BYTES]; uint8_t PublicKeyBest[KEYSIZE]; uint8_t PrivateKeyBest[KEYSIZE]; + startTime = std::chrono::high_resolution_clock::now(); while(true) { BoxKeys myKeys = getKeyPair(); - SHA512(myKeys.PublicKey, KEYSIZE, HashValue); + crypto_hash_sha512(HashValue, myKeys.PublicKey, KEYSIZE); int newones = getOnes(HashValue); if(newones > conf_high) // сохранение лучших ключей @@ -356,15 +334,15 @@ void highminer() void nameminer() { - unsigned char HashValue[SHA512_DIGEST_LENGTH]; + unsigned char HashValue[crypto_hash_sha512_BYTES]; uint8_t PublicKeyBest[KEYSIZE]; uint8_t PrivateKeyBest[KEYSIZE]; - + startTime = std::chrono::high_resolution_clock::now(); while(true) { BoxKeys myKeys = getKeyPair(); - SHA512(myKeys.PublicKey, KEYSIZE, HashValue); + crypto_hash_sha512(HashValue, myKeys.PublicKey, KEYSIZE); std::string tempstr = getAddress(HashValue); if(tempstr.find(conf_search.c_str()) != std::string::npos) // сохранение найденных ключей