N为素数
#题目及出题脚本
import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
print(flag)
m = libnum.s2n(flag)
# 生成随机素数
p = libnum.generate_prime(1024)
# 字符串转数字
n = p
e = 65537
c = pow(m, e, n)
print("n=",n)
print("c=",c)
#n= 114904723088242436560222555148424908481775302449678762789112091666971730833042318807316209276538265858810430860188630138345094997413502014629701840292299043867371143866817473689761760188003757165703444485737002808634454042439419243767222693781419170621758982605146916516740572285029340446484523059007717152993
#c= 109231975788613157710975932240403105235490178292821559667096694595635756368777710402401959999267918678101575858597927476795280573618413528697437540341427177894264053002305349919954387643558433412486953631676185415528902445397779958802695506641600458837544847993481351893146446656265327835619141817883945604107
可以看看题目 p = libnum.generate_prime(1024) n = p #关键点是n = p 所以n是无法被分解的 我们可以利用公式:ed mod phi_n = 1 也就是 e*d ≡ 1 (mod phi_n)来计算e的逆元
EXP如下
import libnum
n= 114904723088242436560222555148424908481775302449678762789112091666971730833042318807316209276538265858810430860188630138345094997413502014629701840292299043867371143866817473689761760188003757165703444485737002808634454042439419243767222693781419170621758982605146916516740572285029340446484523059007717152993
c= 109231975788613157710975932240403105235490178292821559667096694595635756368777710402401959999267918678101575858597927476795280573618413528697437540341427177894264053002305349919954387643558433412486953631676185415528902445397779958802695506641600458837544847993481351893146446656265327835619141817883945604107
e = 65537
phi_n = n - 1
d=libnum.invmod(e,phi_n)
m=pow(c,d,n)
print(libnum.n2s(m).decode())
pq相近
#题目及出题脚本
import libnum
import gmpy2
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
p = libnum.generate_prime(1024)
q = gmpy2.next_prime(p)
n = p * q
e = 65537
c = pow(m, e, n)
print("n=", n)
print("e=", e)
print("c=", c)
print(flag)
#n= 17752770005959450783368980030043878547535956414119879741453560550701705489806449145991219400638575053529185909550016280513308215017385040463699931951701894554210916071934994522579016557286121819399693223747296718293086175847432934809917559318694792015696754445449090169911052611759269740275932926797176511376184207265987673583880965946906791696307374144274966668681976499889069666816573873429180101133894777446363037698265266769363040459677305869824632204494462866097824280787902105876680951222107761530644357292819483215790868606552029604879053217989241693291353552725151633669823156879311498404663745671588492388939
#c= 17215114973697188228039407246534810856664195594190943813088215060573040302874656982718865711472821797706298792012615413421620367364435910565448695441533985668245204354161963958920998821327722363488545595199128223887604206339608823901845352597801014639506279914508269141350896135320522450208970336079282563152913186458859289060342568562329695673546818588161006052780570480494934554029032268444361720329775028337034266866365591838699506418326634782639236557659691322389324900487855512614150815465076893085020543027358714857336681784520429602229455376426822593566388991433069627228944458733892799679195989110824305261985
解题思路:
解题思路: 关键点: p1=libnum.nroot(n,2) p=gmpy2.next_prime(p1) 由于pq相近所以可以直接看成p = q了 n = p**2 所以我们可以给n开平方,求出p 然后再通过q = n//p p和q都有了就可以去求phi_n = (p-1)*(q-1) 然后求出d = e^-1 mod phi_n 最后求出m = c^d mod n
import libnum
import gmpy2
n= 17752770005959450783368980030043878547535956414119879741453560550701705489806449145991219400638575053529185909550016280513308215017385040463699931951701894554210916071934994522579016557286121819399693223747296718293086175847432934809917559318694792015696754445449090169911052611759269740275932926797176511376184207265987673583880965946906791696307374144274966668681976499889069666816573873429180101133894777446363037698265266769363040459677305869824632204494462866097824280787902105876680951222107761530644357292819483215790868606552029604879053217989241693291353552725151633669823156879311498404663745671588492388939
e= 65537
c= 17215114973697188228039407246534810856664195594190943813088215060573040302874656982718865711472821797706298792012615413421620367364435910565448695441533985668245204354161963958920998821327722363488545595199128223887604206339608823901845352597801014639506279914508269141350896135320522450208970336079282563152913186458859289060342568562329695673546818588161006052780570480494934554029032268444361720329775028337034266866365591838699506418326634782639236557659691322389324900487855512614150815465076893085020543027358714857336681784520429602229455376426822593566388991433069627228944458733892799679195989110824305261985
p1=libnum.nroot(n,2)
p=gmpy2.next_prime(p1)
q=n//p
assert n == p * q
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(libnum.n2s(int(m)).decode()) #这里因为p ≈ q,所以计算出的m可能有小数误差,所以用int转化为整型
pq过大
#出题脚本及题目
import libnum
import gmpy2
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
p = libnum.generate_prime(1024)
q = gmpy2.next_prime(p)
n = p * q
e = 65537
c = pow(m, e, n)
print("n=", n)
print("e=", e)
print("c=", c)
print(flag)
#n= 17752770005959450783368980030043878547535956414119879741453560550701705489806449145991219400638575053529185909550016280513308215017385040463699931951701894554210916071934994522579016557286121819399693223747296718293086175847432934809917559318694792015696754445449090169911052611759269740275932926797176511376184207265987673583880965946906791696307374144274966668681976499889069666816573873429180101133894777446363037698265266769363040459677305869824632204494462866097824280787902105876680951222107761530644357292819483215790868606552029604879053217989241693291353552725151633669823156879311498404663745671588492388939
#c= 17215114973697188228039407246534810856664195594190943813088215060573040302874656982718865711472821797706298792012615413421620367364435910565448695441533985668245204354161963958920998821327722363488545595199128223887604206339608823901845352597801014639506279914508269141350896135320522450208970336079282563152913186458859289060342568562329695673546818588161006052780570480494934554029032268444361720329775028337034266866365591838699506418326634782639236557659691322389324900487855512614150815465076893085020543027358714857336681784520429602229455376426822593566388991433069627228944458733892799679195989110824305261985
RSA N分解_PQ过大原理 找两个很大的素数p和q,比如长100位长。 n = p * q ——————》n是公开的 f(n) = (p-1)(q-1) 找一个和m互质的数e,使得gcd(e,f(n))=1。 找一个整数d,使得ed mod f(n)=1。 加密:c = m^e mod n 解密:m = c^d mod n 可以直接用网站取分解出的p和q
import libnum
import gmpy2
n= 17752770005959450783368980030043878547535956414119879741453560550701705489806449145991219400638575053529185909550016280513308215017385040463699931951701894554210916071934994522579016557286121819399693223747296718293086175847432934809917559318694792015696754445449090169911052611759269740275932926797176511376184207265987673583880965946906791696307374144274966668681976499889069666816573873429180101133894777446363037698265266769363040459677305869824632204494462866097824280787902105876680951222107761530644357292819483215790868606552029604879053217989241693291353552725151633669823156879311498404663745671588492388939
e= 65537
c= 17215114973697188228039407246534810856664195594190943813088215060573040302874656982718865711472821797706298792012615413421620367364435910565448695441533985668245204354161963958920998821327722363488545595199128223887604206339608823901845352597801014639506279914508269141350896135320522450208970336079282563152913186458859289060342568562329695673546818588161006052780570480494934554029032268444361720329775028337034266866365591838699506418326634782639236557659691322389324900487855512614150815465076893085020543027358714857336681784520429602229455376426822593566388991433069627228944458733892799679195989110824305261985
p1=libnum.nroot(n,2)
p=gmpy2.next_prime(p1)
q=n//p
assert n == p * q
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(libnum.n2s(int(m)))
N分解成3个素数
#出题脚本即题目
import gmpy2
import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
p = libnum.generate_prime(512)
q = gmpy2.next_prime(p)
r = libnum.generate_prime(512)
n = p * q * r
e = 65537
c = pow(m, e, n)
print("r=", r)
print("n=", n)
print("e=", e)
print("c=", c)
#r = 12328943069972158868300333965019293732240349172933398867374450193780676916633106046545397891902123683693837126404908611670219604587587151306224914062663729
#n = 928445951911850156618541782850215900925329423880533465612155142015978599609287623859912813317551629221695490535012732781489396534420011145723987610606038091488823086647363964394753700158320900867101659445170118179077194271099520502633316318889163873291574934282498061117736456183503867870294570083013883365868242889035609602940685335912371326827533418614992221705810476710807373254363162373986374486325350746366851935451369892949745302442034805629514003196071631
#c = 327716655224470059950709685055600963837116578216483343492948888372401723689223347212508532985781828794786448842515029515358422017875793926582832247025212149474404973170422295165602666360784347416812528617973764432916955654602356835327769633635513894485943553309743509322858937973710628023758816806471875016815994664897320150855163109437521642800230902661034555151514311149333258071668655344069451897282357234220538922127548822361859943829665459953651351620958628
解题思路: 由于n是3个素数的乘积,所以要将n分解成3个素数,然后求出p、q、r,再求出phi_n,再求出d,最后求出m。 p、q、r的求法: n = p * q * r,所以p、q、r的乘积就是n。 目前已知r,所以先求出p、q的乘积 然后将pq的乘积放到网站上分解 求phi_n: phi_n = (p - 1) * (q - 1) * (r - 1) 然后再求出d: d = e^-1 mod phi_n 最后求出m: m = c^d mod n
import gmpy2
import libnum
r = 12328943069972158868300333965019293732240349172933398867374450193780676916633106046545397891902123683693837126404908611670219604587587151306224914062663729
n = 928445951911850156618541782850215900925329423880533465612155142015978599609287623859912813317551629221695490535012732781489396534420011145723987610606038091488823086647363964394753700158320900867101659445170118179077194271099520502633316318889163873291574934282498061117736456183503867870294570083013883365868242889035609602940685335912371326827533418614992221705810476710807373254363162373986374486325350746366851935451369892949745302442034805629514003196071631
e = 65537
c = 327716655224470059950709685055600963837116578216483343492948888372401723689223347212508532985781828794786448842515029515358422017875793926582832247025212149474404973170422295165602666360784347416812528617973764432916955654602356835327769633635513894485943553309743509322858937973710628023758816806471875016815994664897320150855163109437521642800230902661034555151514311149333258071668655344069451897282357234220538922127548822361859943829665459953651351620958628
pq = n // r
# 网站上分解pq得到p、q
p = 8677914960051571881163393151217840674884144886709470084966197470333385987477662098134846485042365070664261589879739214029342465837414534639688284776885749
q = 8677914960051571881163393151217840674884144886709470084966197470333385987477662098134846485042365070664261589879739214029342465837414534639688284776885411
phi = (p - 1) * (q - 1) * (r - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(libnum.n2s(int(m)))
N分解成4个素数
import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
p = libnum.generate_prime(512)
q = libnum.generate_prime(512)
r = libnum.generate_prime(512)
z = libnum.generate_prime(512)
n = p * q * r * z
e = 65537
c = pow(m, e, n)
print("p=", p)
print("q=", q)
print("r=", r)
print("z=", z)
print("n=", n)
print("e=", e)
print("c=", c)
#p= 12723142120869732634088432197707819803507240293300061431173331805617171978089883597534066370602995679812668052610693259459075675608655496049581799707213179
#q= 8900852514713147139651513059818922084330369100740608813073296241091158626036379697255585984179819201002123713678282378132063241352222088969982548549315719
#r= 12064725865231337533098951153642907764505518107372279102766775472989619174722644336981226535437875987362995139874060388450720197597731017505899834387134263
#z= 12914162225504946264813763202793919819471686475362098252206870607294877319696009480915212066260576299162116303490758124293139654751399961014385254783128949
#n= 17644513130731155670074406197128796026086459954267871807474253498266692162535213701704272353257163007614478767225685841167399105274097620232857668700563389692870378886177896662440512079480265261757579696679888155857841428740769833273503735243470876318726384846715661198513277463318404618291358669060535774013436171781341251556328022640288742688873513937857961297517027261021954474835202280244815586668812370434215844470519490712566049458135679795641468615439378611470523767474161097395335978963449103375113181061956113761255208252845977501293775012421222071273030489768971896571456857587232384900920787775743584210487
#c= 8123660403700752816173253351256346738141368482895811613771238683654285789340590141032410829369317060698717839596227927880804069379729264458821830480403028873516453892961352325975996489782358502955978545276845919496487216243137671457277388535973765817630577017817091930333210865522601489481118651859667059909808542186311266806151933776585721470340298989119099989444591860964732022084902837501740296579826786298276396156446636497694372162918550437937900273273867914333400671141318505701196889770278427579749448890734305381206175703959731222224473843633586394125991890624875768072414819962926318857114839026947065275559
直接给出了4个元素的值
和上个题差不多的解法
import libnum
p= 12723142120869732634088432197707819803507240293300061431173331805617171978089883597534066370602995679812668052610693259459075675608655496049581799707213179
q= 8900852514713147139651513059818922084330369100740608813073296241091158626036379697255585984179819201002123713678282378132063241352222088969982548549315719
r= 12064725865231337533098951153642907764505518107372279102766775472989619174722644336981226535437875987362995139874060388450720197597731017505899834387134263
z= 12914162225504946264813763202793919819471686475362098252206870607294877319696009480915212066260576299162116303490758124293139654751399961014385254783128949
n= 17644513130731155670074406197128796026086459954267871807474253498266692162535213701704272353257163007614478767225685841167399105274097620232857668700563389692870378886177896662440512079480265261757579696679888155857841428740769833273503735243470876318726384846715661198513277463318404618291358669060535774013436171781341251556328022640288742688873513937857961297517027261021954474835202280244815586668812370434215844470519490712566049458135679795641468615439378611470523767474161097395335978963449103375113181061956113761255208252845977501293775012421222071273030489768971896571456857587232384900920787775743584210487
e= 65537
c= 8123660403700752816173253351256346738141368482895811613771238683654285789340590141032410829369317060698717839596227927880804069379729264458821830480403028873516453892961352325975996489782358502955978545276845919496487216243137671457277388535973765817630577017817091930333210865522601489481118651859667059909808542186311266806151933776585721470340298989119099989444591860964732022084902837501740296579826786298276396156446636497694372162918550437937900273273867914333400671141318505701196889770278427579749448890734305381206175703959731222224473843633586394125991890624875768072414819962926318857114839026947065275559
phi_n = (p-1)*(q-1)*(r-1)*(z-1)
d = libnum.invmod(e, phi_n)
m = pow(c, d, n)
print(libnum.n2s(m).decode())import libnum
p= 12723142120869732634088432197707819803507240293300061431173331805617171978089883597534066370602995679812668052610693259459075675608655496049581799707213179
q= 8900852514713147139651513059818922084330369100740608813073296241091158626036379697255585984179819201002123713678282378132063241352222088969982548549315719
r= 12064725865231337533098951153642907764505518107372279102766775472989619174722644336981226535437875987362995139874060388450720197597731017505899834387134263
z= 12914162225504946264813763202793919819471686475362098252206870607294877319696009480915212066260576299162116303490758124293139654751399961014385254783128949
n= 17644513130731155670074406197128796026086459954267871807474253498266692162535213701704272353257163007614478767225685841167399105274097620232857668700563389692870378886177896662440512079480265261757579696679888155857841428740769833273503735243470876318726384846715661198513277463318404618291358669060535774013436171781341251556328022640288742688873513937857961297517027261021954474835202280244815586668812370434215844470519490712566049458135679795641468615439378611470523767474161097395335978963449103375113181061956113761255208252845977501293775012421222071273030489768971896571456857587232384900920787775743584210487
e= 65537
c= 8123660403700752816173253351256346738141368482895811613771238683654285789340590141032410829369317060698717839596227927880804069379729264458821830480403028873516453892961352325975996489782358502955978545276845919496487216243137671457277388535973765817630577017817091930333210865522601489481118651859667059909808542186311266806151933776585721470340298989119099989444591860964732022084902837501740296579826786298276396156446636497694372162918550437937900273273867914333400671141318505701196889770278427579749448890734305381206175703959731222224473843633586394125991890624875768072414819962926318857114839026947065275559
phi_n = (p-1)*(q-1)*(r-1)*(z-1)
d = libnum.invmod(e, phi_n)
m = pow(c, d, n)
print(libnum.n2s(m).decode())
N是p的5次方
import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
print(flag)
m = libnum.s2n(flag)
p = libnum.generate_prime(512)
n = p ** 5
e = 65537
c = pow(m, e, n)
print("n=", n)
print("e=", e)
print("c=", c)
#n = 109671394618534156590716540772306636060550711465455829526382945168271125218007503161807386153286648328529071790130095763349089936429151343426469415497138306284842512691195220650548494501337831207724397925027651025644976364368511262187227825083865690186591571250267479440100917127211656877566179258870510690665025580200477574123634259670039152125607834855408269848826938902407472374892693266119859709658788565014195766992713646832624001067898323913639712284673673557898135411273837250194079399384826384835709060797351332323930309379071015140548478132323474993964925055399350661600068568602468295748573856804293659942047543032878436316918991716636681116631322082919386178460096115355963882313682994343822128626370850455024905542367255179074441679461101331332093019368492643
#c = 83166081100602571613112201467626632459949037182633475449066025299006894059443612622701975752551708249083077180755342065457682925338233793688583913228361068561515321097016501900442865692643652803949920987493441500744743553498018003210308290969303190355756775977367324120441564693220728163622472865572357639056734898022442794130514936425334924283145153496702507951466618177405870656868713199816223765264228006032228439676574053839549440372521050502986043855511540855864034336902304414848547480112182226920285820386643015671106933140105835060319823245206934565859078021518312305243997612804935774414840491355098017977514736057368000596388974956265042651277403519473262257945986199408278855335170546242641727930526697102351648388874227840119205560199015181257296591985205818
#p = 10186351850605898834333098258639828910824016865517013383611935945131883947448223014077315468253377357594775340263769153442019216205089695821439736926082483
解题思路: n = p**r 且p为素数没有q了,因为p = q 那么计算n的欧拉函数phi_n = p^r - p^(r-1) 推导过程为: 欧拉函数phi_n 的定义是小于n的自然数中与n互质的个数。p^r质数就只有p,那么不与它互质的数都含有p,和它不沪指的数的个数: p^r/p = (p^r)-1/p = p^(r-1) 剩下就是互质的数,其个数就是p^r - p^(r-1) 则有: phi_n = p^r - p^(r-1)
import gmpy2
import libnum
n = 109671394618534156590716540772306636060550711465455829526382945168271125218007503161807386153286648328529071790130095763349089936429151343426469415497138306284842512691195220650548494501337831207724397925027651025644976364368511262187227825083865690186591571250267479440100917127211656877566179258870510690665025580200477574123634259670039152125607834855408269848826938902407472374892693266119859709658788565014195766992713646832624001067898323913639712284673673557898135411273837250194079399384826384835709060797351332323930309379071015140548478132323474993964925055399350661600068568602468295748573856804293659942047543032878436316918991716636681116631322082919386178460096115355963882313682994343822128626370850455024905542367255179074441679461101331332093019368492643
e = 65537
c = 83166081100602571613112201467626632459949037182633475449066025299006894059443612622701975752551708249083077180755342065457682925338233793688583913228361068561515321097016501900442865692643652803949920987493441500744743553498018003210308290969303190355756775977367324120441564693220728163622472865572357639056734898022442794130514936425334924283145153496702507951466618177405870656868713199816223765264228006032228439676574053839549440372521050502986043855511540855864034336902304414848547480112182226920285820386643015671106933140105835060319823245206934565859078021518312305243997612804935774414840491355098017977514736057368000596388974956265042651277403519473262257945986199408278855335170546242641727930526697102351648388874227840119205560199015181257296591985205818
p = 10186351850605898834333098258639828910824016865517013383611935945131883947448223014077315468253377357594775340263769153442019216205089695821439736926082483
# n=p**5
phi = (p - 1) * p ** 4
d = gmpy2.invert(e, phi) #计算公式d=e^-1(mod phi)
m = pow(c, d, n)
print(libnum.n2s(int(m)).decode())
N是p的3次方和q
#题目即出题脚本
import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
p = libnum.generate_prime(512)
q = libnum.generate_prime(512)
n = p ** 3 * q
e = 65537
c = pow(m, e, n)
print("q=", q)
print("n=", n)
print("e=", e)
print("c=", c)
#q = 13345672330679418443866848695749753384841350112452462690350565885192764753702964893062035116023096943358384379827500462723016224486435032522188166109529147
#n = 4663711063632671446966617442890809468548735750386480905820144168615122369358088158709822723959108989276525102755551604204514586528122441075489492157644479194671784485228731421500391142158401889177506319977349707503678947872777602384171260874359045585814189677748712566088220734735479518470883541166059233676170283938881683675790979128058243582825012415020019043126740915522571217495119060031729061070896580899732991209113679151755713858497630999746612658308778711613697038750661479517187094033129979714688161348844542070263109259258937863241431480105798790363889436471998002323269704182369356300287043940743500087239
#c = 4050303218893912343776312253598257474375000778822229482734626960955864773175090306426885201033332266573903303684635688485414725284644108123459136702775991157244389086147955395682206311752151842740679445903864544823592773331496589661187968392779340028173948172003460012051289357755574536619241969492822938688821287700132262703677149526846356206143053559703859606442209340834979412336031660590507709503830013770022485005101363701272279629510056964018618212014677531338026866748075406283893942248599825641124694672878533987994699411744521757385858889763503705242690212615083634186373933214686193717950163215308138805348
#p = 7043638514877708625347510509234285437455073680720519890604877400872929338715742690986696345788770257715966066407870250705514125001666470405076090436993533
解题思路: N是p的3次方 首先,思路和上道是一样的只不过把p的3次方看成一个整体,q也看成一个成体 也就是p = p^3 q = q 然后phi_n = (p - 1) * p ** 2 * (q - 1) 接下来正常求解就行
import gmpy2
import libnum
q = 13345672330679418443866848695749753384841350112452462690350565885192764753702964893062035116023096943358384379827500462723016224486435032522188166109529147
n = 4663711063632671446966617442890809468548735750386480905820144168615122369358088158709822723959108989276525102755551604204514586528122441075489492157644479194671784485228731421500391142158401889177506319977349707503678947872777602384171260874359045585814189677748712566088220734735479518470883541166059233676170283938881683675790979128058243582825012415020019043126740915522571217495119060031729061070896580899732991209113679151755713858497630999746612658308778711613697038750661479517187094033129979714688161348844542070263109259258937863241431480105798790363889436471998002323269704182369356300287043940743500087239
e = 65537
c = 4050303218893912343776312253598257474375000778822229482734626960955864773175090306426885201033332266573903303684635688485414725284644108123459136702775991157244389086147955395682206311752151842740679445903864544823592773331496589661187968392779340028173948172003460012051289357755574536619241969492822938688821287700132262703677149526846356206143053559703859606442209340834979412336031660590507709503830013770022485005101363701272279629510056964018618212014677531338026866748075406283893942248599825641124694672878533987994699411744521757385858889763503705242690212615083634186373933214686193717950163215308138805348
p = 7043638514877708625347510509234285437455073680720519890604877400872929338715742690986696345788770257715966066407870250705514125001666470405076090436993533
phi_n = (p - 1) * p ** 2 * (q - 1)
d = gmpy2.invert(e, phi_n)
m = pow(c, d, n)
print(libnum.n2s(int(m)).decode())