Crypto 的斐波那契数列还挺有意思,其他都很常规。槽点就是,往其他赛道的题里面塞纯脑洞的 MISC 真的一点意思也没有。
Alexei Needs Help
需要我们求解一个类似斐波那契数列的数列通项表达式,该变体数列递推公式如下:
考虑斐波那契数列的两种解法(参考 wiki),分别讨论一下上面斐波那契变体数列的求解:
待定系数法求解 ,目的是构造一个等比数列 :
构建系数方程 :
方程(1),(2) 是经典的斐波那契数列的方程(),在有限域上,同样可以构造一元二次方程组进行求解得到 , 但是也可能不存在解,需要在扩域上计算,比如复数域是实数域的扩域。带入 求解方程 (3) 是简单的,但是当函数 比较复杂时,就需要比较好的数学竞赛技巧去求原数列 的通项表达式了,不太推荐这种方法。
线性代数求解 : 如果构造矩阵求解,利用一点点矩阵快速幂,有限域/整数环上的斐波那契数列计算就非常简单了。首先考虑 的简单情况,有如下递推公式:
给定初始向量 , 斐波那契数列的通用矩阵表达式如下 :
利用(有限域/整数环上)矩阵快速幂,可以快速求解任意 。
回到题目本身,斐波那契数列递推公式后面附加了一个 次多项式 。多项式本身很好拟合,我们把高次项放进递推向量内,就退化至线性了。也就是说我们把递推向量换成 ,需要找一个矩阵使得:
考虑 M 前面两行,形式如下:
于是问题转换到求由 ?
组成的矩阵 ,要恰好使得:
右边作二项展开,取各个单项式 系数构成的矩阵即得 , 构建分块矩阵得到最终矩阵 即可得到递推向量 的表达式 :
但是这题其实很简单,因为需要求解的 n = 2023 ,所以直接把迭代写成循环就 ok 了。
Exp(矩阵解法) :
1 | # sagemath 9.5 |
Alexei needs help again
和上题类似 :
此时 如下, 给定一个数集 ,满足:
其中 I 表示括号内表达式为真则为 1,否则为 0 , 即一个计数器:n 能整除数集 中的数的个数。笔者没有成功构建出矩阵,因为这个函数比较难进行代数表达。于是思考斐波那契数列中常数部分的一般化表达,记 斐波那契数列为 。
不考虑常数项部分,根据上节给出的一般斐波那契数列矩阵表达式():
记一般斐波那契数列的递推矩阵为
现在 中加入了常数项 ,考虑一个简单的事实,对于任意 , 在 中累加了多少次?记这个次数为 , 我们会发现巧合的是,固定 之后 也恰好是一个斐波那契数列,递推公式与斐波那契数列数列一致。准确来说 :
更具体地,写成表达式就是,注意 ,下标 1 表示取结果第一维 :
我们发现对任意整除 中的数 , 所有 在 中累加的次数,就是最终递推公式中常数项 对 的总影响。考虑一个固定的数 , 则它对最终 中的贡献为 :
写成矩阵递推公式即:
即一个矩阵等比数列求和!
我们求出每个 中的等比数列和,再累加起来,就是 项在递推公式中对 的贡献。最终结果为 :
等比数列需要注意的两个点是:
- 乘法不可交换,求和公式要写作 (手动推导一下)
- 矩阵不一定可逆,上述 可能不存在。
Exp 实现:
1 | # sagemath 9.5 |
- 注 : 前面 MT19937 随机数的恢复和回溯就不写了,可以找找板子自己恢复 , 最后解出来是这个,
3tl2nv1kn54o4ty4tv4z61b61lt50j54j1761ko1tt50h17d4va1gh5391lw1gi4va6w0
,还套了一层 MISC,我只能说国内赛真的会搞心态。 - 吐槽:这题槽点非常之多,附件更新了三次,笑死,最开始的源代码根本不对,解完了再来个 MISC,我是真的绷不住了,MISC 占领国内 CTF 是吧,此处省略 n 句礼貌用语。
Signin
在精度 600 比特的实数域上的比值 , 由于 data1 和 data2 都只有 256 比特,因此可以格基规约直接求出 data1, data2,然后得到 ,从而分解 n。格的构造很简单,参考 exp。
Exp
1 | # sagemath 9.5 |
CrazyTreat
思路:
- P,Q部分泄露了 P 的约高位300,因此可以 coppersmith 分解 clown 得到 P, Q
- 利用欧拉公式 , 构造方程 , 利用 coppersmith即可求解小根,得到我们需要的 m ,即最后一个素因子。
- 解密 RSA 即可。
Exp
1 | # sagemath 9.5 |