首页 > 其他分享 >记一次ctf题解(rsa简单部分)

记一次ctf题解(rsa简单部分)

时间:2024-09-21 22:19:14浏览次数:3  
标签:phi gmpy2 题解 rsa ctf c2 import c1 dp

一. ctfshow

1. babyrsa

import gmpy2
from Crypto.Util.number import *


e = 65537
p = 104046835712664064779194734974271185635538927889880611929931939711001301561682270177931622974642789920918902563361293345434055764293612446888383912807143394009019803471816448923969637980671221111117965227402429634935481868701166522350570364727873283332371986860194245739423508566783663380619142431820861051179
q = 140171048074107988605773731671018901813928130582422889797732071529733091703843710859282267763783461738242958098610949120354497987945911021170842457552182880133642711307227072133812253341129830416158450499258216967879857581565380890788395068130033931180395926482431150295880926480086317733457392573931410220501
c = 4772758911204771028049020670778336799568778930072841084057809867608022732611295305096052430641881550781141776498904005589873830973301898523644744951545345404578466176725030290421649344936952480254902939417215148205735730754808467351639943474816280980230447097444682489223054499524197909719857300597157406075069204315022703894466226179507627070835428226086509767746759353822302809385047763292891543697277097068406512924796409393289982738071019047393972959228919115821862868057003145401072581115989680686073663259771587445250687060240991265143919857962047718344017741878925867800431556311785625469001771370852474292194


n=p*q
phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)


print(long_to_bytes(m))

2. babyrsa1

import gmpy2
from Crypto.Util.number import *


e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009

#http://www.factordb.com/
p=1212112637077862917192191913841
q=1201147059438530786835365194567


phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)


print(long_to_bytes(m))

3. babyrsa2

import gmpy2
from Crypto.Util.number import *


e = 65537
n1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815


e = 65537
n2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062


p=gmpy2.gcd(n1,n2)
q=n1//p


phi_n1=(p-1)*(q-1)
d1=gmpy2.invert(e,phi_n1)
m=pow(c1,d1,n1)


print(long_to_bytes(m))

4. babyrsa3

n相同,可以进行共模攻击

import gmpy2
from Crypto.Util.number import *


e1 = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c1 = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930


e2 = 521
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c2 = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849


n=gmpy2.mpz(n)
c1=gmpy2.mpz(c1)
c2=gmpy2.mpz(c2)


s=gmpy2.gcdext(e1,e2)


m1=pow(c1,s[1],n)
m2=pow(c2,s[2],n)


m=(m1*m2)%n


print(long_to_bytes(m))

思路:

c1 = m^e1 % n , c2 = m^e2 % n

若两密钥互素,根据欧几里得拓展存在s1,s2使得

e1 * s1 + e2 * s2 = gcd(e1,e2) = 1

m = m % n = m * (e1*s1 + e2*s2) % n = ((m*e1) ^ s1 % n + (m*e2) ^ s2 % n) % n = (c1 ^ s1 * c2 * s2) % n

二. buuctf

1. rsarsa

import gmpy2
from Crypto.Util.number import *


p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034


n=p*q
phi_n=(p-1)*(q-1)


d=gmpy2.invert(e,phi_n)
m=pow(c,d,n)
print(m)

2. rsa

import gmpy2
from Crypto.Util.number import *


p=473398607161
q=4511491
e=17


phi_n=(p-1)*(q-1)
d=gmpy2.invert(e,phi_n)


print(d)   #根据题目描述,flag为d,直接求出flag

3. rsa2

dp泄露

import gmpy2
from Crypto.Util.number import *


e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751


