int enc_seed = 0;
int generate_seed_from_name( const wchar_t* name )
{
wchar_t v2 = 0; // [rsp+20h] [rbp-28h]
int v3 = 0; // [rsp+24h] [rbp-24h]
int v4 = 0; // [rsp+28h] [rbp-20h]
v4 = 0;
v3 = 0;
while ( v3 < 0x1E && *name )
{
v2 = *name;
if ( iswctype( *name, 0x103u ) )
{
v4 += towupper( v2 );
++v3;
}
++name;
}
return v4;
}
int calc_seed()
{
enc_seed = ( 0x41C64E6D * enc_seed + 0x3039 ) % (int)0x80000000;
return enc_seed;
}
const char ch[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int R10( std::string s ) // перевод строки в 10-ое число
{
int base = 1,
res = 0;
while ( s.size() )
{
res += base * ( (int)s[s.size() - 1] - '0' );
s.resize( s.size() - 1 );
base <<= 1;
}
return res;
}
std::string R16( int n ) // перевод числа в 16 представление
{
std::string s;
while ( n )
{
s.insert( s.begin(), ch[n % 16] );
n /= 16;
}
return s;
}
void generate_key()
{
std::cout << "Key: ";
for ( int i = 0; i < 4; ++i )
{
std::string r2_str;
for ( int j = 0; j < 7; ++j )
{
int op = ( calc_seed() >> 6 ) & 1;
r2_str += std::to_string( op ); // Создаём строку с двоичным числом
}
std::cout << R16( R10( r2_str ) ); // Переводим строку с двоичным числом в шестнадцатеричное число
if ( i != 3 )
std::cout << "-"; // Добавляем разделитель
}
std::cout << std::endl;
}
int main()
{
std::wstring name;
std::wcout << "Enter name: ";
std::getline( std::wcin, name );
enc_seed = generate_seed_from_name( name.c_str() ); // Генерируем сид из имени
calc_seed();
generate_key();
_getch();
}