buuctf
- RSA:
-
- 1.算法描述:
- 2.解题:
-
- 题一:(pqce)
- buuctf-RSA:(pqe)
- dp,dq泄露-buuctf-RSA1:(p q dp dq c)
- 公钥解析-decrypt(d,n,p,q,e)-BUU_RSA
- Roll按行加密- BUUCTF-RSAROLL
- 低解密指数攻击-维纳攻击-buuctf-rsa2(e特别大,n基本分解不了)
- Newctf-rsa256
- Newctf-bigexponent
- dp泄露(e,n,dp,c)
- 利用公约数求解-glitch(n1 n2 c1 c2 e)
- 共模攻击(n,c1,c2,n1,n2)
- 低加密指数攻击 e=3 buu-dangerousrsa
- buu-[GUET-CTF2019]BabyRSA-n=(p+1)(q+1)-(p+q)-1
RSA:
1.算法描述:
(1)选一对不同且够大的素数p,q
(2)计算n=pq
(3)计算f(n)=(p-1)(q-1),p,q保密
(4)找个与f(n)互质的数,e1<e<f(n)
(5)计算d,使得d*e≡1 mod f(n)
≡是数论中表示同余的符号。
公式中,≡符号的左边必须和符号右边同余,即两边模运算结果相同。
不管f(n)取什么值,符号右边1 mod f(n)的结果都等于1;
符号的左边d与e的乘积做模运算后的结果也必须等于1。
这就需要计算出d的值,让这个同余等式能够成立。
(6)公钥KU=(e,n),私钥KR=(d,n)。
(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。
设密文为C,
则加密过程为:C≡Me(mod n)。
(8)解密过程为:M≡Cd(mod n)。
有了上面的RSA基础可以知道RSA中的
p: 第一个大素数
q: 第二个大素数
模数n: n = p*q
f(n)=(p-1)*(q-1)
公钥指数e: 与 f(n)互质, 且 1 < e < f(n)
私钥指数d: 满足e * d ≡ 1 (mod f(n))
公钥 = {n, e},一般公开
私钥 = {d, e}
密文=明文的E次方除以N取余数
E=Encryption(加密)
N=Number(数字)
所以:公钥=(E,N)
明文=密文的D次方除以N的余数
D=Decryption(解密)
所以:私钥=(D,N)
### N=p*q (俩大质数)
### L=Lcm(p-1,q-1) (中间过程中的数)
### gcd=(E,L)=1 (E与L最大公约数=1)
### E*D mod L=1 (E*L除以L的余数=1)
2.解题:
题一:(pqce)
源:buuctf-rsarsa
方法Ⅰ:
p =
9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =
11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
d=56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
c =
83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034Use RSA to find the secret message
得到D:
56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
- 用Python环境(win+r,输入cmd,输入Python2或者Python) /* 因为有Python2,python3的环境 */
- ①代码
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
n = 114573516752272714750064227635008832737477859608443481000717283425702025029279291376859256856603741797722497252841363753834114679306784379319341824813349417007577541466886971550474580368413974382926969910999462429631003527365143148445405716553105750338796691010126879918594076915709977585368841428779903869581
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
flag=pow(c, d, n)
print(flag)
②代码:
#!/usr/bin/python
import gmpy2
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = q*p
phi = (q-1) * (p-1)
d = gmpy2.invert(e,phi)
m = gmpy2.powmod(c,d,n)
print(m)
方法Ⅱ:
学习RSAtool2的使用:
1.Number Base 设置为十进制
2.注意:Public Exponent这里要使用16进制的数,如果公钥e=17的话,就应该填入十六进制的11
3.给出p,q,e的话直接填入,再点击Calc.D,获得d
4.给出的是n和e的话,输入n和e,点击Factor N(分解),得到p,q,再重复第3步就能得到d了
工具中的e65537要转成十六进制10001
然后再用python函数pow()即可求出flag
M = pow(C,d,n) #快速求幂取模运算
print(M)
buuctf-RSA:(pqe)
题目:
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flag提交
解题
利用工具:
求出d
题目三:(pqce)
源:G1itch-RSA
题目:
2^16+1
p = 1619457011962613889034092691100138481201392787160018861588882624360276930879984504721332613
q = 1930644580807360024179365101463872960800671765127817730222044332809690977077925368011467259
c = 591746946043509417154408651370020140882201187961060440894988228260125420535482616849793702495189458033191552493861512032310747532849126740960428065188251472016781567743780417376053
利用RSAtool
d=282465615276563040081497973595549857788146309975080032793709254291441593209360198444114432827219700106928284122876273688064794480258663235512816851680160190236609060383273992683295427524241801788740189903764974847338559875531097243379661562017591581726354417289537
代码:
e = 65537
p = 1619457011962613889034092691100138481201392787160018861588882624360276930879984504721332613
q = 1930644580807360024179365101463872960800671765127817730222044332809690977077925368011467259
n = p*q
#密文
C = 591746946043509417154408651370020140882201187961060440894988228260125420535482616849793702495189458033191552493861512032310747532849126740960428065188251472016781567743780417376053
d = 282465615276563040081497973595549857788146309975080032793709254291441593209360198444114432827219700106928284122876273688064794480258663235512816851680160190236609060383273992683295427524241801788740189903764974847338559875531097243379661562017591581726354417289537
#求明文
M = pow(C,d,n) #快速求幂取模运算
print(M)
解得: