BUU-CRYPTO1密码学小白 25道入门题 详细解题思路

文章目录

  • 1.MD5
  • 2.Url编码
  • 3.一眼就解密(base64)
  • 4.看我回旋踢(凯撒密码)
  • 5.摩丝(Morse密码)
  • 6.password
  • 7.变异凯撒
  • 8.Quoted-printable
  • 9.Rabbit
  • 10.篱笆墙的影子(栅栏密码)
  • 11.丢失的MD5(还原大师)
  • 12.Alice与Bob(大模数分解)
  • 13.大帝的密码武器
  • 14.Windows系统密码(md5)
  • 15.信息化时代的步伐
  • 16.传统知识+古典密码
  • 17.传感器(曼彻斯特编码)
  • 18.凯撒?替换?呵呵
  • 19.萌萌哒八戒(猪圈密码)
  • 20.old-fashion(字母替换)
  • 21.权限获得第一步(md5)
  • 22.世上无难事(字母替换)
  • 23.异性相吸(进制转换)
  • 24.Unencode(UUencode)
  • 25.robomunication(Morse音频)

BUU-CRYPTO部分第一页的入门题刷完了,这里对wp进行了整合,关于RSA的所有题目放在了另外的文章中

BUU-CRYPTO1密码学小白 25道入门题 详细解题思路_第1张图片

BUU-CRYPTO1密码学小白 25道入门题 详细解题思路_第2张图片

1.MD5

题目

e00cf25ad42683b3df678c61f42c6bda

解题思路

由标题很容易想到这是32位md5哈希值

直接md5解码得到: “admin1”

flag

flag{admin1}

2.Url编码

题目

%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

解题思路

由标题很容易想到这是url编码,字符串中的"%"也验证了这一点

直接url解码得到: “and 1=1”

flag

flag{and 1=1}

知识点

url编码 = ascll码(0x->%)

例如:

大写字母A = 0x41(ascll) = %41(url)

3.一眼就解密(base64)

题目

下面的字符串解密后便能获得flag:

ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=

解题思路

观察所给出的字符串发现是大小写字母和数字混排,特别是末尾有一个"=",不难想到可能是base系列编码

先用最常见base64进行尝试,解码果然得到flag

flag

flag{THE_FLAG_OF_THIS_STRING}

4.看我回旋踢(凯撒密码)

题目

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

解题思路

可以看到,字符串基本是还是对应上了flag的格式,不难想到是单字母替换加密

这一题可以直接尝试爆破,令"synt" = "flag"即可,简单的暴力美学

常用的爆破网站https://quipqiup.com/

但是当时我的做法是先尝试了凯撒加密,代码如下:

import string

def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
    lower = string.ascii_lowercase #小写字母
    upper = string.ascii_uppercase #大写字母
    before = string.ascii_letters #无偏移的字母顺序 小写+大写
    after = lower[k:] + lower[:k] + upper[k:] + upper[:k]#偏移后的字母顺序 还是小写+大写
    #分别把小写字母和大写字母偏移后再加到一起 
    table = ''.maketrans(before, after)  #创建映射表
    return s.translate(table) #对s进行偏移 即加密
 
if __name__ == "__main__":
    s = "synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}"
    offset = ord('f') - ord('s')#计算偏移量
    #print(offset)
    print(kaisa(s, offset))

flag

flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}

5.摩丝(Morse密码)

题目

… .-… — …- . -.-- — …-

解题思路

观察题目,是点和杠的排列,很明显是Morse密码的特征

直接用摩斯密码解密可得

flag

flag{ILOVEYOU}

6.password

题目

姓名:张三
生日:19900315

key格式为key{xxxxxxxxxx}

解题思路

看到key{xxxxxxxxxx}中key的长度为10位,联想到张三可能取密码的习惯,根据题目信息无非就那么几种

  • zs19900315
  • 19900315zs
  • 1990zs0315

稍作尝试可得到正确答案

flag

flag{zs19900315}

7.变异凯撒

题目

加密密文:afZ_r9VYfScOeO_UL^RWUc

解题思路

看不出字符串是怎么处理的,但是标题给了提示,肯定是基于凯撒加密的

