伪随机数生成器MT19937
-
做到相关的题目就直接来先学习一下。
-
参考博客:https://hasegawaazusa.github.io/mersenne-twister-note.html
-
参考博客:https://huangx607087.online/2021/07/10/Explore-MT19937/
-
参考博客:MT19937 分析 | Xenny 的博客,
Xenny老师这篇讲如何逆向MT19937讲的挺好的。
MT19937 即梅森旋转算法(Mersenne twister)由松本眞(日语:松本真)和西村拓士在 1997 年开发,基于二进制有限域 $\mathbb{F}_2$上的矩阵线性递归,可以快速产生高质量的伪随机数。
该算法的周期为$2^{19937}−1$,故名为 MT19937。该算法具有以下优点
- 周期非常长,达到$2^{19937}−1$。
- 在$1≤k≤623$都满足$k-$分布。
- 能比硬件实现的方法更快产生伪随机数。
$k-$分布:一个周期为$P$的$\omega$位整数的伪随机序列$x_i$,如果下列成立则称$v-$比特精度的$k-$分布成立:
令$trunc_v(x)$表示由$x$的前$v$位形成的数,考虑$P$中$k$个$v$向量,然后$2^{kv}$个组合中每一个都在一个周期内出现次数相同(全0组合次数较少除外)。
$$
(trunc_v(x_i),trunc_v(x_{i+1}),…,trunc_v(x_{i+k-1}))~(0≤i<P)
$$
MT19937
-
对于
MT19937的介绍,已经在前面的一篇文章中介绍过了,接下来就具体学习一下MT19937具体的算法过程。这里简单讲一下前面没讲的:-
对于
MT19937的应用,其实很多语言的random这个库都使用的是MT19937这个算法,比如python、PHP和Matlab,并且从C++11开始,C++也可以使用梅森旋转算法(MT19937),对应的命名空间为std::mt19937_64。 -
MT19937这个伪随机数生成器,目前被视为最好的随机数算法。 -
做个统一:以下文章中的内容都以
MT19937来表示该算法。 -
该版本其实就是使用
32位的整数作为该算法的种子。之后的64位是后来的一个变种版本,初学的时候一开始只要学原始版本即可。 -
注意:自己写好的
MT19937算法代码不要使用Python的random库验证,因为使用Python自带的random库传入seed的时候可能还会对seed做一些处理。
-
-
接下来我们一步一步介绍一下
MT19937的具体过程,采用的是该博客的方式:https://hasegawaazusa.github.io/mersenne-twister-note.html,先分布介绍,最后再将算法有个整体概念。 -
代码采用的是这篇博客的代码,实现的比较简洁:https://huangx607087.online/2021/07/10/Explore-MT19937/
-
这个算法其实总的来说有三个部分,分别就是
初始化操作、获得伪随机数(提取伪随机数)、梅森旋转操作
初始化
代码如下,这里主要就是利用用户传入的种子,对该MT19937中的初始状态寄存器做一个初始化操作,使得624个初始化状态寄存器都有对应的值:
1 | # 由于Python中支持无限长度的整型,所以我们需要定义一个函数来实现32位整型的提取 |
提取伪随机数
- 代码如下:
1 | def getrandbits(self): |
状态旋转
- 代码如下:
1 | def twist(self): |
总体代码
1 | def _int32(x): |
MT19937破解
状态破解
矩阵状态破解
旋转破解
MT19937常见题型
- 这一部分主要是参考:https://huangx607087.online/2021/07/10/Explore-MT19937/
- 由于初始状态寄存器一共有
624*32=19968个bit位,所以要恢复、预测等需要19968个bit位,所以在MT19937的题型都是围绕着已知bit位来实现的。
题型1_预测随机数
- 给了足够多的数据后其实可以预测随机数的,并且有在Python中其实有现成的库可以使用,当然其实也可以自己逆向以下
MT19937的算法,自己预测破解。
题目1_XYCTF2025_Division
题目2_
题型2_恢复随机数
- 这类题型其实就是选用一开始生成的随机数对
flag等密文进行加密,之后给你后续一大堆随机数,让你恢复出随机数种子和初始状态寄存器 - 恢复出随机数种子和初始状态寄存器,从而可以得到一开始生成的随机数值,从而获得密钥,对
flag的密文进行解密操作。
题目1_XYCTF2025_choice
题型3_给一定量任意的bit
- 这种情况是题目给你一定量
任意的伪随机数的bit,从而让你恢复这个伪随机数。这种情况其实就是要进行一定量的操作了。 - 有些情况他会给你足够的
bit也就是19968个bit或者超过19968个bit,此时还是比较好恢复初始状态寄存器的。 - 但是有些情况题目不会给你足够数量的
bit位,此时可能就需要对MT19937的旋转过程或者其他过程进行破解。从而恢复初始状态寄存器。

