# CRYPTO-1 Оценка: 10 ## Описание В данном задании необходимо провести криптоанализ криптосистемы, основанной на данной группе. [Файл №1](https://github.com/dered-cybersecurity/nto_2023/blob/main/1-offensive/CRYPTO-1/01f512e6-e437-40bb-8a6a-d31576abf83f_medium_task.sage) [Файл №2](https://github.com/dered-cybersecurity/nto_2023/blob/main/1-offensive/CRYPTO-1/8cc2c71b-6aed-451b-b346-fa1bee0501a1_hashed.txt) ## Решение В данном задании необходимо произвести обратную разработку кода, понять, какой алгоритм шифрования представлен. После этого обратить внимание на то, что шифрование нестойкое и может решиться простым перебором. Участникам предоставлялось условие задачи на языке программирования python: ```python from flag import flag from sage.all import * class DihedralCrypto: def __init__(self, order: int) -> None: self.__G = DihedralGroup(order) self.__order = order self.__gen = self.__G.gens()[0] self.__list = self.__G.list() self.__padder = 31337 def __pow(self, element, exponent: int): try: element = self.__G(element) except: raise Exception("Not Dihedral rotation element") answer = self.__G(()) aggregator = element for bit in bin(int(exponent))[2:][::-1]: if bit == '1': answer *= aggregator aggregator *= aggregator return answer def __byte_to_dihedral(self, byte: int): return self.__pow(self.__gen, byte * self.__padder) def __map(self, element): return self.__list.index(element) def __unmap(self, index): return self.__list[index] def hash(self, msg): answer = [] for byte in msg: answer.append(self.__map(self.__byte_to_dihedral(byte))) return answer if __name__ == "__main__": dihedral = DihedralCrypto(1337) answer = dihedral.hash(flag) with open('hashed','w') as f: f.write(str(answer)) ``` Для решения данного задания можно было воспользоваться перебором, шифруя каждый байт отдельно и сравнивая с зашифрованным байтом вывода программы: ```python D = DihedralCrypto(31337) # Инициализируем класс, который будет шифровать answer = '' # инициализируем ответ на задачу for encrypted_byte in hashed: #пробегаем по всем зашифрованным байтам for i in range(256): # пробегаем по всем возможным байтам if encrypted_byte == D.hash(bytes([i])[0]: # сравниваем зашифрованный байт и зашифрованный байт ответа answer += chr(i) print(answer) # выводим ответ ```