period finder, brute force
This commit is contained in:
@@ -2,7 +2,7 @@ mod lfsr;
|
|||||||
mod tea3;
|
mod tea3;
|
||||||
|
|
||||||
use lfsr::Lfsr;
|
use lfsr::Lfsr;
|
||||||
use tea3::Tea3;
|
use tea3::{Tea3, period_floyd};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut lfsr = Lfsr::new(4, vec![0, 3], vec![0x12, 0x34, 0x56, 0x78]);
|
let mut lfsr = Lfsr::new(4, vec![0, 3], vec![0x12, 0x34, 0x56, 0x78]);
|
||||||
@@ -46,4 +46,6 @@ fn main() {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
println!("Decrypted : {:?}", decrypted);
|
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)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Tea3 {
|
pub struct Tea3 {
|
||||||
@@ -207,9 +207,69 @@ fn bp(x: u8) -> u8 {
|
|||||||
| bit(5)
|
| 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)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::Lfsr;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_tea3_key_register_step() {
|
fn test_tea3_key_register_step() {
|
||||||
|
|||||||
Reference in New Issue
Block a user