1、RSAROLL
题目介绍:
RSA roll!roll!roll!
Only number and a-z
(don’t use editor
which MS provide)
然后是题目:
{920139713,19}
704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148
分析得出{920139713,19}是公钥
N = 920139713
e = 19
这里的N较小我们可以用yafu进行分解
直接打开yafu-
输入命令factor(n)便能在当前目录下生成factor.log,分解n得出p、q
余下的便都是c,但是这个c的个数很多需要循环
import gmpy2 as gp
p = gp.mpz(49891)
q = gp.mpz(18443)
n = gp.mpz(920139713)
e = gp.mpz(19)
fai = (p-1)*(q-1)
d = gp.invert(e,fai)
f = open('H:/Python3.0Work/Crypto/1.txt','r')
while 1 :
F = int(f.readline()) #会报错但是问题不大
if not F:
break
else:
c = gp.mpz()
c = F
m = pow(c,d,n)
print(chr(m),end='')
结果如下:
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
2、 2021山东省网络安全决赛(题目:rsssssa8)
题目附件如下
from Crypto.Util.number import *
from secret import flag
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 3
a = getPrime(16)
b = getPrime(16)
c1 = pow(flag, e, n)
c2 = pow(a*flag+b, e, n)
print("c1 =",c1)
print("c2 =",c2)
print("n =",n)
print("a =",a)
'''
c1 = 184706733600030961911836917506112422167545490484023895702890946835667701083139603160422181673643482375812680575389095142687410989330788033710088246782628789557043348703224329521695342998531932006194716597523162472306119232610211018033794397444557249275490146884605734496362904120178078821
c2 = 10418682562718909042213936587910449264489833039364911527081051331485882026176525975770460658763924467672782657658670208897885520552980202093589409615449950907692270444130539851619402510468945166179697778957796025706837202038217770754419639715026735344172221776217898364276354693723003323146147852444824
n = 62238551978433838001498457736429006991865583728626132139136256391485968857741649418990547571437762934449868634562245286176618471355786138381567476265484214608900167440511382125259943558246159258716213963735131393428605626773031068644321261445284230749457763679689698230585197310945795260304584991080604702929
a = 38351
'''
这题与BUU上Dangerous RSA属于同一种题,这题纯属加了一些混淆的条件
本题考点:低加密指数攻击
下面引用大佬们的话:
当n很大时,e很小,e=3
(因为选取e=3省时省力,本题的e便是3).
当e=3的时候满足下面条件:
1:m^3<n,也就是说m^3=c。
2:m^3>n,即(m^3+in)mod n=c(爆破i,不知道i取什么值)
假设我们 M^e / n 的商为 k 余数为C,
则M^e = kn + C,对K进行爆破,只要k满足 kn + C能够开e次方就可以得明文
我们写脚本如下:
import gmpy2
import libnum
e = 3
n = 62238551978433838001498457736429006991865583728626132139136256391485968857741649418990547571437762934449868634562245286176618471355786138381567476265484214608900167440511382125259943558246159258716213963735131393428605626773031068644321261445284230749457763679689698230585197310945795260304584991080604702929
c1 = 184706733600030961911836917506112422167545490484023895702890946835667701083139603160422181673643482375812680575389095142687410989330788033710088246782628789557043348703224329521695342998531932006194716597523162472306119232610211018033794397444557249275490146884605734496362904120178078821
k=0
while 1:
res = gmpy2.iroot(c1+k*n,e)
if(res[1] == True):
print(libnum.n2s(int(res[0]))) #转为字符串
break
k=k+1
3、Simple_rsa
调查人员通过监听网络数据截取了以下消息。这次,网络罪犯使用了一个更先进的加密算法进行加密,这个加密算法叫做 RSA。
参数如下:
N = 84692954109552769374106613978990493265631425360379150170786955314741169348953
e = 65537
下面是加密之后的消息:
C = 21698323120385586424573862118808098555103084743518277473544693629498197679429
成功解密之后的消息可以被转换成一个有意义的英文字符串。
拿到这一题可以直接对N进行分解,如下得到p、q
脚本如下
import gmpy2
import binascii
import libnum
#经典给出四个参数
p = gmpy2.mpz(320181056072095218868339092717483179171)
q = gmpy2.mpz(264515818482660146971535304176490802643)
e = gmpy2.mpz(65537)
c = gmpy2.mpz(21698323120385586424573862118808098555103084743518277473544693629498197679429)
n = p * q
pai = (p-1)*(q-1)
d = gmpy2.invert(e,pai)
m = pow(c,d,n)
print(libnum.n2s(int(m)))