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

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

在这里插入图片描述

在这里插入图片描述

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
  • 11
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值