• 第三届江西省网络安全大赛-部分Crypto


    一、Round

    题目附件如下:

     比赛题目flag为'CMISCCTF{}'的模式,可以发现':D@J::K=r<ecXi^[V:XjXit'字符串中,'字符:'的位置恰对应于flag格式中'C'的位置,猜测为移位密码,脚本如下:

    c=':D@J::K=r<ecXi^[V:XjXit'
    
    x=ord(':')-ord('C')
    flag=''
    for i in c:
        temp=chr((ord(i)-x)%126)
        flag+=temp
    
    print(flag)

    运行结果如下:

     二、Factor

    附件内容如下:

    n = 3454083680130687060405946528826790951695785465926614724373
    e = 3
    c = 1347530713288996422676156069761604101177635382955634367208
    gcd(m, n) = 1

    明显的RSA,将n分解得三个因数:

    p=11761833764528579549

    q=17100682436035561357

    r=17172929050033177661

    下面求n得欧拉函数,当直接phi=(p-1)*(q-1)*(r-1)时,发现e和phi有公约数,求不出私钥d,使用gcd发现,e和p有最大公约数3,因此得稍微推下式子。

    因为e和(q-1)和(r-1)是互质的,故可推出

     写出脚本如下:

    from libnum import *
    def gcd(a, b):
       if a < b:
         a, b = b, a
       while b != 0:
         temp = a % b
         a = b
         b = temp
       return a
    
    n = 3454083680130687060405946528826790951695785465926614724373
    c = 1347530713288996422676156069761604101177635382955634367208
    p= 17100682436035561357
    q= 11761833764528579549
    r= 17172929050033177661
    e=3
    print(gcd(p-1,e),gcd(q-1,e),gcd(r-1,e))
    inve_qr=invmod(e,(q-1)*(r-1))
    invd=(e*inve_qr,(q-1)*(r-1))
    m=pow(c,inve_qr,q*r)
    print(n2s(m))

    运行结果如下:

     三、Change

    给出了两个文件,change.py如下:

    from flag import FLAG
    from Crypto.Util.number import *
    import gmpy2
    import random
    
    while True:
        p = int(gmpy2.next_prime(random.randint(10**399, 10**400-1)))
        q = int(str(p)[200:]+str(p)[:200])
        if gmpy2.is_prime(q):
            break
    
    m = bytes_to_long(FLAG)
    n = p*q
    e = 65537
    c = pow(m,e,n)
    
    with open("enc","wb") as f:
        f.write(str(c))
        f.write("
    ")
        f.write(str(n))
    
    #182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
    #438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437

    enc文件如下:

    182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
    438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437

    明显这也是一个RSA的题,但有点点不同,p=一个在[10**399, 10**400-1]的大素数,而q=int(str(p)[200:]+str(p)[:200]),与p的值息息相关,就是把高200位和低200位互换了,因此我们可以假设p=A*(10^200)+B,而q=B*(10^200)+A,如下:

    n=(A*B)*(10^400)+(A*A+B*B)*(10^200)+A*B

    而n的取值可以画为以下四段:

     要注意的就是中间一段(A*A+B*B)*(10^200)可能回向高200位进位,因此我们可以得到以下四个式子:(顺序从左往右)

    n1=n//(10^600)

    n2=(n//(10^400))%(10^200)

    n3=(n//(10^200))%(10^200)

    n4=n%(10^200)

    故若(A*A+B*B)*(10^200)进位,则A*B=(n1-1)*(10^200)+n4,若不进位,则等于A*B=(n1)*(10^200)+n4

    因此,可以把A*B求出来,再把(A*A+B*B)的值求出,即可根据这两者解出A和B的值

    写出脚本如下:

    import gmpy2
    from libnum import invmod,n2s
    
    
    c=182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
    n=438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437
    e=65537 
    n1
    =n//(10**600)
    n2
    =(n//(10**400))%(10**200)
    n3
    =(n//(10**200))%(10**200)
    n4
    =n%(10**200)
    AB
    =0
    if ((n2//10**199)>=n4//(10**199)):#未进位情况
      AB=n1*(10**200)+n4
    else:#进位情况
      AB=(n1-1)*(10**200)+n4
    A2B2
    =(n-AB*(10**400+1))//(10**200)#A*A+B*B
    AaddB
    =int(gmpy2.iroot(A2B2+2*AB,2)[0])#A+B
    A_B=int(gmpy2.iroot((A2B2-2*AB),2)[0])#A-B
    A
    =(AaddB+A_B)//2
    B
    =(AaddB-A_B)//2
    p
    =A*(10**200)+B
    q
    =B*(10**200)+A
    phi
    =(p-1)*(q-1)
    invd
    =invmod(e,phi)
    m
    =pow(c,invd,n)
    print(n2s(m))

    运行即可得出结果!

  • 相关阅读:
    axios 进行类库封装
    vue的中vuex为何需要mutation更新状态,vue-router的路由的理解
    发布订阅者模式、观察者模式总结
    es 模块的基础知识,深度了解
    绑定事件的模型
    rem+media+jquery布局结局方案
    VDOM总结
    react-redux
    发布网站配置文件和SSL
    css3d旋转
  • 原文地址:https://www.cnblogs.com/jane315/p/13649036.html
Copyright © 2020-2023  润新知