凯撒加密老规矩,先将前四个字符猜测为flag,然后仔细分析可以发现偏移量不是固定值

  • a -> f 移位5
  • f -> l 移位6
  • Z -> a 移位7

可以看出是一个递增的偏移量,那么直接上代码:

c = "afZ_r9VYfScOeO_UL^RWUc"
m = ''
for i in range(len(c)):
    m += chr(ord(c[i]) + 5 + i)
print(m)

flag

flag{Caesar_variation}

8.Quoted-printable

题目

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

解题思路

之前没见过这种类型的编码,学习一波之后发现,有一种编码就叫Quoted-printable

那么直接QP解码得到: “那你也很棒哦”

flag

flag{那你也很棒哦}

知识点

quoted-printable编码

任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.

此题表明,quoted-printable编码对汉字采用UTF-8

9.Rabbit

题目

U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI

解题思路

尝试过base64,发现不对。根据标题去看,发现这里是Rabbit编码

那么直接Rabbit解码得到: “Cute_Rabbit”

flag

flag{Cute_Rabbit}

知识点

rabbit解密

密文特征与base64类似,末尾会有==

若base64等解不通,可以尝试rabbit解密

10.篱笆墙的影子(栅栏密码)

题目

felhaagv{ewtehtehfilnakgw}

解题思路

