1.RSA
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求d.
import gmpy2
p=473398607161
q=4511491
e=17
d = gmpy2.invert(e,(q-1)*(p-1))
print(d)
2.Alice与Bob
用分解大整数工具将98554799767分解为101999 · 966233,对新合成的数字101999966233进行md5的32位小写哈希。
哈希计算工具
3.rsarsa
可用工具求出私钥d=56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
再用python函数pow()即可求出flag
e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p*q
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
M = pow(C,d,n) #快速求幂取模运算
print(M)
4.大帝的密码武器
题目:公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。
密文:ComeChina
用的是凯撒密码,解密FRPHEVGL,当偏移量为13时,得到有意义的单词security。
对ComeChina加密得到flag{PbzrPuvan},要注意大小写。
5.Windows系统密码
MD5一个个解密,对ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::中的第二条32位字符数据进行MD5解密,得到flag{good-luck}.
6.[BJDCTF 2nd]cat_flag
gif中两种小猫分别对应二进制数0和1,则下图可用二进制表示为
01000010010010100100010001111011010011010010000101100001001100000111111001111101
再将其转换为字符串得到BJD{M!a0~}.
7.[BJDCTF 2nd]燕言燕语-y1ng
题目:小燕子,穿花衣,年年春天来这里,我问燕子你为啥来,燕子说:
79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D2
考虑是个十六进制序列,将其转化为字符串得yanzi ZJQ{xilzv_iqssuhoc_suzjg}.
猜测使用了维吉尼亚密码,将yanzi作为密钥进行解密得到BJD{yanzi_jiushige_shabi}
8.传统知识+古典密码
根据六十甲子相关数表得到各个年份对应的数字,根据提示,一甲子为60年,每个数字再加上60,得到八个数字88 90 83 68 77 70 76 90,猜测为ASCII码,解码得到XZSDMFLZ
古典密码就用栅栏和凯撒密码一次尝试,最后找到SHUANGYU
9.[GKCTF2020]小学生的密码学
e(x)=11x+6(mod26)
密文:welcylk
(flag为base64形式)
观察是仿射加密,解密得到sorcery
flag为base64形式,转换一下得到flag{c29yY2VyeQ==}
10.信息化时代的步伐
也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文!)
注意:得到的 flag 请包上 flag{} 提交
密文:606046152623600817831216121621196386
标准中文电码:中国汉字多达6万字,常用的汉字只有一万个左右, 所以用10的4次方(10,000)来表示。中文电码表采用了四位阿拉伯数字作代号,简称“四码电报”,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。
用中文电码工具查询对应中文得到:计算机要从娃娃抓起
11.[BJDCTF 2nd]灵能精通-y1ng
身经百战的Y1ng已经达到崇高的武术境界,以自律克己来取代狂热者的战斗狂怒与传统的战斗形式。Y1ng所受的训练也进一步将他们的灵能强化到足以瓦解周遭的物质世界。借由集中这股力量,Y1ng能释放灵能能量风暴来摧毁敌人的心智、肉体与器械。
给文件添加后缀.jpg,得到图片:
用到的是猪圈密码的变形,圣堂武士密码,解密得到flag{IMKNIGHTSTEMPLAR}。
猪圈密码,一种以格子为基础的简单替代式密码:
圣堂武士密码(Templar Cipher),共济会的“猪圈密码”的一个变种:
12.RSAROLL
题目给出了n,e,c,发现n比较小,可对n直接进行分解920139713 = 18443 · 49891,从而获得该RSA的私钥。
import gmpy2
n=920139713
e=19
c=[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]
p=18443
q=49891
phin=(p-1)*(q-1)
d=gmpy2.invert(e,phin)
flag=""
for i in c:
flag=flag+chr(pow(i,d,n))
print(flag)
#flag{13212je2ue28fy71w8u87y31r78eu1e2}
13.坏蛋是雷宾
题目:老牌刺客之王混进了女王的住所。一天,女王得到了一个匿名举报,说她的侍卫里有一个刺客,叫做Rabin,而他的信息就在一份文件里,文件中有附带一个Pk,是523798549,密文是162853095,校验码二进制值是110001,根据说明是放在明文后一起加密的,明文与密文长度相同。加密算法和这位老牌刺客同名。快拯救女王,答案是求得的明文,进行32位md5小写哈希字符串,提交即可。 注意:得到的 flag 请包上 flag{} 提交。
观察到n较小,可直接分解为:523798549 = 10663 · 49123
根据题意可知为Rabin算法。
Rabin是RSA衍生出来的一种算法。这种算法的特点在于e=2,加密方法是
而解密是
然后用扩展欧几里得计算出yq和yp,再用获得的yq和yp解密四个密文
import gmpy2
n=523798549
p=10663
q=49123
c=162853095
inv_p = gmpy2.invert(p, q)
inv_q = gmpy2.invert(q, p)
mp = pow(c, 2666, p)
mq = pow(c, 12281, q)
a = (inv_p * p * mq + inv_q * q * mp) % n
b = n - int(a)
c = (inv_p * p * mq - inv_q * q * mp) % n
d = n - int(c)
for i in (a, b, c, d):
print(bin(i)[2:])
得到了四个解,找到二进制符合题目的解:10010011100100100101010110001,剔除校验位110001。
转十进制再进行32位md5小写哈希得到flag{ca5cec442b2734735406d78c88e90f35}