CTF ТАСК ПО КРИПТОГРАФИИ
Описание
Поток гениальных мыслей захлестнул меня, да так, что я реализовал этот гениальный шифр с нелинейным прямым распадом.
внутири зип в котором:
=CIPHER.PY=
import numpy as np
import random
class Cipher:
def __init__(self, polynom, seed=None):
self.seed = seed if seed else self.generate_seed()
self.state = np.array(self.seed, dtype=np.uint8)
if any(t >= len(self.seed) for t in polynom):
raise ValueError(f"Error: the index in the polynomial is out of bounds (maximum {len(self.seed) - 1})")
self.polynom = np.array(polynom, dtype=np.uint8)
def step(self):
feedback = np.bitwise_xor.reduce(self.state[self.polynom])
output = self.state[-1]
self.state[1:] = self.state[:-1]
self.state[0] = feedback
return output
def generate_keystream(self, length):
return [self.step() for _ in range(length)]
def generate_seed(self, size=32):
return [random.randint(0, 1) for _ in range(size)]
def text_to_bits(self, text):
return [int(b) for char in text for b in format(ord(char), '08b')]
def bits_to_hex(self, bits):
hex_str = hex(int(''.join(map(str, bits)), 2))[2:]
return hex_str.zfill(len(bits) // 4)
def xor_bits(self, data_bits, keystream):
return [data_bits[i] ^ keystream[i] for i in range(len(data_bits))]
def encrypt(self, text):
data_bits = self.text_to_bits(text)
keystream = self.generate_keystream(len(data_bits))
encrypted_bits = self.xor_bits(data_bits, keystream)
return self.bits_to_hex(encrypted_bits)
=ENCODER.PY=
from cipher import *
numbers = input("Enter the secret numbers: ").split()
polynom = [int(num) for num in numbers]
flag = "DUCKERZ{false_flag}"
cipher = Cipher(polynom)
ciphertext = cipher.encrypt(flag)
with open('output.txt', 'w') as file:
file.write(f"seed: {cipher.seed}\n")
file.write(f"Encrypted: {ciphertext}")
=OUTPUT.TXT=
seed: [1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0]
Encrypted: 0a9e47b25066fedf5d59d26b0701223e3f1010c84ac95f51021bb0242f833480797984c4f5c33d0cc9aa9bc5654be281f9b72595dbacc309e1deea7f174858e849d31df30dea39f1