BUU-CRYPTO2 密码学入门题合集 第二弹


BUU-CRYPTO部分第二页的入门题刷完了,这里对wp进行了整合,关于RSA的所有题目放在了另一个专栏中 BUUCTF RSA专栏_晓寒的博客-CSDN博客,然后 传感器这道题放在了 (BUU-CRYPTO1密码学小白 25道入门题 详细解题思路_晓寒的博客-CSDN博客
在这里插入图片描述
在这里插入图片描述

[AFCTF2018]Morse

题目

-…/.----/-…/-…/-…/…–/--…/…-/-…/-…/–…/-…/…–/.----/–…/…–/…—/–…/–…/…-/…/…-./–…/…–/…–/-----/…/…-./…–/…–/…–/…-/…–/…/–…/----./–…/-…

解题思路

这道题给出了一段莫斯编码,拿去解码就行了

附上代码

import binascii
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",

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

c =  "-..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/..---/--.../--.../....-/...../..-./--.../...--/...--/-----/...../..-./...--/...--/...--/....-/...--/...../--.../----./--.../-.."

flag = ''

L = c.split('/')
for i in L:
    flag += MorseList[i]

flag = binascii.unhexlify(flag)
print(flag) #afctf{1s't_s0_345y}

运行结果

afctf{1s’t_s0_345y}

当然最后要换成BUUCTF规定的格式

flag

flag{1s’t_s0_345y}

Cipher(playfair加密)

题目

还能提示什么呢?公平的玩吧(密钥自己找) Dncnoqqfliqrpgeklwmppu 注意:得到的 flag 请包上 flag{} 提交, flag{小写字母}

解题思路

看到密文第一反应是凯撒加密,然后尝试了凯撒枚举

然并卵,所有偏移量下的结果都没出现正确答案

又放到了https://quipqiup.com/上试试爆破,仍旧不对

从题目中没有找到思路,因此上网学习了一波

发现有一种加密方式就叫playfair加密,是一种多表代换加密。这里给出解密网站:

http://rumkin.com/tools/cipher/playfair.php

这种加密需要密钥,题目中说密钥自己找,密钥就在"公平的玩吧"里面,同样也是playfair

解密得到Itisnotaproblemhavefun

当然根据题目要求,最后须转换成小写字母

flag

flag(itisnotaproblemhavefun)

知识点

Playfair算法

Playfair算法是多表代换加密方式中最著名的一种,属于经典对称加密方式,1854年由英国科学家Chaeles W发明。曾经在相当长的一段时期内,Playfair算法被认为是一种牢不可破的加密方法。在网络安全、数据加密等方面,其加密思想被广泛应用。Playfair密码是把明文中的双字母音节作为一个单元并将其转换为密文的一种加密算法,原算法可用的字母对有26×26个,虽然比明文有着稍为平坦的频率分布曲线,但密文中仍透露了大量的信息给密码分析者。

Playfair算法是把明文中的双字母作为一个单元,将其转换为密文的双字母,转换依据由密钥所构成的5×5字母矩阵。

1、编制密码表

​ 编一个55的密码表,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序,如果密钥过长可占用第二列或行。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉(它依据一个55的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。如,法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待,英语中z使用最少,可以去掉它)。

密钥:shiyanb 可编成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UqD2ZpLC-1626311445535)(C:\Users\xiao_han\AppData\Roaming\Typora\typora-user-images\image-20210708085831130.png)]

2、整理明文/密文,将明文/密文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X(或者Q)。

密文: KQSAMFPAOPMFPA

KQ SA MF PA OP MF PA

3、解密规则

(1) 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。

(2) 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。

(3)若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母。

密文:KQ SA MF PA OP MF PA

明文:dk ay fn ir mo fn ir

img img

4、加密规则

(1)若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,fg对应gj,mr对应om

(2) 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。如,按照前表,dk对应kq,ou对应uh

(3)若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,ir对应pa或ap。

from 密码学笔记——playfair密码 - ILK - 博客园 (cnblogs.com)

达芬奇密码(斐波那契数列)

题目

达芬奇一直是一个有争议的画家,科学家。。。小明为了研究他,从网上找到了名画蒙娜丽莎,一天深夜,小明突然从蒙娜丽莎背后的天空中看到了一串神秘的数字。顺带告诉小明达芬奇家窗台上有一串数字是关键。小明千里迢迢找到了这串数字,请将这个送分题做出来,亲,包邮哦(答案是一串32位十进制数字)

