period finder, brute force
This commit is contained in:
@@ -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]));
|
||||
}
|
||||
|
||||
62
src/tea3.rs
62
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<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() {
|
||||
|
||||
Reference in New Issue
Block a user