# 流密码 LCG
# 线性同余生成器
Xn+1=(aXn+b)modm
b=(Xn+1−aXn)mod(m)
# 代码块
1 2 3 4 5 6 7 8 9 10
| class LCG: def __init__(self, seed, a, b, m): self.seed = seed self.a = a self.b = b self.m = m
def generate(self): self.seed = (self.a * self.seed + self.b) % self.m return self.seed
|
# LCG 公式推导
Xn+1=a(Xn−b)modm
Xn+1=(aXn−ab)modm
# 已知结果恢复模 m
# 连续情况
结果案例:
X1,X2,X3,...,Xn
引入计算公式:
ti=Xi+1−Xi
ti=Xi+1−Xi=ai(Xi−Xi−1)
aiaj=am2(m=(i+j)/2)
ti+1ti−1=ti2
ti+1ti−1−ti2≡0(modm)
通过求解 m 的倍数的公因式得到 m。
# 不连续情况
结果案例:
X1,X3,X5,X7,X9
模计算:
Xi+j−Xi=a(Xi+j−1−Xi−1) (j为整数)
X3−X1=aX1+b−(aX0+b)=a(X2−X0)
[!NOTE]
j 表示不连续结果情况下之间的间隔。
其他同理。
a2=(X5−X3)(X3−X1)−1modm
[!NOTE]
a 推导计算参考 RSA
a2=c(modn)