# 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) # выводим ответ
```