Архив задач

Хеш-значения 11 класс

 Политика безопасности ОС не позволяет задавать для учетных записей пользователей пароли, совпадающие с их именами. Для этого перед добавлением нового пользователя в базу вызывается функция CheckUser(). При ее успешном выполнении (возвращаемое значение = 0) в базу добавляется новая запись, содержащая имя учетной записи пользователя и хеш-значение пароля, полученное с помощью функции Hash().

Си

int CheckUser(char* username,

char* password)

{

for (int i=0; i<strlen(username); i++)

{

if ( (username[i] >= 0x30 &&
username[i] <= 0x39) ||

(username[i] >= 0x41 &&
username[i] <= 0x5A) ||

(username[i] >= 0x61 &&
username[i] <= 0x7A)

)

continue;

else

return 1;

}

for(int i=0; i<strlen(password); i++)

{

if (password[i] >= 0x23 &&
password[i] <= 0x7D)

continue;

else

return 1;

}

if (stricmp(username, password) != 0)

return 0;

else

return 1;

}

const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";


char* Hash(char* str)

{

const int p = 19;

int Nstr = 32;

const int Hsize = Nstr / 2;

unsigned short int hash = 0, p_pow = 1;

char *buf = new char[Nstr + 1];

int size = 0;

char *res = new char[Hsize + 1];

while (str[size] != '\0' && size < Nstr)

{

buf[size] = str[size];

size++;

}

for (int i = size; i < Nstr; i++)

{

buf[i] = '0' + (i - size);

}

buf[Nstr] = '\0';

for (int i = 0; i < Nstr; i+=2)

{

hash += (buf[i] - '0' + 1) * p_pow;

p_pow *= p;

hash += (buf[i + 1] - '0' + 1) * p_pow;

p_pow *= p;

res[i / 2] = letters[hash % strlen(letters)];

}

res[Hsize] = '\0';

return res;

}

Администратор периодически выполняет проверку базы пользователей и блокирует учетные записи, хеш-значения от имени которых совпадают с хеш-значениями их паролей. Приведите пример имени и пароля для учетной записи, которая удовлетворяет заданной политике безопасности, но будет заблокирована администратором в ходе проверки, и обоснуйте почему.