BUUCTF 刷题笔记——Crypto 1

2023-03-15 11:33:57 浏览数 (2)

BUUCTF 刷题笔记——Crypto 1

摩丝

本题提供一个文本文件,内含如下文本,很明显这是摩斯电码。

代码语言:javascript复制
.. .-.. --- ...- . -.-- --- ..-

以下为基本字母数字与其对应的摩斯电码表,对照表逐个解码即可。

字符

电码符号

字符

电码符号

字符

电码符号

字符

电码符号

A

.━

B

━ ...

C

━ .━ .

D

━ ..

E

F

..━ .

G

━ ━ .

H

....

I

..

J

.━ ━ ━

K

━ .━

L

.━ ..

M

━ ━

N

━ .

O

━ ━ ━

P

.━ ━ .

Q

━ ━ .━

R

.━ .

S

...

T

U

..━

V

...━

W

.━ ━

X

━ ..━

Y

━ .━ ━

Z

━ ━ ..

0

━ ━ ━ ━ ━

1

.━ ━ ━ ━

2

..━ ━ ━

3

...━ ━

4

....━

5

.....

6

━ ....

7

━ ━ ...

8

━ ━ ━ ..

9

━ ━ ━ ━ .

解码结果为 ILOVEYOU

password

本题提供的文本内容如下,需要我们根据已有信息猜密码。

代码语言:javascript复制
姓名:张三 
生日:19900315

key格式为key{xxxxxxxxxx}

密码共十位,已有信息可作为密码的有 zhangsan 以及生日数字序列 19900315,因此对该信息的全部或者部分提取并排列组合便可得出密码,当然本题较为简单,密码为 zs19900315。

变异凯撒

本题提供的文本内容如下,并提示这是变异凯撒。

代码语言:javascript复制
加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{ }