不难看出字符串仍具有类似flag的格式,由于’{'前面并非四个字符,首字符’f’也没有被替换,所以应该不是凯撒加密,或单字母替换

再根据标题提示信息,猜测是栅栏密码,前面1,3,5,7位连结有"flag",故有两栏:

f l a g { w e t h i n k w
e h a v e t h e f l a g }

flag

flag{wethinkwehavetheflag}

11.丢失的MD5(还原大师)

题目

我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB???08???51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。

解题思路

已知部分明文和明文的部分MD5值,求解明文及MD5

直接遍历缺失的字符,验证补全的字符串与泄露的部分MD5能否对上即可

附上代码:

import hashlib  

for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            s = 'TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM'
            # TASC J O3RJMV K WDJKX L ZM
            m.update(s.encode())
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print(s)
               # print(m)   
                print(des)

这里遍历字符的时候,只需要在Ascll码的可打印字符(32-127)中遍历,可以缩小寻找范围

flag

flag{e9032994dabac08080091151380478a2}

12.Alice与Bob(大模数分解)

题目

密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案

解题思路

这一题因为之前密码学课程作业中实现过,所以直接把之前的代码拿来用了。因为函数都是自己写的,没有用到gmpy2库,所以代码显得比较长。

先看代码:

from random import random

#扩展欧几里得算法
#返回值列表中,x是a的逆元(mod b),q是gcd(a,b),若x是0,则表示没有逆元,有x*a + y*b = 1

def Ex_Euclid(a,b):
  if 0==b:
    x=1;y=0;q=a
    return x,y,q
  xyq=Ex_Euclid(b,a%b)
  x=xyq[0];y=xyq[1];q=xyq[2]
  temp=x;x=y;y=temp-a//b*y
  return x,y,q
 
#获取a的逆元(mod b)的函数,目的是为了封装获取逆元的功能
def Get_Inverse(a,b):
  return Ex_Euclid(a,b)[0]
 
#获取a和b的最大公约数函数,目的是为了封装获取最大公约数的功能
def gcd(a,b):
  return Ex_Euclid(a,b)[2]
     
#快速模幂运算       
def quick_momi(a,b,c):
    a=a%c
    ans=1
    while b !=0:
        if b&1:
            ans=(ans*a)%c
        b>>=1
        a=(a*a)%c
    return ans

#费马检验
#n为待检验的整数,rounds为检验的重复轮数
#返回值为1时代表通过检验
def fermat_test(n, rounds):
    for i in range(rounds):
        b = int((n - 4) * random() + 2)#生成一个[2,n-2]之间的随机整数
        if gcd(b, n) > 1:
            return 0
        r = quick_momi(b, n - 1, n)
        if r != 1:
            return 0
    return 1

#经过十轮检验的费马测试
def fermat10(n):
    return fermat_test(n, 20)

#二分法计算平方根
def recursion(num, low, high):
    if high - low == 1:
        return high
    mid = (high + low) // 2
    if pow(mid, 2) > num:
        return recursion(num, low, mid)
    elif pow(mid, 2) < num:
        return recursion(num, mid, high)
    else:
        return mid

#计算平方根,返回值为真实值向上取整
def sqrt(n):
    return recursion(n, 0, n)
    
#判断n是否为平方数
def Is_Square_number(n):
    s = sqrt(n)
    if s * s == n:
        return 1
    return 0

#检验
def check(n, p, q):
    m = q * p
    if fermat10(p) and fermat10(q) and m == n:
        return 1
    return 0

#因数分解,返回值(x, y)分别为n的因数
def Factorization(n):
    x = sqrt(n)
    while(True):
        y2 = x * x - n
        if(Is_Square_number(y2)):
            y = sqrt(y2)
            if check(n, x + y, x - y):
                return (x + y, x - y)
        x = x + 1
       
n = 98554799767
(p, q) = Factorization(n)
print("N的分解结果为 : ")
print("%d = %d * %d" % (n, p, q))

里面涉及到扩展欧几里得算法、二分法计算平方根、费马检验等的实现,具体细节可参考代码

主要的分解思路是

  • 假设p = x + y,q = x - y
  • 则n = p * q = x2 - y2,在这个式子中,有x > sqrt(n)
  • 所以从sqrt(n)开始往上寻找x,每步加一
  • 验证x2 - n是否能开方,若能,则y = sqrt(x2 - n)
  • 此时,必然有n = p * q
  • 但仍不能保证n被分解为了两个素数,因此要进行素性检验,这里用了10轮费马检验
  • 若不通过检验,重复上述步骤
  • 若通过检验,则n = p * q分解成功

运行结果
在这里插入图片描述
再根据题目要求,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希:

MD5(101999966233) = d450209323a847c8d01c6be47c81811a

flag

flag{d450209323a847c8d01c6be47c81811a}

优化代码

由于后面做题还是会用到很多大整数分解的代码,所以后面对代码进行了一个优化

当然,这里爆破的思路还是一样的,只是变得相当简洁,封装性也更好

附上代码:

import gmpy2
    
#因数分解,返回值分别为n的因数
def Factorization(n):
    x = gmpy2.iroot(n,2)[0] + 1 #gmpy2.iroot(x,n) #x开n次根
    while(True):
        y2 = x * x - n
        y = gmpy2.iroot(y2,2)[0]
        p, q = x + y, x - y
        if (p) * (q) == n:
            if gmpy2.is_prime(p) and gmpy2.is_prime(q): #素性检测
                return (p, q)
        x = x + 1

13.大帝的密码武器

题目

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

加密附件:ComeChina

解题思路

“罗马三巨头” + “加密以名字命名” = 凯撒加密

直接对FRPHEVGL进行凯撒枚举

附上代码:

import string

def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
    lower = string.ascii_lowercase #小写字母
    upper = string.ascii_uppercase #大写字母
    before = string.ascii_letters #无偏移的字母顺序 小写+大写
    after = lower[k:] + lower[:k] + upper[k:] + upper[:k]#偏移后的字母顺序 还是小写+大写
    #分别把小写字母和大写字母偏移后再加到一起 
    table = ''.maketrans(before, after)  #创建映射表
    return s.translate(table) #对s进行偏移 即加密
 
s = "FRPHEVGL"
for i in range(26): 
    print(kaisa(s, i).lower())

运行结果如下:

frphevgl
gsqifwhm
htrjgxin
iuskhyjo
jvtlizkp
kwumjalq
lxvnkbmr
mywolcns
nzxpmdot
oayqnepu
pbzrofqv
qcaspgrw
rdbtqhsx
security
tfdvsjuz
ugewtkva
vhfxulwb
wigyvmxc
xjhzwnyd
ykiaxoze
zljbypaf
amkczqbg
bnldarch
comebsdi
dpnfctej
eqogdufk

在其中找到一个有意义的单词security

而从FRPHEVGL->SECURITY 偏移13

同样的用偏移13去加密附件中的内容,得到

ComeChina->PbzrPuvan

flag

flag{PbzrPuvan}

14.Windows系统密码(md5)

题目

pass_hash.txt:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

解题思路

这道题看上去是windows系统中存储的账户密钥文件,pass_hash.txt提示出信息经过hash处理,常用的hash函数有md5、sha1等

里面共出现有5个32位hash值,应该是md5

aad3b435b51404eeaad3b435b51404ee

31d6cfe0d16ae931b73c59d7e0c089c0

06af9108f2e1fecf144e2e8adef09efd

a7fcb22a88038f35a8f39d503e7f0062

bef14eee40dffbc345eeb3f58e290d56

在网站上分别进行hash查询

其中,a7fcb22a88038f35a8f39d503e7f0062(ctf第二串32位字符)解得
flag{good-luck}

flag

flag{good-luck}

15.信息化时代的步伐

题目

606046152623600817831216121621196386
也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文!)

