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», при условии, что значение «соли» для всех хеш-строк одинаковое.
В ответе укажите значение хеш-строки и значение «соли».