凯撒密码只是进行简单的操作操作,但是上述密文出现了数字以及 _、^ 等特殊字符,因此很可能是依照 ASCII 码表的移位操作。由于格式固定,即前五位为 flag{ 五个字符,可借此找出规律。

明文字符(码值)

密文字符(码值)

差值

f(102)

a(97)

5

l(108)

f(102)

6

a(97)

Z(90)

7

g(103)

_(95)

8

{(123)

r(114)

9

由上述表格中的数据可确认加密方式为按 ASCII 码表进行位移且位移大小逐个递增。

那写个脚本反推一下就行了。

代码语言:javascript复制
str = "afZ_r9VYfScOeO_UL^RWUc"
n = 5
flag = ""

for i in str:
    flag  = chr(ord(i)   n)
    n  = 1

print(flag)

得出 flag 为 flag{Caesar_variation}。

Quoted-printable

本题提供的文本内容如下,提示为 Quoted-printable 编码。

代码语言:javascript复制
=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

Quoted-printable 编码每三位表示一字节的数据,等号后即为两位十六进制数,可直接对应于该字节的数据。由于大部分用于非 ASCII 码表中的可打印字符,因此手算不现实,直接工具解码即可。

解码出的结果为 那你也很棒哦。

Rabbit

本题提供的文本内容如下,提示为 Rabbit 加密。

代码语言:javascript复制
U2FsdGVkX1/ ydnDPowGbjjJXhZxm2MP2AgI

有意思的加密方法,了解密文特征即前缀 U2FsdGVkX1 即可。剩下的直接丢进 解密网站 就行。

解密的结果为 Cute_Rabbit

篱笆墙的影子

本题提供的文本如下,提示篱笆墙的影子,根据密文样式及 flag 的默认前缀 flag{ 合理推测标题暗示栅栏密码。

代码语言:javascript复制
felhaagv{ewtehtehfilnakgw}

所谓栅栏密码,就是把要加密的明文分成 N 个一组,然后循环把每组的首个字符取出来,形成一段无规律的话。观察可知 N 为 2 即可提取出 flag,也就是取一个字符后隔一个字符再取,然后循环直至取完所有字符。因此 falg 为 flag{wethinkwehavetheflag}。

RSA

本题提供的文本如下,要求解密 RSA。

代码语言:javascript复制
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交

有了ppp 和qqq 值就可以求φ(n)=(p−1)(q−1)φ(n)=(p-1)(q-1)φ(n)=(p−1)(q−1),值为213573308221626840021357330822162684002135733082216268400。由于ddd 满足(d∗e)modφ(n)=1(d*e)modφ(n)=1(d∗e)modφ(n)=1,其他条件都已知,所以ppp 值就可以很容易求了吧?写个脚本来算。

代码语言:javascript复制
import gmpy2

p = 473398607161
q = 4511491
e = 17

phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)

print(d)

解出ddd 值为125631357777427553125631357777427553125631357777427553。

丢失的MD5

本题提供一段 Python 代码。

代码语言:javascript复制
import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM')
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print des

由于是 Python2 代码,换成 Python3 环境运行需要为 print() 函数加上括号。尝试执行程序,发现报错了。

提示在计算哈希值之前需要对数据进行编码,因此将待加密的明文字符串加上编码操作即可,修改代码如下,建议指定编码为 utf-8,以免出现默认编码的问题。

代码语言:javascript复制
import hashlib
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            #m.update(('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM').encode())
            m.update(('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM').encode("utf8"))
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print(des)

计算结果为 e9032994dabac08080091151380478a2,实测该值即为 flag,所以本题考的是编程。

Alice与Bob

本题考查对985547997679855479976798554799767​ 的质数分解,分解出后组合进行 md5 加密即可。质数分解使用 yafu 工具完成即可,分解结果为966233∗101999966233*101999966233∗101999。

代码语言:javascript复制
命令行>yafu-x64.exe factor(98554799767)


fac: factoring 98554799767
fac: using pretesting plan: normal
fac: no tune info: using qs/gnfs crossover of 95 digits
div: primes less than 10000
fmt: 1000000 iterations
Total factoring time = 0.0089 seconds


***factors found***

P6 = 966233
P6 = 101999

ans = 1

将101999966233101999966233101999966233 进行 md5 加密即可,加密结果为 d450209323a847c8d01c6be47c81811a。

大帝的密码武器

本题提供一个 zip 文件,由于没有后缀名,因此无法打开,按提示修改后缀为 zip 即可。包含两个文本文件,其内容如下。

代码语言:javascript复制
题目:
公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。

密文:
ComeChina

即使用凯撒密码加密,但是偏移值需要自行求出,依据为 FRPHEVGL 解密后为有意义的单词。部分不同偏移值对应的明文如下表,但偏移为 13 时解密后为单词 security,因此偏移为 13。

偏移值

明文

2

DPNFCTEJ

3

COMEBSDI

4

BNLDARCH

5

AMKCZQBG

6

ZLJBYPAF

7

YKIAXOZE

8

XJHZWNYD

9

WIGYVMXC

10

VHFXULWB

11

UGEWTKVA

12

TFDVSJUZ

13

SECURITY

使用测算出来的偏移量 13 对题给密文进行解密操作后可得 PbzrPuvan,即本题答案。

rsarsa

本题提供文本如下,给出p、q、e、cp、q、e、cp、q、e、c 的值让我们求明文。

代码语言:javascript复制
Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.


p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

由已给值直接写个脚本进行计算即可。

代码语言:javascript复制
import gmpy2

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

phi_n = (p - 1) * (q - 1)
n = p * q
d = gmpy2.invert(e, phi_n)
m = gmpy2.powmod(c, d, n)

print(m)

计算结果为557744663355446657776887998855774466335544665777688799885577446633554466577768879988。

Windows系统密码

题目给了一个 pass.hash 文件,其内容如下,文件名暗示均为哈希值。

代码语言:javascript复制
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

由于这些值均使用冒号分割为了八段 32 位的序列,大概率为 md5 算法,因此逐个进行解密,第四段成功解出 flag 为 good-luck。

信息化时代的步伐

本题提供文本内容如下,提示为清后数十年一位伟人说的话,且为一串中文。

代码语言:javascript复制
606046152623600817831216121621196386

纯数字序列,合理猜测为中文电码,利用在线工具直接加密结果为计算机要从娃娃抓起。邓小平说的。

凯撒?替换?呵呵!

题目提供一串类似 flag 形式的字符串,标题提示应该又是凯撒?

代码语言:javascript复制
MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}

测试了所有偏移值后仍无对应 flag 的值出现,因此应该为进阶款的凯撒,使用 在线工具 进行爆破。参考条件为 mthj 解密后为 flag,结果如下,其中仅第一条为可读明文。

因此解密明文如下:

代码语言:javascript复制
flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}

萌萌哒的八戒

  • 本题提供一张图片如下,包含一串奇怪的密文,由猪元素推测为猪圈密码。

  • 猪圈密码就很有意思了,原理如下图所示,不同符号对应不同字符,参考字符表进行解密即可。

解密后的明文为 whenthepigwanttoeat。

传统知识 古典密码

本题含有两个文本文件,内容如下。

代码语言:javascript复制
小明某一天收到一封密信,信中写了几个不同的年份
          辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
          信的背面还写有“ 甲子”,请解出这段密文。

key值:CTF{XXX}

首先解决传统知识的问题,在六十甲子中辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳分别对应序号为 28、30、23、08、17、10、16、30,加一甲子就是加 60,则数字序列又变成了 88、90、83、68、77、70、76、90。对应于 ASCII 码表中也就是字符串 XZSDMFLZ。

至于古典密码主要就是凯撒与栅栏了,由于对此没有任何提示,因此只能挨个试。这也太过分了。最终经过栅栏密码的 4 栏加密以及凯撒密码的 5 偏移得到的稍微顺眼的字符串 shuangyu 即为答案。

总结

  尝试接触这么些个密码学的题目,总体来说并没有接触到特别复杂的考题,但是却了解到了相当多的加密算法。又多又杂的算法,虽然大多都有工具来帮助完成,但是光是识别算法类型就够呛了。很开心自己并不需要去研究去开发加密算法,仅仅只需要用好别人的工具就能完成大部分工作。

  BUU 上的练习题到这各个方向我就都路过了一遍了,虽然对个人技术并无多少提升,但总归是对整体有了更深入的认识。各方向的试水刷题就到此为止了,不过,这也才刚刚开始,接下来就是日常刷题学习了。

0 人点赞