解题思路

看到是整数,先尝试用base36进行编码,得到

yzdawx0tzyyevldy1ooxx7m

题目提示flag答案是中文,那么这个答案显然不对

但是十进制数据没有对应的常用汉字编码

上网学习一波后,由"清政府拒绝进入信息化时代"->中文电码

606046152623600817831216121621196386用中文电码编码得到:

“计算机要从娃娃抓起”

flag

flag{计算机要从娃娃抓起}

知识点

来源
  中文电码,又称中文商用电码、中文电报码或中文电报明码,原本是于电报之中传送中文信息的方法。它是第一个把汉字化作电子讯号的编码表。
  自摩尔斯电码在1835年发明后,一直只能用来传送英语或以拉丁字母拼写的文字。1873年,法国驻华人员威基杰(S·A·Viguer)参照《康熙字典》的部首排列方法,挑选了常用汉字6800多个,编成了第一部汉字电码本,名为《电报新书》。后由我国的郑观应将其改编成为《中国电报新编》。这是中国最早的汉字电码本。中国人最早研制的电报机华侨商人王承荣从法国回国后,与福州的王斌研制出我国第一台电报机,并呈请政府自办电报。清政府拒不采纳。

应用
  中文电码可用作电脑里的中文输入法,但因中文电码是“无理码”,记忆困难,一般用户几乎无法熟练地掌握使用。
  在香港,每个有中文姓名的市民的身份证上,均会在他的姓名下面,印有中文电码,外国人取得的入港签证亦有印上。在很多政府或商业机构的表格中,都会要求填写者填写他的中文电码,以便输入电脑。
  美国签证申请表(DS-160表)中,要求申请人填写姓名的中文电码,一些生僻字没有对应的中文电码时,可用“0000”代替。

原理
  中文电码表采用了四位阿拉伯数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。后来由于一万个汉字不足以应付户籍管理的要求,又有第二字面汉字的出现。在香港,两个字面都采用同一编码,由输入员人手选择字面;在台湾,第二字面的汉字会在开首补上“1”字,变成5个数字的编码。

16.传统知识+古典密码

题目

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

解题思路

在古代采用干支纪年法,即使用10天干12地支的组合记录年号,60年完成一个循环周期(60是10和12的最小公倍数),称一个"甲子",天干地支表如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhUwePwb-1625664981878)(D:\study\CTF-crypto\BUUCTF\传统知识+古典密码\天干地支表.png)]

辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳分别对应:

28,30,23,08,17,10,16,30

再加上一甲子(60),得到

88,90,83,68,77,70,76,90

对应Ascll文本为:XZSDMFLZ

作为flag提交,答案不对

根据标题提示:传统知识+古典密码

可能还需要用古典密码破译

尝试过几种不同的古典密码,都没有看到正确结果,那么可能是两种以上古典密码的结合

最终通过栅栏密码+凯撒密码解出正确答案

XZSDMFLZ只有8位字符,栏数只能是2或者4

2栏解密:XMZFSLDZ

4栏解密:XSMLZDFZ

再进行凯撒枚举

附上代码:

import string

def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
    lower = string.ascii_lowercase #小写字母
    upper = string.ascii_uppercase #大写字母
    before = string.ascii_letters #无偏移的字母顺序 小写+大写
    after = lower[k:] + lower[:k] + upper[k:] + upper[:k]#偏移后的字母顺序 还是小写+大写
    #分别把小写字母和大写字母偏移后再加到一起 
    table = ''.maketrans(before, after)  #创建映射表
    return s.translate(table) #对s进行偏移 即加密

