• [SWPUCTF 2021 新生赛]crypto2


    题目详情:

    1. from gmpy2 import *
    2. from Crypto.Util.number import *
    3. flag = '***************'
    4. p = getPrime(512)
    5. q = getPrime(512)
    6. m1 = bytes_to_long(bytes(flag.encode()))
    7. n = p*q
    8. e1 = getPrime(32)
    9. e2 = getPrime(32)
    10. print()
    11. flag1 = pow(m1,e1,n)
    12. flag2 = pow(m1,e2,n)
    13. print('flag1= '+str(flag1))
    14. print('flag2= '+str(flag2))
    15. print('e1= ' +str(e1))
    16. print('e2= '+str(e2))
    17. print('n= '+str(n))
    18. #flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
    19. #flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
    20. #e1= 3247473589
    21. #e2= 3698409173
    22. #n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313

     ——————————————————————————————————————————

    已知flag1,flag2,e1,e2,n; 满足flag1=m1^e1%n ; flag2=m1^e2%n  ; 求m1

    先求一下gcd(e1,e2):

    1. import gmpy2
    2. e1=3247473589
    3. e2=3698409173
    4. print(gmpy2.gcd(e1,e2))

    运行结果为1,说明e1,e2是互素的。

    扩展欧几里得定理,存在x,y;使得xe1+ye2=gcd(e1,e2)=1

    故有:m=m^1=m^{(xe1+ye2)}=(m^{e1})^x*(m^{e2})^y=flag1^x*flag2^y

    用扩展欧几里得求出x,y即可得到答案。

    代码:

    1. import gmpy2
    2. from Crypto.Util.number import *
    3. e1=3247473589
    4. e2=3698409173
    5. flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280
    6. flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075
    7. n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
    8. d,x,y=gmpy2.gcdext(e1,e2)
    9. m=pow(flag1,x,n)*pow(flag2,y,n)%n
    10. print(long_to_bytes(m).decode())

    得到flag:

    NSSCTF{xxxxx******xxxxx} 

  • 相关阅读:
    【力扣LCP】速算机器人
    5种API网关选型,yyds!
    几块钱和几十块的牙膏有什么区别?贵的就是好的?一文告诉你
    前端一面经典react面试题(边面边更)
    VSCode配置C和C++语言
    文件存储和对象存储的区别是什么?
    如何做顶级“新生代农民工”?这几本书为你打开大门
    How to Config VS2022
    PHP校园失物招领网站系统mysql
    CanOpen协议的伺服驱动控制
  • 原文地址:https://blog.csdn.net/qq_60256199/article/details/126442355