for i in range(1,65538):
    if (dp*e-1)%i == 0:
        if n%(((dp*e-1)//i)+1)==0:
            p=((dp*e-1)//i)+1
            q=n//(((dp*e-1)//i)+1)
            phi = (p-1)*(q-1)
            d = gmpy2.invert(e,phi)%phi


m=pow(c,d,n)
print(long_to_bytes(m))

4. rsa3

还是一道共模攻击

import gmpy2
from Crypto.Util.number import *


c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291


n=gmpy2.mpz(n)
c1=gmpy2.mpz(c1)
c2=gmpy2.mpz(c2)


s=gmpy2.gcdext(e1,e2)
m1=pow(c1,s[1],n)
m2=pow(c2,s[2],n)


m=(m1*m2)%n


print(long_to_bytes(m))

三. dp(dq)泄露思路

已知:

1.c = m^e mod n

2.m = c^d mod n

3.ϕ(n)=(p−1)*(q−1)

4.d∗e ≡ 1 mod ϕ(n)

5.dp = d mod (p−1)

则:dp*e≡d*e%(p-1) => d*e≡k1*(p-1)+dp*e

则: 1%(p-1)(q-1)≡k1(p-1)+dp*e 即:k2*(p-1)(q-1)+1≡k1(p-1)+dp*e

则: dp*e=(p-1)*(k2(q-1)-k1)+1

因为dp<(p-10),所以e>k2(q-1)-k1

设x=k2(q-1)-k1,则0<x<e

dp*e=x*(p-1)+1

x遍历(0,e),必然存在一个值使得dp*e-1被p-1整除,即可求出p值

q=n//p,求得q值

标签:phi,gmpy2,题解,rsa,ctf,c2,import,c1,dp
From: https://blog.csdn.net/qq_72021770/article/details/142425669

相关文章

  • B4033 [语言月赛 202409] 考试 题解
    存下输赢代价,计算时先减为平局,判断输赢,如果还是输,那继续加一变为胜利这局,判断输赢。#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=1e6+10;intn;inta[N];intb[N];intc[N];intmain(){ios::sync_with_stdio(false); cin>>n......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛完善程序(33-42)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>#include<vector>usingnamespacestd;boolisSquare(intnum){ inti=__1__; intbound=__2__......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛阅读程序(16-32)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;boolisPrime(intn){ if(n<=1){ returnfalse; } for(inti=2;......
  • 历年CSP-J初赛真题解析 | 2024年CSP-J初赛单项选择(1-15)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客第1题32位int类型的存储范围是()A.-2147483647~+2147483647B.-2147483647~+2147483648C.-2147483648~+2147483647D......
  • 9.21今日错题解析(软考)
    前言这是用来记录我每天备考软考设计师的错题的,大部分错题摘自希赛中的题目,但相关解析是原创,有自己的思考,为了复习:)面向对象技术——面向对象的基本概念如下所示的UML类图中,Car和Boat类中的move()方法(B)了Transport类中的move()方法A.继承B.覆盖C.重载D.聚合相关解析继......
  • 【秋招笔试-支持在线评测】0919华为秋招(已改编)-三语言题解
    ......
  • 【秋招笔试-支持在线评测-试读版本】0919华为秋招(已改编)-三语言题解
    ......
  • 【洛谷】P3128 [USACO15DEC] Max Flow P 的题解
    【洛谷】P3128[USACO15DEC]MaxFlowP的题解题目传送门题解谔谔,LCA+++树上差分,差点就被难倒了qaq今天就是CSP初赛了,祝大家也祝我自己rp++!!!其实是一道树上差......
  • P9912 题解
    P9912[COCI2023/2024#2]Zatopljenje-洛谷|计算机科学教育新生态(luogu.com.cn)线段树。离线处理询问,将询问的高度从大到小排序,每次往线段树中加入高度大于当前询问高度的点,然后做一遍区间连续段个数就可以了。code:#include <bits/stdc++.h>using namespace std;......
  • CCF-CSP资格认证题解系列——第1次第1题相反数
    #include<iostream>usingnamespacestd;intcnt;//N个非零且各不相同的整数intmain(){ intn; cin>>n; inta[n]; for(inti=0;i<n;i++){ cin>>a[i]; } for(inti=0;i<n;i++){ for(intj=i+1;j<n;j++){ if(a[i]+a[j]==0){ cnt++; ......