if __name__ == "__main__":
    s1 = "XMZFSLDZ"
    s2 = "XZSDMFLZ"
    for i in range(26): 
        print("s1:" + kaisa(s1, i).lower())
    for i in range(26): 
        print("s2:" + kaisa(s2, i).lower())

最终在XMZFSLDZ的基础上,凯撒枚举出一个有意义的字符串SHUANGYU

(代码里边我让结果用小写字母输出,是我觉得小写更容易读,flag最后还是大写)

flag

flag{SHUANGYU}

17.传感器(曼彻斯特编码)

题目

5555555595555A65556AA696AA6666666955
这是某压力传感器无线数据包解调后但未解码的报文(hex)

已知其ID为0xFED31F,请继续将报文完整解码,提交hex。

提示1:曼联

解题思路

根据提示,曼城(Manchester)

上网学习一波,又是一种没有见过的编码,叫Manchester编码

该编码的特点是只含:5,6,9,A

根据编码的原理,写出解码的代码:

def GE(s):
    #GE标准
    c2bin = {'5':'00', '9':'10', '6':'01', 'A':'11', 'a':'11'}
    s_bin = ''
    for i in s:
        s_bin += c2bin[i]
    #print(s_bin)
    s_bin_re = ''
    #下面是做了数据报文大小端处理,即每个字节内部倒序
    for i in range((len(s_bin)+7)//8):
        s_bin_re += s_bin[i*8:(i+1)*8][::-1]
    return hex(int(s_bin_re, 2)).upper()
    
def IEE(s):
    #IEE标准
    c2bin = {'5':'11', '9':'01', '6':'10', 'A':'00', 'a':'00'}
    s_bin = ''
    for i in s:
        s_bin += c2bin[i]
    #print(s_bin)
    s_bin_re = ''
    #下面是做了数据报文大小端处理,即每个字节内部倒序
    for i in range((len(s_bin)+7)//8):
        s_bin_re += s_bin[i*8:(i+1)*8][::-1]
    return hex(int(s_bin_re, 2)).upper()

c = "5555555595555A65556AA696AA6666666955"
print(GE(c))
print(IEE(c))

值得注意的是,Manchester编码有两种截然相反的标准,GE和IEE,这里都给出了代码实现,其解码结果分别为:

0X12CE09BAFAA06
0XFFFFFED31F645055F9

IEE的解码结果对应上了题目提示的ID,为正确答案

flag

flag{FFFFFED31F645055F9}

知识点

曼彻斯特编码
每一位的中间有一跳变,位中间的跳变既作时钟信号,又作数据信号;从高到低跳变表示"1",从低到高跳变表示"0"(这里是GE标准,IEE标准恰好相反)。

GE标准

  • 编码0101(即0x5),表示原数据为00;

  • 编码1001(0x9)表示10;

  • 编码0110(0x6)表示01;

  • 编码1010(0xA)表示11。

IEE标准

  • 编码0101(0x5)表示11;
  • 编码1001(0x9)表示01;
  • 编码0110(0x6)表示10;
  • 编码1010(0xA)表示00;

差分曼彻斯特编码
每位中间的跳变仅提供时钟定时,而用每位开始时有无跳变表示"0"或"1",有跳变为"0",无跳变为"1"。

编码原理图解(GE标准)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2oH4vQQ-1625664981881)(D:\study\CTF-crypto\BUUCTF\曼彻斯特编码\曼彻斯特编码.png)]

18.凯撒?替换?呵呵

题目

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}

解题思路

这里flag基本格式还在,明显是一个单字母替换的题

分析mthj->flag偏移分别为7、8、7、3,没有规律,所以应该不是凯撒加密

直接上网站进行爆破:https://quipqiup.com/

令mthj = flag,爆破得到

flag substitution cipher decryption is always easy just like a piece of cake

flag

flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}

19.萌萌哒八戒(猪圈密码)

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krjrQBEJ-1625664981885)(D:\study\CTF-crypto\BUUCTF\萌萌哒八戒(猪圈密码)\bajie.jpg)]

解题思路

看到图片底下这些符号,很明显是猪圈密码

