SWPU-NSSCTF-WP
- happy
('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL') ('e=', '0x872a335') #q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586 #qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
题解:
根据可知q + q*p^3与q*p + q *p^2
h1=q + q*p^3=q(1+p)(p^2-p+1)
h2=q*p+q*p^2=q(1+p)p
gcd=q(1+p)
p=h2/q(1+p)
q=gcd//(p+1)
解题代码如下:
from Crypto.Util.number import * from gmpy2 import * c=0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e e=0x872a335 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594 h1 =#q + q*p^3 h2 = #q*p + q *p^2 gift = gcd(hint1,hint2) p = hint2//gift q = gift // (p+1) n= p*q phi = (p-1)*(q-1) d = invert(e, phi) flag = pow(c, d, n) print(long_to_bytes(flag))
- BigRSA!
from Crypto.Util.number import * from flag import * n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 m = bytes_to_long(flag) c = pow(m, e, n1) c = pow(c, e, n2) print("c = %d" % c) # output # c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
题解:
题目给出n1、n2,判断是否存在一个公因数,如果存在则共享素数
from Crypto.Util.number import * import gmpy2 n1 = n2 = e = 65537 q=gmpy2.gcd(n1,n2)#判断是否共素 p1=n1//q p2=n2//q d1=gmpy2.invert(e,(q-1)*(p1-1)) d2=gmpy2.invert(e,(q-1)*(p1-1)) c= m=pow(c,d2,n2) m=pow(m,d1,n1) print(long_to_bytes(m))
- Crypto2
from gmpy2 import * from Crypto.Util.number import * flag = '**********' p = getPrime(512) q = next_prime(p) m1 = bytes_to_long(bytes(flag.encode())) e = 0x10001 n = p*q flag1 = pow(m1,e,n) print('flag= '+str(flag1)) print('n= '+str(n)) flag= 10227915341268619536932290456122384969242151167487654201363877568935534996454863939953106193665663567559506242151019201314446286458150141991211233219320700112533775367958964780047682920839507351492644735811096995884754664899221842470772096509258104067131614630939533042322095150722344048082688772981180270243 n= 52147017298260357180329101776864095134806848020663558064141648200366079331962132411967917697877875277103045755972006084078559453777291403087575061382674872573336431876500128247133861957730154418461680506403680189755399752882558438393107151815794295272358955300914752523377417192504702798450787430403387076153
题目已知e1和e2,可知是共模攻击
import gmpy2 from Crypto.Util.number import * e1= e2= c1 = c2 = n = g,x,y = gmpy2.gcdext(e1, e2) m = pow(c1, x , n) * pow(c2, y, n) % n print(long_to_bytes(m))
- 这是Base?
dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
chipertext:
FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw
import base64 dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='} a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' #标准表 c='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw' ds='' #把dict转换成字符串方便处理 for i in range(65): ds+=dict[i] l=[] for i in range(len(c)): l.append(ds.index(c[i])) #无论换不换表,base64变换本身产生的6位二进制数对应的十进制数是不变的,这里就是找到密文c的每个字符在dict表中键值 #print(l) #l中存的是索引值(下标数字) m1='' for ll in l: m1+=a[ll] #找到l中所存的每个数字在标准的base64加密表中所对应的字符 print(m1) #m1是标准base64表编码结果 m2=base64.b64decode(m1) #直接调用函数恢复出明文 print(m2)
- MD5爆破
from Crypto.Util.number import * from hashlib import md5 from secret import flag #flag全是由小写字母及数字组成 m=md5(flag).hexdigest() print(flag[:13]+flag[15:18]+flag[19:34]+flag[35:38]) print(m) # b'LitCTF{md5can3derypt213thoughcrsh}' # 496603d6953a15846cd7cc476f146771
from Crypto.Util.number import * import string import hashlib dic = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_}{' for i in dic: for j in dic: for k in dic: for l in dic: s = 'LitCTF{md5can'+i+j+'3de'+k+'rypt213thoughcr'+l+'sh}' print(s) if hashlib.md5(s.encode('utf-8')).hexdigest() == '496603d6953a15846cd7cc476f146771': print("Find it: "+s) exit(0)
- Crypto2
from gmpy2 import * from Crypto.Util.number import * flag = '***************' p = getPrime(512) q = getPrime(512) m1 = bytes_to_long(bytes(flag.encode())) n = p*q e1 = getPrime(32) e2 = getPrime(32) print() flag1 = pow(m1,e1,n) flag2 = pow(m1,e2,n) print('flag1= '+str(flag1)) print('flag2= '+str(flag2)) print('e1= ' +str(e1)) print('e2= '+str(e2)) print('n= '+str(n)) #flag1= 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280 #flag2= 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075 #e1= 3247473589 #e2= 3698409173 #n= 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313
- yafu(中级)
from Crypto.Util.number import * from secret import flag m = bytes_to_long(flag) n = 1 for i in range(15): n *=getPrime(32) e = 65537 c = pow(m,e,n) print(f'n = {n}') print(f'c = {c}') ''' n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307 c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717 '''
使用yafu分解出多个p计算代码如下:
import gmpy2 from Crypto.Util.number import long_to_bytes n = 15241208217768849887180010139590210767831431018204645415681695749294131435566140166245881287131522331092026252879324931622292179726764214435307 e = 65537 c = 12608550100856399369399391849907846147170257754920996952259023159548789970041433744454761458030776176806265496305629236559551086998780836655717 p1=2151018733 p2=2201440207 p3=2315495107 p4=2585574697 p5=2719600579 p6=2758708999 p7=2767137487 p8=2906576131 p9=2923522073 p10=3354884521 p11=3355651511 p12=3989697563 p13=4021078331 p14=4044505687 p15=4171911923 phi = (p1 - 1) * (p2 - 1) * (p3 - 1) * (p4 - 1) * (p5 - 1) * (p6 - 1) * (p7 - 1) * (p8 - 1) * (p9 - 1) * (p10 - 1) * (p11 - 1) * (p12 - 1) * (p13 - 1) * (p14 - 1) * (p15 - 1) d = gmpy2.invert(e, phi) m = pow(c, d, n) print(long_to_bytes(m))
- childRSA
from random import choice from Crypto.Util.number import isPrime, sieve_base as primes from flag import flag def getPrime(bits): while True: n = 2 while n.bit_length() < bits: n *= choice(primes) if isPrime(n + 1): return n + 1 e = 0x10001 m = int.from_bytes(flag.encode(), 'big') p, q = [getPrime(2048) for _ in range(2)] n = p * q c = pow(m, e, n) # n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513 # c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
费马定理求解:
from Crypto.Util.number import isPrime, sieve_base as primes,long_to_bytes import gmpy2 e = 65537 n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513 c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108 num=1 for i in primes: num*=i p=gmpy2.gcd(gmpy2.powmod(2,num,n)-1,n) q=n//p d=gmpy2.invert(e,(p-1)*(q-1)) m=gmpy2.powmod(c,d,n) print(long_to_bytes(m))
- e的学问
from Crypto.Util.number import * m=bytes_to_long(b'xxxxxx') p=getPrime(256) q=getPrime(256) e=74 n=p*q c=pow(m,e,n) print("p=",p) print("q=",q) print("c=",c) #p= 86053582917386343422567174764040471033234388106968488834872953625339458483149 #q= 72031998384560188060716696553519973198388628004850270102102972862328770104493 #c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
import gmpy2 from Crypto.Util.number import * # 当e约去公约数后与phi互素 def decrypt(p, q, e, c): n = p * q phi = (p - 1) * (q - 1) t = gmpy2.gcd(e, phi) d = gmpy2.invert(e // t, phi) m = pow(c, d, n) print(m) msg = gmpy2.iroot(m, t) print(msg) print(long_to_bytes(msg[0])) e=74 p= 86053582917386343422567174764040471033234388106968488834872953625339458483149 q= 72031998384560188060716696553519973198388628004850270102102972862328770104493 c= 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123 decrypt(p, q, e, c)

浙公网安备 33010602011771号