达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711
记录在达芬奇窗台口的神秘数字串:36968853882116725547342176952286

解题思路

这一题比较考验眼力

首先要注意到数字列共有32个数字,神秘字符串和答案一样是32位十进制数字,这三者之间必定存在一定联系

同时,熟悉斐波那契数列的同志会发现,数字列中的数字都来自斐波那契数列(反正我没看出来,上网学习一波才知道的)

1,1,2,3,5,8,13,21,34,…

每一个数字列中的数字都会有一个对应的斐波那契数列项的下标,例如2对应第三项,8对应第六项

根据这个我们可以把数字列进行排序,同时对数字串进行对应位置的变换,就可以得到flag

附上代码

def gen_fibo(n):    #Generate a Fibonacci sequence, return a list that included n elements
    L = [1]
    dp = [0, 1]
    for i in range(n - 1):
        new = dp[0] + dp[1]
        L.append(new)
        dp[0] = dp[1]
        dp[1] = new
    return L
    
if __name__ == "__main__":
    key = "36968853882116725547342176952286"
    num_list = "1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711"
    L1 = num_list.split(' ')
    print(L1)
    L2 = gen_fibo(32)
    print(L2)
    flag = ''
    for i in range(32):
        flag += key[L1.index(str(L2[i]))]
    #index函数只会寻找最左边的下标,而数列中有两个1,故把第二个1对应的数字手动调整一下
    flag = flag[:1] + '7' + flag[2:]
    print("flag{" + flag + "}")

有一个小坑,斐波那契数列中前两个数字都是1,因此要考虑到第二个1对应的数字7,需要手动将其调整过来

flag

flag{37995588256861228614165223347687}

[GXYCTF2019]CheckIn(base64+rot47)

题目

dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg==

解题思路

这串字符的特点像是base64,尝试一下

v)L_F0< }@H0>F49023@FE0#@EN

注意上面的结果中,因为<>会匹配上markdown的标签,无法正常显示,所以在<和}中间特意加了一个 空格,实际是没有空格的

答案不对,又尝试了rabbit编码,也不行

上网学习一波,这道是经过两次编码的,base64的结果还要再用rot47解码一次

工具网站:ROT5、ROT13、ROT18、ROT47位移编码 (qqxiuzi.cn)

GXY{Y0u_kNow_much_about_Rot}

flag

flag{Y0u_kNow_much_about_Rot}

知识点

ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。

ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码

密码学的心声(进制转换)

题目

二战时期,某国军官与一个音乐家情妇相好,然而自从那时起,他屡战屡败,敌人似乎料事如神。他也有怀疑过他的情妇,但是他经过24小时观察他的情妇,发现她每天都只是作曲,然后弹奏给战地电台,为士兵们鼓气,并未有任何逾越。那么,间谍到底是谁?这张曲谱是否有猫腻?

在这里插入图片描述

不看曲谱光看题目我还以为会给出一段Morse音频,结果给了一张曲谱的图片

这里面歌词提示很明显:

请转成埃塞克码

这里面没有八

前面一点说明要把数字转为Ascll码文本,又告诉了是八进制

附上代码:

用一行代码实现解密