解密可得whenthepigwanttoeat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtzGs77e-1625664981886)(D:\study\CTF-crypto\BUUCTF\萌萌哒八戒(猪圈密码)\猪圈密码.png)]

flag

flag{whenthepigwanttoeat}

知识点

猪圈密码表如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smYtaCpO-1625664981888)(D:\study\CTF-crypto\BUUCTF\萌萌哒八戒(猪圈密码)\密码表.png)]

20.old-fashion(字母替换)

题目

Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

解题思路

这里应该是字频统计的单字母替换题,但是尝试过写代码统计单字母频率进行替换,效果差强人意,最初以为是样本太少了,统计分析效果很差

于是,再次搬出暴力美学:https://quipqiup.com/

爆破结果如下:

Xl fogkvryoeksg, e hjdhvxvjvxrl fxksao xh e zavsrb rc alfrbxly dg wsxfs jlxvh rc knexlvaiv eoa oaknefab wxvs fxksaovaiv, effrobxly vr e oayjneo hghvaz; the units may be single letters (the most common), pairs of letters, triplets of letters, mixtures of the above, and so forth. The receiver deciphers the text by performing an inverse substitution. So the flag is n1_2hen-d3_hu1-mi-ma_a

这里有个坑,可以看到文本前面还特意设计了几句乱序字符串,这就是为什么字频统计不行的原因,干扰因素太多

flag

flag{n1_2hen-d3_hu1-mi-ma_a}

21.权限获得第一步(md5)

题目

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

解题思路

没什么好讲的,和前面那道windows系统密码是一样的
MD5解密F4AD50F57683D4260DFD48AA351A17A8得到
flag{3617656}

flag

flag{3617656}

22.世上无难事(字母替换)

题目

EBCZW SBKA CQ NBWXO XAW DI DXAN NB NVXAP DXPIMKIZW MBU JIKAH QCEV XA BCNQNXAWKAH VBQN HKFI OBCUQIZFIQ X JKH UBCAW BM XLLZXCQI XAW NVI PIO KQ 640I11012805M211J0XJ24MM02X1IW09

解题思路

同样使用暴力美学:https://quipqiup.com/
HELLO EVERYBODY THANK YOU ALL RIGHT EVERYBODY GO AHEAD AND HAVE A SEAT HOW IS EVERYBODY DOING TODAY HOW ABOUT TIM SPICER WE ARE HERE WITH STUDENTS AT WAKEFIELD HIGH SCHOOL IN ARLINGTON VIRGINIA AND WE HAVE GOT STUDENTS TUNING IN FROM ALL ACROSS AMERICA FROM KINDERGARTEN THROUGH 12TH GRADE AND WE ARE JUST SO GLAD THAT ALL COULD JOIN US TODAY AND WE WANT TO THANK WAKEFIELD FOR BEING SUCH AN OUTSTANDING HOST GIVE YOURSELVES A BIG ROUND OF APPLAUSE AND THE KEY IS 640E11012805F211B0AB24FF02A1ED09

flag

flag{640e11012805f211b0ab24ff02a1ed09}

23.异性相吸(进制转换)

题目

key:asadsasdasdasdasdasdasdasdasdasdqwesqf

密文:ἇ̀Ј唒ဃ塔屋䩘卖剄䐃堂ن䝔嘅均ቄ䩝ᬔ

解题思路

这里密文是乱码,我们转换成二进制查看

key:
01100001 01110011 01100001 01100100 01110011 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01110001 01110111 01100101 01110011 01110001 01100110
密文:
00000111 00011111 00000000 00000011 00001000 00000100 00010010 01010101 00000011 00010000 01010100 01011000 01001011 01011100 01011000 01001010 01010110 01010011 01000100 01010010 00000011 01000100 00000010 01011000 01000110 00000110 01010100 01000111 00000101 01010110 01000111 01010111 01000100 00010010 01011101 01001010 00010100 00011011

下一步暂时不知道如何做,但是根据标题想到将二者异或

附上代码:

