diff --git a/src/tea3/cli.py b/src/tea3/cli.py index a9b15b1..5c66b5b 100644 --- a/src/tea3/cli.py +++ b/src/tea3/cli.py @@ -12,12 +12,12 @@ from tea3.precompute import run_precompute_cli, run_load_cli def run_classic_cli(): - print("\nR registers are indexed 0–7; bits within each register are 0–7.") + print("\nR registers are indexed 0-7; bits within each register are 0-7.") print("Enter -1 to print all registers, or all bits.") - steps = prompt_int("How many steps do you want to run? (1–100): ", 1, 100) - reg = prompt_int("Which R register do you want to inspect? (-1 or 0–7): ", -1, 7) - bit = prompt_int("Which bit of that register? (-1 or 0–7): ", -1, 7) + steps = prompt_int("How many steps do you want to run? (1-100): ", 1, 100) + reg = prompt_int("Which R register do you want to inspect? (-1 or 0-7): ", -1, 7) + bit = prompt_int("Which bit of that register? (-1 or 0-7): ", -1, 7) print("-" * 50) @@ -42,12 +42,12 @@ def run_classic_cli(): print("Done.") def run_advanced_cli(): - print("\nR registers are indexed 0–7; bits within each register are 0–7.") - print("x and r registers are indexed 0–4; bits within each register are 0–7.") + print("\nR registers are indexed 0-7; bits within each register are 0-7.") + print("x and r registers are indexed 0-4; bits within each register are 0-7.") - steps = prompt_int("How many steps do you want to run? (1–100): ", 1, 100) - reg = prompt_int("Which R register do you want to inspect? (-1 or 0–7): ", -1, 7) - bit = prompt_int("Which bit of that register? (-1 or 0–7): ", -1, 7) + steps = prompt_int("How many steps do you want to run? (1-100): ", 1, 100) + reg = prompt_int("Which R register do you want to inspect? (-1 or 0-7): ", -1, 7) + bit = prompt_int("Which bit of that register? (-1 or 0-7): ", -1, 7) raw = input("Bits to set to 0 (space-separated): ").strip() zero_bits = raw.split() if raw else [] @@ -94,12 +94,12 @@ def run_exhaustive_cli(): family = prompt_choice("Your choice (1, 2, 3 or 4): ", {1, 2, 3, 4}) - print("\nR registers are indexed 0–7; bits within each register are 0–7.") + print("\nR registers are indexed 0-7; bits within each register are 0-7.") print("Enter -1 to print all bits in the chosen register.") - steps = prompt_int("How many steps? (1–100): ", 1, 100) - target_reg = prompt_int("Target register (0–7): ", 0, 7) - target_bit = prompt_int("Target bit (-1 or 0–7): ", -1, 7) + steps = prompt_int("How many steps? (1-100): ", 1, 100) + target_reg = prompt_int("Target register (0-7): ", 0, 7) + target_bit = prompt_int("Target bit (-1 or 0-7): ", -1, 7) print("-" * 50) @@ -117,13 +117,13 @@ def run_exhaustive_cli(): def run_variable_xor_cli(): - print("\nR registers are indexed 0–7; bits within each register are 0–7.") + print("\nR registers are indexed 0-7; bits within each register are 0-7.") print("Enter the bit positions to XOR, e.g. `0 1`.") - steps = prompt_int("How many steps? (1–100): ", 1, 100) - target_reg = prompt_int("Target register (0–7): ", 0, 7) + steps = prompt_int("How many steps? (1-100): ", 1, 100) + target_reg = prompt_int("Target register (0-7): ", 0, 7) bits_to_xor = prompt_list( - "Bits to XOR (0–7, separated by spaces, ranges with '-'): ", + "Bits to XOR (0-7, separated by spaces, ranges with '-'): ", item_name="bit", min_value=0, max_value=7, @@ -136,12 +136,12 @@ def run_variable_xor_cli(): print("Done.") def run_exhaustive_xor_cli(): - print("\nR registers are indexed 0–7; bits within each register are 0–7.") + print("\nR registers are indexed 0-7; bits within each register are 0-7.") print("This mode searches all XOR combinations of a given size.") - steps = prompt_int("How many steps? (1–100): ", 1, 100) - target_reg = prompt_int("Target register (0–7): ", 0, 7) - xor_size = prompt_int("Number of bits to XOR (2–8): ", 2, 8) + steps = prompt_int("How many steps? (1-100): ", 1, 100) + target_reg = prompt_int("Target register (0-7): ", 0, 7) + xor_size = prompt_int("Number of bits to XOR (2-8): ", 2, 8) print("-" * 50) @@ -154,9 +154,9 @@ def run_exhaustive_xor_cli(): def run_cube_attack_cli(model = None): print("\nCube attack search on TEA3 model to search for low-degree superpolys.") - rounds = prompt_int("How many rounds? (1–100): ", 1, 100) - target_reg = prompt_int("Target R register (0–7): ", 0, 7) - target_bit = prompt_int("Target bit of that register (0–7): ", 0, 7) + rounds = prompt_int("How many rounds? (1-100): ", 1, 100) + target_reg = prompt_int("Target R register (0-7): ", 0, 7) + target_bit = prompt_int("Target bit of that register (0-7): ", 0, 7) raw = input("Bits to set to 0: ").strip() fixed_zero_bits = raw.split() if raw else [] @@ -164,7 +164,7 @@ def run_cube_attack_cli(model = None): raw = input("Bits to set to 1: ").strip() fixed_one_bits = raw.split() if raw else [] - cube_size = prompt_int("Cube size (1–64): ", 1, 64) + cube_size = prompt_int("Cube size (1-64): ", 1, 64) print("\nSearch strategy:") print(" 1) Exhaustive") @@ -174,13 +174,13 @@ def run_cube_attack_cli(model = None): if strategy == 1: mode = "exhaustive" samples = 0 - limit = prompt_int("How many results to keep? (1–100): ", 1, 100) + limit = prompt_int("How many results to keep? (1-100): ", 1, 100) else: mode = "random" - samples = prompt_int("How many random cubes to test? (1–200000): ", 1, 200000) - limit = prompt_int("How many results to keep? (1–100): ", 1, 100) + samples = prompt_int("How many random cubes to test? (1-200000): ", 1, 200000) + limit = prompt_int("How many results to keep? (1-100): ", 1, 100) - max_degree = prompt_int("Maximum accepted degree (0–5): ", 0, 5) + max_degree = prompt_int("Maximum accepted degree (0-5): ", 0, 5) print("-" * 50) run_cube_attack( @@ -204,9 +204,9 @@ def run_cube_attack_cli(model = None): def run_cube_attack_oracle_cli(): print("\nBlack-box cube attack search on TEA3.") print("This mode varies frame-number bits and queries the cipher directly.") - print("Frame-number bits are indexed 0–31, with 0 = least significant bit.") + print("Frame-number bits are indexed 0-31, with 0 = least significant bit.") - base_frame_number = prompt_int("Base frame number (0–4294967295): ", 0, 0xFFFFFFFF) + base_frame_number = prompt_int("Base frame number (0-4294967295): ", 0, 0xFFFFFFFF) raw = input("Frame bits to set to 0 (space-separated): ").strip() fixed_zero_bits = raw.split() if raw else [] @@ -214,10 +214,10 @@ def run_cube_attack_oracle_cli(): raw = input("Frame bits to set to 1 (space-separated): ").strip() fixed_one_bits = raw.split() if raw else [] - output_byte = prompt_int("Output keystream byte (0–63): ", 0, 63) - output_bit = prompt_int("Output bit within that byte (0–7): ", 0, 7) + output_byte = prompt_int("Output keystream byte (0-63): ", 0, 63) + output_bit = prompt_int("Output bit within that byte (0-7): ", 0, 7) - cube_size = prompt_int("Cube size (1–32): ", 1, 32) + cube_size = prompt_int("Cube size (1-32): ", 1, 32) print("\nSearch strategy:") print(" 1) Exhaustive") @@ -227,11 +227,11 @@ def run_cube_attack_oracle_cli(): if strategy == 1: mode = "exhaustive" samples = 0 - limit = prompt_int("How many results to keep? (1–100): ", 1, 100) + limit = prompt_int("How many results to keep? (1-100): ", 1, 100) else: mode = "random" - samples = prompt_int("How many random cubes to test? (1–200000): ", 1, 200000) - limit = prompt_int("How many results to keep? (1–100): ", 1, 100) + samples = prompt_int("How many random cubes to test? (1-200000): ", 1, 200000) + limit = prompt_int("How many results to keep? (1-100): ", 1, 100) raw = input( "Enter 10 key bytes in hex or decimal, separated by spaces " diff --git a/src/tea3/precompute.py b/src/tea3/precompute.py index ca68d1d..05e2ff9 100644 --- a/src/tea3/precompute.py +++ b/src/tea3/precompute.py @@ -10,9 +10,9 @@ def run_precompute_cli(): build a model, optionally fix bits, run n steps (with or without abstraction), and save the model to a file. """ print("\nPrecompute and save model") - print("R registers 0–7; x,r registers 0–4; bits 0–7.") + print("R registers 0-7; x,r registers 0-4; bits 0-7.") - steps = prompt_int("How many steps to precompute? (1–100): ", 1, 100) + steps = prompt_int("How many steps to precompute? (1-100): ", 1, 100) raw0 = input("Bits to set to 0: ").strip() zero_bits = raw0.split() if raw0 else [] diff --git a/src/tea3/utils.py b/src/tea3/utils.py index edafc55..3446101 100644 --- a/src/tea3/utils.py +++ b/src/tea3/utils.py @@ -54,10 +54,10 @@ def set_int_bits(value: int, bit_names, bit_value: int) -> int: if not name: continue if not name.isdigit(): - raise ValueError(f"Invalid bit index '{name}'. Expected integers 0–31.") + raise ValueError(f"Invalid bit index '{name}'. Expected integers 0-31.") idx = int(name) if idx < 0 or idx > 31: - raise ValueError(f"Bit index out of range: {idx}. Expected 0–31.") + raise ValueError(f"Bit index out of range: {idx}. Expected 0-31.") if bit_value == 0: x &= ~(1 << idx) else: