2025 [11] Хэширование

Сотрудник компании «DC-Крипто» забыл пароль от доступа к ресурсам компании. В базе данных удалось получить хеш-значение строки его пароля:

06a9a488671b09fad7b86e4458454f4e

Из внутренней документации известно, что для получения хеш-значения в компании используется собственный упрощённый алгоритм хеширования, использующий для подмешивания «соль» – константная символьная строка, добавляемая к хешируемой строке по некоторому правилу.

Исходный код функций хеширования представлен в листинге.

 

Листинг 1. Исходный код функций хеширования

Python

# Нормализует соль до ровно 4 символов

def normalize_salt(salt: str) -> str:

    if len(salt) == 0:

        return ''

    if len(salt) < 4:

        return ''.join(salt[i % len(salt)] for i in range(4))

    else:

        return salt[:4]

 

# Добавляет соль в пароль

def weave_salt(password: str, salt: str) -> str:

    salt = normalize_salt(salt)

    half = len(password) // 2

    return salt[0:2] + password[:half] + salt[1:3] + password[half:] + salt[2:4]

 

# Вычисляет хеш строки

def custom_hash(s: str) -> str:

    h = [0xFE, 0xCA, 0xBE, 0xBA, 0xAD, 0xDE, 0xEF, 0xBE]

    for c in s:

        h = [ (h[i] * 65537 * (i+1) + ord(c)) % (2**16) for i in range(len(h))]

 

    hash_str = ''.join(f"{x:04x}" for x in h)

    hash_4 = s[:2] + s[-2:]

    salt = ''.join(f"{ord(ch):02x}" for ch in hash_4)

    return hash_str[:-8] + salt

С++

#include <iostream>

#include <string>

#include <sstream>

#include <iomanip>

using namespace std;

 

// Функция normalize_salt – нормализует соль до 4 символов

string normalize_salt(string salt) {

    if (salt.length() == 0) {

        return "";

    }

    if (salt.length() < 4) {

        string result = "";

        for (int i = 0; i < 4; i++) {

            result += salt[i % salt.length()];

        }

        return result;

    }

    else {

        return salt.substr(0, 4);

    }

}

 

// Функция weave_salt – добавляет соль в пароль

string weave_salt(string password, string salt) {

    salt = normalize_salt(salt);

    int half = password.length() / 2;

    string result = "";

    result += salt.substr(0, 2);

    result += password.substr(0, half);

    result += salt.substr(1, 2);

    result += password.substr(half);

    result += salt.substr(2, 2);

    return result;

}

 

// Функция custom_hash – вычисляет хеш строки

string custom_hash(string s) {

    unsigned int h[8] = { 0xFE, 0xCA, 0xBE, 0xBA, 0xAD, 0xDE, 0xEF, 0xBE };

    for (char c : s) {

        for (int i = 0; i < 8; i++) {

            h[i] = (h[i] * 65537 * (i + 1) + (unsigned int)c) % 65536;

        }

    }

    stringstream hash_stream;

    for (int i = 0; i < 8; i++) {

        hash_stream << hex << setw(4) << setfill('0') << h[i];

    }

    string hash_str = hash_stream.str();

    string hash_4 = s.substr(0, 2) + s.substr(s.length() - 2);

    string salt_hex = "";

    for (char ch : hash_4) {

        stringstream ss;

        ss << hex << setw(2) << setfill('0') << (int)(unsigned char)ch;

        salt_hex += ss.str();

    }

    string final_hash = hash_str.substr(0, hash_str.length() - 8) + salt_hex;

    return final_hash;

}

 

Сформируйте значение хеш-строки для нового пароля пользователя – «newpassword», при условии, что значение «соли» для всех хеш-строк одинаковое.

В ответе укажите значение хеш-строки и значение «соли».

 

Показать подсказку

Показать решение

Показать ответ




<< Назад в раздел (Все задания)

Ваше сообщение получено!