1 个不稳定版本
0.1.0 | 2020年11月28日 |
---|
#5 in #lcg
9KB
135 行
lcg-tools
我将所有我使用的漂亮的 LCG 工具放入这个库中,这样我就可以在每次需要破解 CTF 中的 LCG 时停止复制粘贴 Python 函数。
目前它可以解 LCG 的正向和反向,并在给定一系列值时推导出参数
#[cfg(test)]
mod tests {
use crate::{crack_lcg, LCG};
use num::ToPrimitive;
use num_bigint::ToBigInt;
#[test]
fn it_generates_numbers_correctly_forward_and_backwards() {
let mut rand = LCG {
state: 32760.to_bigint().unwrap(),
a: 5039.to_bigint().unwrap(),
c: 76581.to_bigint().unwrap(),
m: 479001599.to_bigint().unwrap(),
};
let mut forward = (&mut rand).take(10).collect::<Vec<_>>();
assert_eq!(
forward,
vec![
165154221.to_bigint().unwrap(),
186418737.to_bigint().unwrap(),
41956685.to_bigint().unwrap(),
180107137.to_bigint().unwrap(),
330911418.to_bigint().unwrap(),
58145764.to_bigint().unwrap(),
326604388.to_bigint().unwrap(),
389095148.to_bigint().unwrap(),
96982646.to_bigint().unwrap(),
113998795.to_bigint().unwrap()
]
);
forward.reverse();
rand.rand();
assert_eq!(
(0..10).filter_map(|_| rand.prev()).collect::<Vec<_>>(),
forward
);
}
#[test]
fn it_cracks_lcg_correctly() {
let mut rand = LCG {
state: 32760.to_bigint().unwrap(),
a: 5039.to_bigint().unwrap(),
c: 0.to_bigint().unwrap(),
m: 479001599.to_bigint().unwrap(),
};
let cracked_lcg = crack_lcg(
&(&mut rand)
.take(10)
.map(|x| x.to_isize().unwrap())
.collect::<Vec<_>>(),
)
.unwrap();
assert_eq!(rand, cracked_lcg);
}
}
依赖项
~1MB
~26K SLoC