From 2cf6a50d401450fd29924665cf44208d03682055 Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Tue, 7 Apr 2026 10:18:31 +0200 Subject: [PATCH] period finder, brute force --- src/main.rs | 4 +++- src/tea3.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5e41b15..1bb6886 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,7 @@ mod lfsr; mod tea3; use lfsr::Lfsr; -use tea3::Tea3; +use tea3::{Tea3, period_floyd}; fn main() { let mut lfsr = Lfsr::new(4, vec![0, 3], vec![0x12, 0x34, 0x56, 0x78]); @@ -46,4 +46,6 @@ fn main() { .collect(); println!("Decrypted : {:?}", decrypted); + + // println!("\nperiod: {}", period_floyd(vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0], vec![0; 8])); } diff --git a/src/tea3.rs b/src/tea3.rs index 633111a..307e129 100644 --- a/src/tea3.rs +++ b/src/tea3.rs @@ -1,4 +1,4 @@ -use crate::Lfsr; +use std::collections::HashMap; #[derive(Debug, Clone)] pub struct Tea3 { @@ -207,9 +207,69 @@ fn bp(x: u8) -> u8 { | bit(5) } +pub fn period(key: Vec, iv: Vec) -> u64 { + let mut cipher = Tea3::new(key, iv); + cipher.init(); + + let mut seen = HashMap::new(); + + let mut step: u64 = 0; + + loop { + let state = ( + cipher.key_register().to_vec(), + cipher.state_register().to_vec(), + ); + + if let Some(prev) = seen.get(&state) { + return step - prev; + } + + seen.insert(state, step); + + cipher.step(); + step += 1; + } +} + +pub fn period_floyd(key: Vec, iv: Vec) -> u64 { + let mut tortoise = Tea3::new(key.clone(), iv.clone()); + let mut hare = Tea3::new(key, iv); + + tortoise.init(); + hare.init(); + + // Move tortoise by 1, hare by 2 + tortoise.step(); + hare.step(); + hare.step(); + + while tortoise.key_register() != hare.key_register() + || tortoise.state_register() != hare.state_register() + { + tortoise.step(); + + hare.step(); + hare.step(); + } + + let mut lambda = 1; + hare.step(); + + while tortoise.key_register() != hare.key_register() + || tortoise.state_register() != hare.state_register() + { + hare.step(); + lambda += 1; + } + + lambda +} + #[cfg(test)] mod tests { use super::*; + use crate::Lfsr; #[test] fn test_tea3_key_register_step() {