CryptoCTF Wp 3
CryptoCTF WriteUp 3 By huangx607087
0.About
这两天又试着做了两题,越来越难,也不知道为什么突然想出去玩了。可能是我太菜了吧,整天就想着摸鱼,还有玩自己的bot。自己也觉得目前这种高压下确实也学不下去了。。CryptoCTF,10天时间,共27题(不包括两个签到题),做了12题,才发现自己AES还没怎么学,过几天得学了。
1.Ferman
题目没有给什么附件,也没给什么别的东西,连上去也就是获得了这些内容:事后发现每次连上去的内容都不一样
1 |
|
很显然,这里有一个平方和的形式$(p-68)^{2}+(q-21)^{2}$,想到之前在数论概论上看到过关于将某个素数拆成$2$个数的平方和的算法,因此猜测这里可能会用得到。
但是很显然,等号右边的这个数字我感觉看起来不是素数——因此我分解了一下它:这个数的表达式为
$$
p^7q^7=881^7×501130658240331371910024384924248009800259836627015214670629231821^7
$$
看来是一个数的$7$次方,并且这两个素数都满足模$4$余$1$的条件,因此可以分解成两个平方和。
其中:$p=25^2+16^2$,$q=707783305101597694376018027941686^2+13170089589294489230801449847315^2$。
然后自己就根据数上的方法,设$g=p^3q^3$,然后用公式$(u^2+v^2)(a^2+b^2)=(ua+vb)^2+(va-ub)^2$,然后将两个平方项同时乘上$g$,然后检验的时候发现了问题——构造出来的平方和确实等于等号右边的数值(设为$x$),但两个数无论是加上$68$还是加上$21$,都不是素数。
然后我调换了一下$a,b,u,v$的位置,用同样的方法试了一下,貌似还是不对——或许,一些合数拆解成平方和的时候,也许有不同的方法。从原理上来讲,将一个素数拆解平方和的原理是基于的复数计算:$p=(a+b\mathrm i)(a-b\mathrm i)=a^2+b^2$。因此,对于上面两个数来说,可以写成如此的形式:$x=p^7q^7=(a+b\mathrm i)^7(a-b\mathrm i)^7(c+d\mathrm i)^7(c-d\mathrm i)^7$。因此,最终的$x$可以由这4个复数可以自由组合。构成一堆共轭复数,其乘积为$x$。
因此我们直接枚举其指数即可,但考虑到每一次的$(a,b),(u,v)$的取值不敢定,因此这$4$种情况也要考虑一下,所以到最后一共大概是$16384$种情况,直接枚举指数即可。
不过据说sagemath可以解$x^2+y^2=k$的情况,但解不出$x^2+y^2=k^7$的情况,我这里未实现
1 |
|
当然,combine
函数也可以这样优化一下
1 |
|
当然,这里再重现一下上次的将一共模$4$余$1$的素数分解成两个平方和的情形,即$p=a^2+b^2$解$(a,b)$的情况,这个脚本之前在NumberTheory 3中出现过。
1 |
|
扩展:形如
$$
m=M^2\prod_{i=1}^n p_i
$$
的整数$m$可以写成两个平方和的形式,其中$p_i$是各不相同且模$4$余$1$的素数,$M$是整数
2.maid
先看一下题目:
1 |
|
可以看出:$p\equiv q\equiv 3 \pmod 4$,因此若$x^2\equiv a \pmod p$,那么可以直接得到$x\equiv a^{(p+1)/4} \pmod p$。
题目给出了公钥是$n=p^2q$,私钥是$p$,而这里我们可以自定义明文$m$,题目返回$c\equiv m^2 \pmod n$,并且如果我们发送$c$,服务器也可以给我们返回解密的结果$m$。——不过解密函数这里并没有告诉我们。
我们发现这里的指数是$2$,一开始我手动发送了个$10$进行加密,服务器返回了$100$,说明也仅仅是平方而已,如果不取模,我们可以直接通过二分的方法爆破$n=p^2q$——因为总存在一个临界点$r$使得$r^2<n,(r+1)^2>n$,而这里$(r+1)^2$(真实值)减去服务器返回的取模后的值,就是我们所要求的$n$了。
不过据说也可以对服务器发送$m_0,k_1m_0,k_2m_0$,然后求公约数也可以,但这里$m$似乎很大的样子,因此我没有尝试过——但这确实只需要$3$次交互就能求出$n$,后期会尝试一下——因为整个二分爆破过程很长,用了$10$分钟。
然后我们就只需要一次解密即可——对服务器发送我们自己的密文$c’$,获得其解密结果$m’$,计算$\gcd(n,m’^2-c’)$。就有可能获得$p^2$的值,然后就能解密了。但这是个概率算法,据说成功与否与$c’$是否是$q$的二次剩余有关。
1 |
|
整个交互过程跑一次$12$分钟,调了我$3$个多小时。
3.总结
CryptoCTF的这两道题目确实挺难的——主要是有的原理可能自己以前确实没有懂,加上自己太菜所导致的。
感觉后面的一些题目还是非常难的,至少到现在可能还是超出了自己的范围了,明天得开始学AES了。