def get_polyalphabetic_decryption(data: str, key: str) -> dict:
    """
    Vigenère cipher. Part for decryption.
    For decryption (operate with unicode code): m[i] = (c[i] + n - k[i]) mod n
    Where n = 1114112 (power of UNICODE space), m[i] - char of message, c[i] - char of ciphertext, k[i] - char of key_material (key != key_material)
    The structure of the function is similar to the encryption function described above.
    """
    key_material = str()
    while len(key_material) < len(data):
        key_material += key
    key_material = key_material[:len(data)]
    decrypted_data_unicode_list = list()
    decrypted_data_string = str()
    for i in range(len(data)):  # m[i] = (c[i] + n - k[i]) mod 1114112
        decrypted_data_unicode_list.append((ord(data[i]) + 1114112 - ord(key_material[i])) % 1114112)
        decrypted_data_string += chr((ord(data[i]) + 1114112 - ord(key_material[i])) % 1114112)
    return {"decrypted_string": decrypted_data_string, "decrypted_character_codes": decrypted_data_unicode_list}