Архив задач

Хеш-значения

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



int CheckUser(char* username,

char* password)

{

for (int i=0; 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

{

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=31;

const int Nstr=32;

const int Hsize=Nstr/2;

unsigned short int hash=0, p_pow=1;

char buf[Nstr+1]={0};

int size=0;

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

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

{

buf[size]=str[size];

size++;

}


for (int i=size; i

{

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

}

for (int i=0; i

{

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

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

p_pow*=p;

}

res[Hsize]='\0';

return res;

}


В базе пользователей присутствуют следующие записи:

admin rUZxHUUfw9oJSFNm

user vYhkB2klurVYYPtq

operator pS8HIUqmrJ60ZOrk

manager ng3JfGZ0TQzmCtS5

root sQUsDRwnsAf90HN0

В ходе проверки администратор выявил случаи возможного нарушения политики безопасности.


Определите:

1.  пользователей, для которых были обнаружены нарушения;

2.  причины возникновения нарушений.