zoukankan      html  css  js  c++  java
  • AFCTF2018 可怜的RSA

    题目

    两个文件:

    flag.enc
    public.key

    分析与求解

    1. 先从public.key中获取(n, e)的值,方法在RSA相关知识点中已有描述
    from Crypto.PublicKey import RSA
    f = open('D:\Download\public.key', 'rb').read()
    pub = RSA.importKey(f)
    n = pub.n
    e = pub.e
    print(n, '
    ', e)
    # n = 79832181757332818552764610761349592984614744432279135328398999801627880283610900361281249973175805069916210179560506497075132524902086881120372213626641879468491936860976686933630869673826972619938321951599146744807653301076026577949579618331502776303983485566046485431039541708467141408260220098592761245010678592347501894176269580510459729633673468068467144199744563731826362102608811033400887813754780282628099443490170016087838606998017490456601315802448567772411623826281747245660954245413781519794295336197555688543537992197142258053220453757666537840276416475602759374950715283890232230741542737319569819793988431443
    # e = 65537
    
    1. 得到(n, e)的值后,对(n)进行分解,可得

    p = 3133337
    q = 25478326064937419292200172136399497719081842914528228316455906211693118321971399936004729134841162974144246271486439695786036588117424611881955950996219646807378822278285638261582099108339438949573034101215141156156408742843820048066830863814362379885720395082318462850002901605689761876319151147352730090957556940842144299887394678743607766937828094478336401159449035878306853716216548374273462386508307367713112073004011383418967894930554067582453248981022011922883374442736848045920676341361871231787163441467533076890081721882179369168787287724769642665399992556052144845878600126283968890273067575342061776244939

    1. 利用gmpy2库通过(p,q,e)(d)
    from gmpy2 import *
    d = int(invert(e, (p-1)*(q-1)))
    print(d)
    # d = 406853230956379689450620815713768871010712825839536410687962650677800895818003893712259622281477453292088146173840036827322518131453630576229976208523593618949818777897059256426591560532784635697190752924923710375949616954069804342573867253630978123632384795587951365482103468722384133084798614863870775897915929475258974188300927376911833763105616386167881813301748585233563049693794370642976326692672223638908164822104832415788577945314264232531947860576966629150456995512932232264881080618006698700677529111454508900582785420549466798020451488168615035256292977390692401388790460066327347700109341639992159475755036449
    
    1. 打包密钥并对flag.enc解密(由于是Base64编码后的密文,因此还需解码)
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_OAEP
    from base64 import b64decode
    key_info = RSA.construct((n, e, d, p, q))
    key = RSA.importKey(key_info.exportKey())
    key = PKCS1_OAEP.new(key)
    f = open('D:\Download\flag.enc', 'r').read()
    c = b64decode(f)
    flag = key.decrypt(c)
    print(flag)
    

    afctf{R54_|5_$0_B0rin9}

  • 相关阅读:
    依赖注入
    Java实现一个字符串的反转
    LRU缓存介绍与实现 (Java)
    Java中HashMap遍历的两种方法(转)
    java中判断字符串是否为只包含数字
    LeakCanary 的使用遇到的弯路
    转: BAT等研发团队的技术博客
    转: android 内存检测工具 LeakCanary 说明
    转:安桌开发开源库的推荐1
    转: 技术牛人博客
  • 原文地址:https://www.cnblogs.com/vict0r/p/13764404.html
Copyright © 2011-2022 走看看