zoukankan      html  css  js  c++  java
  • 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} extrm{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 extrm{mod} n_{i})

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

    (m equiv (n_{i}-c_{i}) extrm{mod} n_{i})

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

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

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

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

    对上式两边取对数:

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

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

    [left{ egin{aligned} alpha+eta &>gamma \ alpha+eta &<1+gamma end{aligned} ight. ]

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

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

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

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

    (eta=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}) extrm{mod} n_{i})

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

    综上,(eta)应在大于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}
    '
    [*] Closed connection to 182.92.153.117 port 30101
    

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

    二、threshold

    1.题目信息

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

    2.分析

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

    在类TSM2初始化时:

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

    接着在output_p1函数中:

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

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

    (s equiv sks extrm{mod} n)

    注意到(n)是素数,欧拉函数(phi(n)=n-1),显然((n-2,n-1)=1),即存在(xin Z,xcdot (n-2)equiv 1 extrm{mod} phi(n))

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

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

    3.解题

  • 相关阅读:
    wpf学习笔记StackPanel
    wpf学习笔记DockPanel
    wpf学习笔记Viewbox
    C#.NET 中的类型转换
    超简单U盘PE启动完全攻略(U盘上仅四个文件)
    Web 应用的 UML 建模与 .NET 框架开发
    100多个很有用的JavaScript函数以及基础写法大集合
    Asp.net(C#)显示所有缓存 清除所有缓存
    grub引导U盘(集成常用工具/深山红叶PE工具箱V30/完美者U盘维护系统V8.1)
    GRUB启动命令详解
  • 原文地址:https://www.cnblogs.com/coming1890/p/13902043.html
Copyright © 2011-2022 走看看