KalmarCTF2026
Crypto
RBG
- 注意:此题并不是在该比赛中出现的,只是为了做出
RBG+而做这题找思路。 - 题目附件如下:
1 | from Crypto.Util.number import * |
-
此题代码加密流程如下:
- 首先生成两个
137位的素数,并计算,并会输出 - 接着生成公钥指数。注意生成公钥指数并没有输出
- 接着定义一个
LCG生成器,该LCG公式为: - 最后进行次循环,循环中会输出:
- 首先生成两个
-
先写出多组加密公式,对加密进行具体的推导:
- 首先根据就会有:
- 接着根据
LCG的公式带入一下:
- 这里其实可以利用与求得。注意:此时求得的并非是的真实值,这是因为还需要考虑到
LCG中的模,因此下面的这个式子是错误的。
- 这时我们需要思考一下:的值代表着什么含义,可以使用什么式子表达,首先我们有,满足:
- 那么我们将同余号改为等号就会有如下等式:
- 接下来我们以为例子,不妨设,那么就有。这个步骤需要特别注意
- 那么就会有如下式子,则有如下式子:
- 所以最终我们可以得出如下式子:
- 如果我们遍历$c_{0},…,c_{12} c_{00},c_{01},…,c_{0n}$,式子如下:
- 由于,所以,因此可以得到,大概可以得到有种可能。
-
知道了大致的值,其实可以直接用共模攻击爆破一下模数就可以求解了。
-
完整exp如下:
1 | from Crypto.Util.number import * |
*RBG+
-
在做这题之前先来看看
RBG,也就是上面的一题,看完RBG再看看这题。想不出来QAQ复现吧。 -
题目附件如下:
1 | from Crypto.Util.number import * |
-
由该题附件可以得到,此题是
RSA结合LCG,具体加密流程如下:- 首先读取
flag,并将flag转换为大整数m、 - 接着生成两个
371位的素数,并计算模数 - 之后随机生成一个加密指数,并输出公钥对
- 定义一个,其表达式为:
- 最后进行次的循环计算并输出:
- 首先读取
-
接下来对这个已经给出的式子进行推导
- 我们先写出已知的式子:
- 从已知的式子中可以看出,是模幂运算再相加,相加之后没有再取模了,设,那么就可以写成如下式子:
- 由
LCG线性同余我们还可以得到:
- 因此还可以得到与之间的关系:
-
上面是已经想到的地方,下面是没有想到的地方:
- 通过,通过这个同余式,我们就可以得到一个比值关系:,其中可以确定
- 这样我们在这组
LCG中其实就应该存在一组或者多组数据使得:,这里不妨设,那么 - 很自然的就可以写成如下式子:
- 那么这样其实就可以得到:,交叉相乘就可以得到:
- 我们不妨取三组的情况,此时就会有,并且比值后就得到三组这样的值:
- 这样就可以得到:
- 此时我们就可以构造出两个多项式:
- 由于,那么我们就可以变形得到:,,进而继续改写构造出的多项式:
- 这样就可以使用多项式,求解出,也就是消息相关攻击。这样就可以直接求得,通过比值关系还可以求得的值,接着就可以利用共模攻击求解了。
-
具体exp如下:
1 | from sage.all import * |
*RBG++
- 题目附件如下:
1 | from Crypto.Util.number import * |
-
由该题附件可以得到,本题加密过程如下:
- 首先读取
flag,将flag转换为大整数;并且生成两个素数,并计算模数 - 接着定义一个
LCG线性同余方程,与RBG和RBG+一样的同余方程: - 对于此题来说,并没有泄露,而是只给出模数
- 最后进行循环得到的结果与
RBG+稍微有所不同,式子如下:
- 首先读取
-
对比
RBG+来说,此题不能使用RBG+的用,构造出这么一系列的递推关系。但是对于此题来说并且还没给出来,这就很蛋糕了,还需要再次详细的进行分析。- 通过线性同余方程依然可以得到等量关系,其中:
- 如果我们像刚刚那样假设,那么,但是,这就导致这个递推式子就会出现更多的未知量,这并不是我们想要的结果,而且这样计算也构造不出来
RBG+中的那个比值的式子。
*RBG+++
- 题目附件如下:
1 | from Crypto.Util.number import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