ctext = '111114157166145123145143165162151164171126145162171115165143150'
print('falg{'+''.join(chr(int(ctext[i*3:(i+1)*3], 8)) for i in range(len(ctext)//3))+'}')

下面的代码帮助理解,功能同上

ctext = '111114157166145123145143165162151164171126145162171115165143150'
flag = ''
for i in range(len(ctext)//3):
    c = ctext[i*3:(i+1)*3]  #每三位数对应一个ascll字符
    flag += chr(int(c, 8))
print('flag{' + flag + '}')

注意一下,三个一组进行转换

flag

flag{ILoveSecurityVeryMuch}

这是base??(变异base64)

题目

dic = {0: ‘J’, 1: ‘K’, 2: ‘L’, 3: ‘M’, 4: ‘N’, 5: ‘O’, 6: ‘x’, 7: ‘y’, 8: ‘U’, 9: ‘V’, 10: ‘z’, 11: ‘A’, 12: ‘B’, 13: ‘C’, 14: ‘D’, 15: ‘E’, 16: ‘F’, 17: ‘G’, 18: ‘H’, 19: ‘7’, 20: ‘8’, 21: ‘9’, 22: ‘P’, 23: ‘Q’, 24: ‘I’, 25: ‘a’, 26: ‘b’, 27: ‘c’, 28: ‘d’, 29: ‘e’, 30: ‘f’, 31: ‘g’, 32: ‘h’, 33: ‘i’, 34: ‘j’, 35: ‘k’, 36: ‘l’, 37: ‘m’, 38: ‘W’, 39: ‘X’, 40: ‘Y’, 41: ‘Z’, 42: ‘0’, 43: ‘1’, 44: ‘2’, 45: ‘3’, 46: ‘4’, 47: ‘5’, 48: ‘6’, 49: ‘R’, 50: ‘S’, 51: ‘T’, 52: ‘n’, 53: ‘o’, 54: ‘p’, 55: ‘q’, 56: ‘r’, 57: ‘s’, 58: ‘t’, 59: ‘u’, 60: ‘v’, 61: ‘w’, 62: ‘+’, 63: ‘/’, 64: ‘=’}

ciphertext= “FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw”

解题思路

题目给出64位映射表,很明显是base64的变形

模仿base64加密的方式进行解密即可

附上代码:

import binascii
#加密方式为base64,但是改变了映射关系
dic = {
   0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

ciphertext= "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw"

mtext = ''
for i in ciphertext:
    key = list(dic.values()).index(i) #字典键与索引值排序相同
    mtext += bin(key)[2:].zfill(6)    #用0补齐六位长度
mtext = (int(mtext, 2))

flag = binascii.unhexlify(hex(mtext)[2:])
print(flag)

运行结果:

b’BJD{D0_Y0u_kNoW_Th1s_b4se_map}’

flag

flag{D0_Y0u_kNoW_Th1s_b4se_map}

rot(rot13+MD5爆破)

题目

83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112

解题思路

rot编码,对比"83 89 78 84"和"70 76 65 71"(FLAG)可以知道是rot13

偏移13后转Ascll码即可

附上代码:

ctext = "83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112"
ctext = ctext.split(' ')
flag = ''
for i in ctext:
    flag += chr(int(i)-13)
print(flag)

运行结果

FLAG IS flag{www_shiyanbar_com_is_very_good_???}
MD5:38e4c352809e150186920aac37190cbc

本来以为答案就是flag{www_shiyanbar_com_is_very_good_???},但是提交后发现不对

在看到flag后面有4个?,下面给出MD5值

猜测可能要对后四个字符进行MD5爆破

附上代码:

import hashlib

def md5(key):
    input_name = hashlib.md5()
    input_name.update(key.encode("utf-8"))
    return(input_name.hexdigest())
    
def solve(MD5):
    for a in range(32,127):
        print(chr(a))
        for b in range(32,127):
            for c in range(32,127):
                for d in range(32,127):
                    flag = "flag{www_shiyanbar_com_is_very_good_" + chr(a)+chr(b)+chr(c)+chr(d) + "}"
                    if md5(flag) == MD5:
                        return flag
                        
flag = "flag{www_shiyanbar_com_is_very_good_????}"
MD5 = "38e4c352809e150186920aac37190cbc"
print(solve(MD5))

因为一分钟就跑完了,所以不需要并行优化

flag

flag{www_shiyanbar_com_is_very_good_@8Mu}

[NCTF2019]Keyboard(键盘序)

题目

ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee

解题思路

这道题给的提示是keyboard键盘,然后发现密文都是键盘第一行的字母,正好上面有其对应的数字

然后又转到九键键盘,有几个字母代表在拼音九键中的第几个字母

吐个槽,脑洞很大,非常人能解之题

附上代码:

ctext = "ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee"
ctext = ctext.split(' ')
key_26 = 'qwertyuiop'
key_9 = {
   2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqrs',8:'tuv',9:'wxyz'}
flag = ''
for i in ctext:
    key = key_26.index(i[0])+1
    num = len(i)
    flag += key_9[key][num-1]
print(flag)

运行结果

youaresosmartthatthisisjustapieceofcake

flag

flag{youaresosmartthatthisisjustapieceofcake}

这是什么(JSFuck编码)

题目

小明是一个软件专业的高材生,但是老师布置的这次的作业似乎不怎么靠谱,因为他们老师以前是学物理的!喜欢乱七八糟命名文件,还喜欢奇奇怪怪的编码。你快帮小明看一下这题,小明准备好了一箱子辣条

给出一个apk文件:94f5b952-3710-4609-ab6f-bc11609fdc67.apk

解题思路

打开文件(Notepad或者把后缀改成txt)可以看到里面有一段很明显是JSFuck编码

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值