period finder, brute force

This commit is contained in:
2026-04-07 10:18:31 +02:00
parent 0c3876f9f5
commit 2cf6a50d40
2 changed files with 64 additions and 2 deletions

View File

@@ -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]));
}

View File

@@ -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<u8>, iv: Vec<u8>) -> 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<u8>, iv: Vec<u8>) -> 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() {