CTF笔记

RSA

基本计算

e^d % phi = 1
d = pow(e, -1, phi)
d = gmpy2.invert(e,phi)

m=c^d % n
m = pow(c,d,n)

c=m^e % n
c = pow(m,e,n)

加密

from Crypto.Util.number import getPrime, bytes_to_long

def RSAEnc():
    p = getPrime(512)
    q = getPrime(512)
    n = p * q
    e = 0x10001
    flag = b"flag{this_is_a_real_flag}"
    m = bytes_to_long(flag)
    c = pow(m, e, n)
    return n, e, c, p, q

n, e, c, p, q = RSAEnc()
print(f"n = {n}\ne = {e}\nc = {c}\np = {p}\nq = {q}")
'''
n = 87462856400300005807532929502465255372771180254467579879222779394499715828082888134676681185920001266873249220248399230051893090914884873024288975576421122383401284103643422557123057963265877048737312125727553683156345823197412043193302924073492338548835268923314192114199491844497187416638061901836664007907
e = 65537
c = 37053863689515056106825068984635342875688264801274851772772740026293191761284483878804434205848579371278765818224870666156380550252351027631098947175850382534154380074131509303710615257498850242882346259193648386930546232650151389630191897785420927110378517500366947241599894433066863144531322207753301801423
p = 7476368912005014620727644607969876059577090651259047791892628709463149012347382081992471715567339123664010051674140199294850244179639632765725169164284627
q = 11698574191524772352607019282562105920451262435826610724676876008788513674573458855801965986248121863541160053707226749506920325922307948047817610837406641
'''

解密

from Crypto.Util.number import long_to_bytes

def RSADec(n, e, c, p, q):
    phi = (p-1)*(q-1)
    d = pow(e, -1, phi)
    m = pow(c, d, n)
    return long_to_bytes(m)

#n = p*q
def RSADec2(e, c, p, q):
    n = p*q
    phi = (p-1)*(q-1)
    d = pow(e, -1, phi)
    m = pow(c, d, n)
    return long_to_bytes(m)

n = 87462856400300005807532929502465255372771180254467579879222779394499715828082888134676681185920001266873249220248399230051893090914884873024288975576421122383401284103643422557123057963265877048737312125727553683156345823197412043193302924073492338548835268923314192114199491844497187416638061901836664007907
e = 65537
c = 37053863689515056106825068984635342875688264801274851772772740026293191761284483878804434205848579371278765818224870666156380550252351027631098947175850382534154380074131509303710615257498850242882346259193648386930546232650151389630191897785420927110378517500366947241599894433066863144531322207753301801423
p = 7476368912005014620727644607969876059577090651259047791892628709463149012347382081992471715567339123664010051674140199294850244179639632765725169164284627
q = 11698574191524772352607019282562105920451262435826610724676876008788513674573458855801965986248121863541160053707226749506920325922307948047817610837406641

m=RSADec(n,e, c, p, q)
print(m)

m2=RSADec2(e, c, p, q)
print(m2)

'''
b'flag{this_is_a_real_flag}'
'''

题目

pq相近,计算pq

'''
前提
p q为大素数
n = p*q,
pq相近,如何求pq

思路
根号n 在pq之间

64 = 4 * 16
64 = 8 * 8
8在4到16之间
'''

import gmpy2
n = 48641747468919698054025912517018552867724699486623930083560745781744532903942458575968397542686750172648727390822545965259684410882106643581530968943177866995135567239144975978002279070372081673543618556946357139928586457439942111440193658127315045400227854127214944096730376324055535964708344349828244070161136369520433563496165615402664996155055346548655491863141436522136568829169368042974746546132699411427853422186083744522415905848886819720869665439535548548690060481410890687197450334265777870709967301725106186911514001855130071230131197296348005970697245744655011476813758831599550779443704367400459024070820729
tmp=gmpy2.iroot(n,2)[0] #给n开平方,如果不是整数,则返回最接近的整数
q=gmpy2.next_prime(tmp) #比tmp大的下一个素数
p=n//q 
print(f"p={p}\nq={q}")
'''
p=6974363588810071353952022906675918004177791699283683778403836217274645375059656902112110756713432483965595763618066622602670429442467681981591123320897037179426675363066894985988391208230422378773401560077737570900942194269279178763579462085091442684075310006970990908854954600603208307335644160655677117256561
q=6974363588810071353952022906675918004177791699283683778403836217274645375059656902112110756713432483965595763618066622602670429442467681981591123320897037179426675363066894985988391208230422378773401560077737570900942194269279178763579462085091442684075310006970990908854954600603208307335644160655677117258889
'''

#方法讲解
print(gmpy2.iroot(10,2)[0]) #整数部分是3 
print(gmpy2.iroot(9,2)) #(mpz(3), True)
print(gmpy2.iroot(64,3)) #(mpz(4), True)

e比较小

'''
c=pow(m,e,n)
c=m^e % n
m=(k*n+c)开e次方,能整除的情况
'''
import gmpy2
from Crypto.Util.number import long_to_bytes

n=99858677705857368746920429655841298115935870541912567819864584956763773470194930205864867405452155817822846040531547313828579965316794310791890122062794321728665814864603616491750457845365043442871600874702061195023262227179375774716193859723383407654520371487629974437948049613555259692719972638310609386139    
e=3    
c=1254972654399110648328798822673036006829834930565666814353584210042389968766751661784850476925365545351343153531536336238984814542046840076642248417523142916407034918224042633161398222723239879212150373      
for k in range(0,100):
    res = gmpy2.iroot(c+n*k,3)#(mpz(10786438895799378355441942117737005108500683156225581105531465315197), True)
    if res[1]: #能整除
        print(long_to_bytes(res[0])) 
        break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值