ByteCTF2020密码学部分详解

一、noise

1. 题目信息

附件是一个Python脚本,Gitee备份在此

2.分析

穷举通过proof_of_work之后,我们来看代码逻辑:

  • secret=getrandbits(1024),注意他自己实现的getrandbits(1024)实际上是生成长1017~1024位的随机数;
  • 对上述生成的secret,服务器最多只会与你交互64次;
  • 若op为'god',服务器会返回num * getrandbits(992) % secret,这里num也由我指定;
  • 若op为'bless',服务器会判断num与secret是否相等,若相等服务器返回FLAG。

由于我至少要留一次交互机会发送我计算出的secret,因此我必须在63次交互内计算出secret!为下面叙述方便,声明如下记号:

  • 第 i 次发送的num记为\(n_{i}\)
  • 第 i 次getrandbits(992)记为\(g_{i}\)
  • 第 i 次接收的num * getrandbits(992) % secret记为\(c_{i}\)

记secret为\(m\),则:

\(c_{i} \equiv n_{i}\cdot g_{i}\ \textrm{mod}\ m,i=1,\cdots ,63\)

即存在\(k_{i}\in Z\)\(n_{i}\cdot g_{i}=c_{i}+k_{i}\cdot m\)

对等式两边模\(n_{i}\)则有:

\(c_{i}+k_{i}\cdot m \equiv 0\ \textrm{mod}\ n_{i}\)

若我能够控制\(k_{i}=1\),那么:

\(m \equiv (n_{i}-c_{i})\ \textrm{mod}\ n_{i}\)

同时得到多个如上形式的等式可考虑使用中国剩余定理解出\(m\)

2.1 利用\(n_{i}\)控制\(k_{i}\)

\(m\)\(1/2\)的概率长1024比特,\(g_{i}\)\(1/2\)的概率长992比特;此时,要控制\(k_{i}=1\),即:

\[\left\{ \begin{aligned} n_{i}\cdot g_{i} &>m \\ n_{i}\cdot g_{i} &<2m \end{aligned} \right. \]

对上式两边取对数:

\[\left\{ \begin{aligned} log(n_{i})+log(g_{i}) &>log(m) \\ log(n_{i})+log(g_{i}) &<log(m)+1 \end{aligned} \right. \]

\(log(g_{i})=991+\alpha,log(n_{i})=32+\beta,log(m)=1023+\gamma;\alpha,\beta,\gamma \in (0,1)\)(其中\(X=2^{\alpha},Y=2^{\gamma}\)服从\([1,2]\)上的均匀分布)。上式改写为:

\[\left\{ \begin{aligned} \alpha+\beta &>\gamma \\ \alpha+\beta &<1+\gamma \end{aligned} \right. \]

综上,\(P(k_{i}=1)=P(\alpha+\beta>\gamma,\alpha+\beta<1+\gamma)=P(2^{\beta}\cdot X>Y,2^{\beta-1}\cdot X<Y)\)

直观地看,\(\beta\)越大越有利于约束条件\(\alpha+\beta>\gamma\)而不利于约束条件\(\alpha+\beta<1+\gamma\),反之,\(\beta\)越小越有利于约束条件\(\alpha+\beta<1+\gamma\)而不利于约束条件\(\alpha+\beta>\gamma\)

注意到我可以判断是否满足约束条件\(\alpha+\beta>\gamma\)—若\(n_{i}\cdot g_{i}<m\)\(c_{i}=n_{i}\cdot g_{i}\)从而\(c_{i}\equiv 0 \textrm{mod}\ n_{i}\)

由此,我选择\(n_{i}\)时应该尽量满足约束条件\(\alpha+\beta<1+\gamma\),即\(\beta\)应尽量小,为何不设置\(\beta\)为0,理由如下:

\(\beta=0\)时,\(P(k_{i}=1)=P(\alpha>\gamma,\alpha<1+\gamma)=P(\alpha>\gamma)=1/2\)

由上述:\(n_{i}\)\(33\)比特,而\(m\)\(1024\)比特;由中国剩余定理可知:我们需要32个如下形式的同余式才能解出\(m\)

\(m \equiv (n_{i}-c_{i})\ \textrm{mod}\ n_{i}\)

要得到如上形式的同余式,即需要\(k_{i}=1\),而\(P(k_{i}=1)=1/2\),那么我得到\(32\)个如上形式的同余式“平均”需要\(64\)次交互,从而我没有发送secret的交互机会。

综上,\(\beta\)应在大于0的前提下尽量小!

2.2值得注意的地方

通过2.1,我知道了\(n_{i}\)值多大时可以解出\(m\),结合中国剩余定理,同余式的模数之间是互素的,即我选择的\(n_{i}\)需两两互素,因此\(n_{i}\)不是取确定的值而是在一定的取值范围内取素数!

3. 解题

上述链接中的solve.py为解题的Python脚本,程序运行(成功时)结果如下:

$ python3 solve.py
[+] Opening connection to 182.92.153.117 on port 30101: Done
[+] MBruteforcing: Found key: "l9a"
success!
95613903744255213782277288259288084531700829576284706991256294359734535087821985034716432798049279163174069238632678362676474782669781482301447573436852554131343117198284150657465643396718720128642929008328391123641254705186541184339088382138616985634723733544083949806487213357784626124965521562172300016682
b'CONGRATULATIONS ByteCTF{Noise_i5_rea11y_ANN0YING}\n'
[*] Closed connection to 182.92.153.117 port 30101

注:此程序并非次次运行都能解出secret

二、threshold

1.题目信息

附件是一个Python脚本,Gitee备份在此

2.分析

程序又臭又长,但其实考点特别简单,稍微使用一下欧拉定理即可!我来分析一下程序的逻辑:

在类TSM2初始化时:

\(pks \equiv [(sk+1)\cdot sks]^{n-2}\ \textrm{mod}\ n\)

接着在output_p1函数中:

\(s \equiv (d_{1}\cdot k_{1}\cdot s_{2}+d_{1}\cdot s_{3}-r)\ \textrm{mod}\ n\)

其中\(d_{1}=sks\),而\(r,s_{2},s_{3}\)均由我指定,那么我令\(r=s_{2}=0,s_{3}=1\),则得到的\(s\)即为\(d_{1}\)在模\(n\)下的值,即:

\(s \equiv sks\ \textrm{mod}\ n\)

注意到\(n\)是素数,欧拉函数\(\phi(n)=n-1\),显然\((n-2,n-1)=1\),即存在\(x\in Z,x\cdot (n-2)\equiv 1\ \textrm{mod}\ \phi(n)\)

由欧拉定理:\(pks^{x}\equiv [(sk+1)\cdot sks]^{(n-2)x}\equiv (sk+1)\cdot sks\ \textrm{mod}\ n\)

因此\((sk+1)\equiv pks^{x}\cdot sks^{-1}\equiv pks^{x}\cdot s^{-1}\ \textrm{mod}\ n\),而密钥\(sk\)是小于阶\(n\)的,因此解出密钥\(sk\),有了密钥干什么不行呢,按照程序的要求,对消息b'Hello, Welcome to ByteCTF2020!'签名即可!

3.解题

posted @ 2020-10-30 14:46  _Mind  阅读(296)  评论(1编辑  收藏