Do bài này khác với bài trước ở 2 chỗ, 1 là nó dùng mode CTR, 2 là mỗi lần lặp nó sẽ tạo key khác, do đó để làm bài này thì bắt buộc phải cryptanalysis thôi :v
Đầu tiên, mình dùng z3 để symbolic xem từ plaintext qua đến ciphertext nó sẽ thực hiện như thế nào. Có 2 thứ để symbolic:Symbolic các round_keys -> đặt từ k0 -> k6:
def _expand_key(self, key: bytes) -> None:
keys = BitVecs(' '.join([f'k{i}' for i in range(self.rounds)]), 8)
self._round_keys = keys
Symbolic 2 hàm sbox và permutation thành 1 hàm P nào đó (tí nữa soi 2 hàm này sau :v), tức khi này P(a) = self.permutation(self.sbox(a)):
P = Function('P',BitVecSort(8), BitVecSort(8))
def _f(self, l: int, r: int, key: int) -> int: