from Crypto.Util.number import * from gmpy2 import * import uuid import gmpy2 flag='LZSDS{'+str(uuid.uuid4())+'}'
e=2026 c = 13760578729891127041098229431259961120216468948795732373975536417751222443069805775693845560005881981622202089883866395577154701229046245882282127054969114210307175116574178428823043817041956207503299220721042136515863979655578210499512044917781566303947681251248645504273995402630701480590505840473412765662 n = 14247038211821385209759067256846232227444163173099199085257790370590450749665206556163364754269182255358084948354345827898987234756662133974633117062902370811855466665351784027125333112663075085395676501121759786699720149098576433141817737564928779420725539793335830274229206316999461309927000523188222801659 hint1 = 8938538619961731399716016665470564084986243880394928918482374295814509353382364651201249532111268951793354572124324033902502588541297713297622432670722730 hint2 = 1493298155243474837320092849325750387759519643879388609208314494000605554020636706320849032906759121914762492378489852575583260177546578935320977613050647 # hint1 = p ^ q ---> hint1 = p ^ hint2 # hint2 = q p ^ q ^ q = q q = hint2 p = hint1 ^ hint2 #按位异或
n = p * q #模数n
phi = (p - 1) * (q - 1) #计算n的欧拉函数
k = gcd(e,phi) #e和phi的最大公约数 print(k)
d = gmpy2.invert(e//k, phi) #整除 m = pow(c, d, n)
flag = long_to_bytes(gmpy2.iroot(m,k)[0]) #gmpy2.iroot(m,k)[0] --->m 的k次根 print(flag)
''' 方式2: flag = gmpy2.iroot(m,k)[0] print(long_to_bytes(flag)) '''
运算明文m = pow(c,d,n)公式为 $$ M = C^dmodN $$ gmpy2.iroot(m,k)[0] —>计算m的整数k次根,并返回到元组(r,is_exact)中。
四、dp、dq泄露
[1]BUUCTF RSA2
题干:
e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * import gmpy2 import libnum
e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657
p = 13468634736343473907717969603434376212206335187555458742257940406618189481177835992217885676243155145465521141546915941147336786447889325606555333350540003 q = 18432009829596386103558375461387837845170621179295293289126504231317130550979989727125205467379713835047300158256398009229511746203459540859429194971855371
c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 n = p * q phi = (p-1) * (q-1) d = gmpy2.invert(e,phi) m = gmpy2.powmod(c,d,n) print(long_to_bytes(m))
p = libnum.generate_prime(1024) q = libnum.generate_prime(1024) e = 65537 n = p * q phi_n = (p - 1) * (q - 1) d = libnum.invmod(e, phi_n) dp = d % (p - 1) m = "" # m已经被出题人删除 m = libnum.s2n(m) n = p * q c = pow(m, e, n)
print("n=", n) print("e=", e) print("dp=", dp) print("c=", c)
e = 65537 for i inrange(1, e): 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 = (q - 1) * (p - 1) d = gmpy2.invert(e, phi) m = pow(c, d, n)
print(m) print(long_to_bytes(m))
五、看不懂的
[1]BUUCTF RSA
用notebook打开pub.key得到
—–BEGIN PUBLIC KEY—– MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+ /AvKr1rzQczdAgMBAAE= —–END PUBLIC KEY—–
公钥解析
爆破出p,q
1 2 3 4 5 6 7 8 9 10
import gmpy2 import rsa
e = 65537 n = 86934482296048119190666062003494800588905656017203025617216654058378322103517 p = 285960468890451637935629440372639283459 q = 304008741604601924494328155975272418463 phi = (p-1)*(q-1) d = gmpy2.invert(e,phi) print('d=',d)
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921 c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168 p = 9401433281508038261 q = 10252499084912054759 r = 11215197893925590897 s = 11855687732085186571 t = 13716847112310466417 phi = (p-1)*(q-1)*(r-1)*(s-1)*(t-1)