key = '01100001 01110011 01100001 01100100 01110011 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01100001 01110011 01100100 01110001 01110111 01100101 01110011 01110001 01100110'
msg = '00000111 00011111 00000000 00000011 00001000 00000100 00010010 01010101 00000011 00010000 01010100 01011000 01001011 01011100 01011000 01001010 01010110 01010011 01000100 01010010 00000011 01000100 00000010 01011000 01000110 00000110 01010100 01000111 00000101 01010110 01000111 01010111 01000100 00010010 01011101 01001010 00010100 00011011'

s = ''
key = key.replace(" ", '')
msg = msg.replace(" ", '')
for i in range(len(key)):
    if key[i] == msg[i]:
        s += '0'
    else:
        s += '1'

L = s.split(' ')#分离每一个字节
flag = ''
for i in L:
    flag += chr(int(i, 2))#转化为Ascll字符
print(flag)

异或得到

01100110 01101100 01100001 01100111 01111011 01100101 01100001 00110001 01100010 01100011 00110000 00111001 00111000 00111000 00111001 00111001 00110010 00110010 00110111 00110110 01100010 00110111 01100110 00111001 00110101 01100010 00110101 00110100 01100001 00110111 00110100 00110011 00110101 01100101 00111000 00111001 01100101 01111101

再将其转化为ascll文本即可

flag

flag{ea1bc0988992276b7f95b54a7435e89e}

24.Unencode(UUencode)

题目

89FQA9WMD

解题思路

由标题很容易想到这是UUencode

直接UUencode解码得到: flag{dsdasdsa99877LLLKK}

flag

flag{dsdasdsa99877LLLKK}

知识点

UUencode编码

举例:“hello”->"%:&5L;&\ "(末尾有空格)
补零+32->末尾常有32空格,但是多几个或少几个空格不影响解码

UUencode是一种二进制到文字的编码。最早在unix 邮件系统中使用,全称:Unix-to-Unix encoding。不属于MIME编码中一员。它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合。主要解决,二进制字符在传输、存储中问题。它早期在电子邮件中使用较多,最近这些年来基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三种编码标准!

UUEncode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。跟Base64具有非常多的类似,也做了一些特殊转码说明!因为对所有文本都会编码一次可读性不是很好!

25.robomunication(Morse音频)

题目

题目只给了一个音频文件"robo.mp3"

解题思路

打开音频,发现可以正常播放

仔细听音频的内容,一开始以为是毫无意义的噪声,后来发现是有"bee"和"boo"两种声音组成,而且有一定的间隔节奏。那么可以联想到这是Morse编码。

将所听到的内容记录下来,”bee“记为’1’,"boo"记为’0’

[‘1111’, ‘1’, ‘1011’, ‘1011’, ‘000’, ‘100’, ‘1111’, ‘10’, ‘0’, ‘11’, ‘111’, ‘0’, ‘1111’, ‘1’, ‘010’, ‘1’, ‘0100’, ‘11’, ‘0’, ‘11’, ‘111’, ‘0111’, ‘000’, ‘000’, ‘1001’, ‘0111’, ‘1’, ‘1’, ‘1001’]

然后写代码进行解密:

MorseList = {
    ".-": "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",

    ".-.-.-": ".", "---...": ":", "--..--": ",", "-.-.-.": ";", "..--..": "?",
    "-...-": "=", ".----.": "'", "-..-.": "/", "-.-.--": "!", "-....-": "-",
    "..--.-": "_", ".-..-.": '"', "-.--.": "(", "-.--.-": ")", "...-..-": "$",
    ".-...": "&", ".--.-.": "@", ".-.-.": "+", "": "",
}

L = ['1111', '1', '1011', '1011', '000', '100', '1111', '10', '0', '11', '111', '0', '1111', '1', '010', '1', '0100', '11', '0', '11', '111', '0111', '000', '000', '1001', '0111', '1', '1', '1001']

beep = '.'
boop = '-'
morse = ''
flag = ''
for i in L:
    for j in range(len(i)):
        if i[j] == '1':
            morse += beep
        elif i[j] == '0':
            morse += boop
        else:
            continue
            #print(i[j], "decode error")
    morse += ' '

L = morse.split(' ')
for i in L:
    flag += MorseList[i]
print("flag{" + flag + "}")

flag

flag{HELLOWHATISTHEKEYITISBOOPBEEP}

你可能感兴趣的:(BUUCTF,CRYPTO,python,密码学)