exhaustive 2 bits XOR search

This commit is contained in:
2026-06-09 10:16:12 +02:00
parent 7be7357126
commit 249e5cb1e1
2 changed files with 56 additions and 2 deletions
+18 -2
View File
@@ -3,7 +3,7 @@ from tea3.cliutils import prompt_int, prompt_choice, prompt_list
from tea3.tea3model import Tea3Model from tea3.tea3model import Tea3Model
from tea3.variable_search import run_exhaustive from tea3.variable_search import run_exhaustive
from tea3.sbox import run_sbox from tea3.sbox import run_sbox
from tea3.variable_xor import run_variable_xor from tea3.variable_xor import run_variable_xor, run_exhaustive_two_bit_xor
from tea3.f31f32 import run_f31f32 from tea3.f31f32 import run_f31f32
@@ -70,6 +70,19 @@ def run_variable_xor_cli():
print("\n" + "=" * 50) print("\n" + "=" * 50)
print("Done.") print("Done.")
def run_exhaustive_two_bit_xor_cli():
print("\nR registers are indexed 07; bits within each register are 07.")
print("This mode checks all 2-bit XOR pairs and prints the best one(s) at each step.")
steps = prompt_int("How many steps? (1100): ", 1, 100)
target_reg = prompt_int("Target register (07): ", 0, 7)
print("-" * 50)
run_exhaustive_two_bit_xor(steps, target_reg)
print("\n" + "=" * 50)
print("Done.")
def main(): def main():
@@ -83,8 +96,9 @@ def main():
print(" 3) S box analysis") print(" 3) S box analysis")
print(" 4) variable XOR") print(" 4) variable XOR")
print(" 5) F31, F32 analysis") print(" 5) F31, F32 analysis")
print(" 6) Exhaustive 2-bit XOR search")
mode = prompt_choice("Your choice (1, 2, 3, 4 or 5): ", {1, 2, 3, 4, 5}) mode = prompt_choice("Your choice (1, 2, 3, 4, 5 or 6): ", {1, 2, 3, 4, 5, 6})
if mode == 1: if mode == 1:
run_classic_cli() run_classic_cli()
@@ -96,6 +110,8 @@ def main():
run_variable_xor_cli() run_variable_xor_cli()
elif mode == 5: elif mode == 5:
run_f31f32() run_f31f32()
elif mode == 6:
run_exhaustive_two_bit_xor_cli()
main() main()
+38
View File
@@ -1,6 +1,11 @@
from itertools import combinations
from tea3.tea3model import Tea3Model from tea3.tea3model import Tea3Model
from tea3.pretty_print import pretty_print from tea3.pretty_print import pretty_print
def monomial_count(poly):
return len(poly.monomials())
def run_variable_xor(steps, target_reg, bits_to_xor): def run_variable_xor(steps, target_reg, bits_to_xor):
model = Tea3Model() model = Tea3Model()
@@ -23,3 +28,36 @@ def run_variable_xor(steps, target_reg, bits_to_xor):
print(f"XOR of R_bits[{target_reg}][{bits_to_xor}] =") print(f"XOR of R_bits[{target_reg}][{bits_to_xor}] =")
print(pretty_print(xor_poly)) print(pretty_print(xor_poly))
print() print()
def run_exhaustive_two_bit_xor(steps, target_reg, bit_indices=range(8)):
model = Tea3Model()
bit_pairs = list(combinations(bit_indices, 2))
print(f"Target register: R{target_reg}")
print(f"Searching all 2-bit XORs among bits: {list(bit_indices)}")
print("-" * 50)
for i in range(steps):
model.step()
best_count = None
best_pairs = []
best_poly = None
for b1, b2 in bit_pairs:
xor_poly = model.R_bits[target_reg][b1] + model.R_bits[target_reg][b2]
count = monomial_count(xor_poly)
if best_count is None or count < best_count:
best_count = count
best_pairs = [(b1, b2)]
best_poly = xor_poly
elif count == best_count:
best_pairs.append((b1, b2))
print(f"\n[Step {i + 1}]")
print(f"Best XOR(s) with {best_count} total monomials:")
for b1, b2 in best_pairs:
print(f" bits XORed: ({b1}, {b2})")