Bugku 密码学AK指南

#bugku 密码学 AK指南
平台网址

bugku新上了几个密码学,更新一波,顺便整理一下CSDN和github的博客。
1.滴答~滴

-... -.- -.-. - ..-. -- .. ... -.-. 

很明显是摩斯密码,直接摩斯解密加上flag格式就好。

KEY{BKCTFMISC}
2.聪明的小羊


这里写图片描述

根据题目提示,很明显是栅栏加密,直接栅栏解密就可以了。

KEY{sad23jjdsa2}
3.ok


题目内容是一堆Ook!直接用下边的解密网址,选择Ook! to Text就好。

解密网址

flag{ok-ctf-1234-admin}
4.这不是摩斯密码


题目给出了一段字符串。

这里写图片描述

很明显这确实不是摩斯密码,还是用第3题那个网址解密,选择Brainfuck to Text解密即可。

flag{ok-c2tf-3389-admin}
5.简单加密


e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA

题目给出了字符串,并提示说简单的加密,字符串后俩位为AA,猜测这个字符串应该是一个base64,后俩位为==,写一个解密脚本,即可解出key。

import base64
str1 = 'e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA'
str2 = ''
for i in range(len(str1)):
    str2 += chr(ord(str1[i])-4)

str2 = base64.b64decode(str2)
print(str2)

key{68743000650173230e4a58ee153c68e8}
6.一段Base64


工具链接:https://pan.baidu.com/s/1IC0Kk1wvVwWf_ThuKvY1vA

题目给出一段base64。
解码顺序:Base64 to Text ->Unescape->Hex to text->Unescape->Dec to Text->Decode HTML->Decode HTML->Unescape。解密中可能有一些问题,需要自己来修改一下解码后的编码。

flag{ctf_tfc201717qwe}
7…!?


用Ook!解密得到flag.

flag{bugku_jiami}
8.+[]-


用Brainfuck解密得到flag。

flag{bugku_jiami_23}
9.奇怪的密码


突然天上一道雷电
gndk€rlqhmtkwwp}z

观察一下前四位的ASCII码,103 110 100 107,flag的ASCII码为102 108 97 103可以看出是对flag进行了移位,写出解密脚本。

str1 = 'gndk€rlqhmtkwwp}z'
str2 = ''
for i in range(0,len(str1)):
    str2 += chr(ord(str1[i])-i-1)

print(str2)

flag{lei_ci_jiami}
10.托马斯.杰斐逊


这里写图片描述
根据密钥将明文重新排列。

2: <KPBELNACZDTRXMJQOYHGVSFUWI <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
14:<XPHKZGJTDSENYVUBMLAOIRFCQW <
10:<WABMCXPLTDSRJQZGOIKFHENYVU <
13:<BMCSRFHLTDENQWAOXPYVUIKZGJ <
11:<XPLTDAOIKFZGHENYSRUBMCQWVJ <
12:<TDSWAYXPLVUBOIKZGJRFHENMCQ <

然后根据密文再次排列。

2: <HGVSFUWIKPBELNACZDTRXMJQOY<
5: <CPMNZQWXYIHFRLABEUOTSGJVDK<
1: <BVIQHKYPNTCRMOSFEZWAXJGDLU<
3: <TEQGYXPLOCKBDMAIZVRNSJUWFH<
6: <SLOQXVETAMKGHIWPNYCJBFZDRU<
4: <XQYIZMJWAORPLNDVHGFCUKTEBS<
9: <WATDSRFHENYVUBMCOIKZGJXPLQ<
7: <CEONJQGWTHSPYBXIZULVKMRAFD<
8: <RJLXKISEFAPMYGHBQNOZUTWDCV<
14:<QWXPHKZGJTDSENYVUBMLAOIRFC<
10:<GOIKFHENYVUWABMCXPLTDSRJQZ<
13:<LTDENQWAOXPYVUIKZGJBMCSRFH<
11:<ENYSRUBMCQWVJXPLTDAOIKFZGH<
12:<SWAYXPLVUBOIKZGJRFHENMCQTD<

可以看到倒数第六列XSXSBUGKUADMIN

flag{xsxsbugkuadmin}
11.zip伪加密


题目给了一个flag.zip,题目提示是zip伪加密,用UE打开。将图中标记的09改为00并保存。

这里写图片描述

解压得到flag。

flag{Adm1N-B2G-kU-SZIP}
12.告诉你个秘密(ISCCCTF)


636A56355279427363446C4A49454A7154534230526D6843
56445A31614342354E326C4B4946467A5769426961453067

只有0到E,猜测是十六进制,解码之后为cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g,然后将字符串base64解码,得到r5yG lp9I BjM tFhB T6uh y7iJ QsZ bhM,发现是键盘加密,例如r5yG中间是t,最后解出来的是tongyuan,直接提交TONGYUAN即可。(这道题的格式还是挺坑的。。。)
13.来自宇宙的信号

这里写图片描述

这是一种叫做标准银河字母的编码,解码得到nopqrst

flag{nopqrst}

14.散乱的密文

lf5{ag024c483549d7fd@@1}
一张纸条上凌乱的写着2 1 6 5 3 4

猜测应该是分组加密,手动撸一波flag。

字符串长度为24,将字符串分成4组,每六个一组,如下图所示

flag{52048c453d794df1}

15.这不是md5

666c61677b616537333538376261353662616566357d

这不是md5,很明显66,6c,61,67是flag的十六进制,直接十六进制转字符串。

flag{ae73587ba56baef5}

16.贝斯家族

@iH<,{bdR2H;i6*Tm,Wx2izpx2!

以前只知道有base64,base32,base16,通过这道题才知道还有base58,62,91…

这道题是base91编码。放一个解码网站

http://ctf.ssleye.com/

flag{554a5058c9021c76}

17.富强民主

公正公正公正诚信文明公正民主公正法治法治友善平等和谐敬业和谐富强和谐富强和谐文明和谐平等公正公正和谐法治公正公正公正文明和谐民主和谐敬业和谐平等和谐敬业和谐敬业和谐和谐和谐公正法治友善法治

刚开始看到这道题我是服的,居然把社会主义核心价值观拿出来编码,膜拜一波大佬们。还是在刚才那个网站,有一个核心价值观编码。原理大概就是字符的ASCII编码,转成十六进制然后根据社会主义核心价值观索引。

flag{90025f7fb1959936}

18.凯撒部长的奖励

MSW{byly_Cm_sIol_lYqUlx_yhdIs_Cn_Wuymul_il_wuff_bcg_pCwnIl_cm_u_Yrwyffyhn_guh_cz_sio_quhn_ni_ayn_bcm_chzilguncihm_sio_wuh_dich_om}

直接凯撒解码得出flag

SYC{here_Is_yOur_rEwArd_enjOy_It_Caesar_or_call_him_vIctOr_is_a_Excellent_man_if_you_want_to_get_his_informations_you_can_join_us}

19.python(N1CTF)

给出了两个python代码,一个是封装好的类,一个是定义的对象。

1.N1ES.py

# -*- coding: utf-8 -*-
def round_add(a, b):
	f = lambda x, y: x + y - 2 * (x & y)
	res = ''
	for i in range(len(a)):
	    res += chr(f(ord(a[i]), ord(b[i])))
	return res

def permutate(table, block):
	return list(map(lambda x: block[x], table))

def string_to_bits(data):
    data = [ord(c) for c in data]
    l = len(data) * 8
    result = [0] * l
    pos = 0
    for ch in data:
        for i in range(0,8):
            result[(pos<<3)+i] = (ch>>i) & 1
        pos += 1
    return result

s_box = [54, 132, 138, 83, 16, 73, 187, 84, 146, 30, 95, 21, 148, 63, 65, 189, 188, 151, 72, 161, 116, 63, 161, 91, 37, 24, 126, 107, 87, 30, 117, 185, 98, 90, 0, 42, 140, 70, 86, 0, 42, 150, 54, 22, 144, 153, 36, 90, 149, 54, 156, 8, 59, 40, 110, 56,1, 84, 103, 22, 65, 17, 190, 41, 99, 151, 119, 124, 68, 17, 166, 125, 95, 65, 105, 133, 49, 19, 138, 29, 110, 7, 81, 134, 70, 87, 180, 78, 175, 108, 26, 121, 74, 29, 68, 162, 142, 177, 143, 86, 129, 101, 117, 41, 57, 34, 177, 103, 61, 135, 191, 74, 69, 147, 90, 49, 135, 124, 106, 19, 89, 38, 21, 41, 17, 155, 83, 38, 159, 179, 19, 157, 68, 105, 151, 166, 171, 122, 179, 114, 52, 183, 89, 107, 113, 65, 161, 141, 18, 121, 95, 4, 95, 101, 81, 156, 17, 190, 38, 84, 9, 171, 180, 59, 45, 15, 34, 89, 75, 164, 190, 140, 6, 41, 188, 77, 165, 105, 5, 107, 31, 183, 107, 141, 66, 63, 10, 9, 125, 50, 2, 153, 156, 162, 186, 76, 158, 153, 117, 9, 77, 156, 11, 145, 12, 169, 52, 57, 161, 7, 158, 110, 191, 43, 82, 186, 49, 102, 166, 31, 41, 5, 189, 27]

def generate(o):
    k = permutate(s_box,o)
    b = []
    for i in range(0, len(k), 7):
        b.append(k[i:i+7] + [1])
    c = []
    for i in range(32):
		pos = 0
		x = 0
		for j in b[i]:
			x += (j<<pos)
			pos += 1
		c.append((0x10001**x) % (0x7f))
    return c



class N1ES:
    def __init__(self, key):
        if (len(key) != 24 or isinstance(key, bytes) == False ):
            raise Exception("key must be 24 bytes long")
        self.key = key
        self.gen_subkey()

    def gen_subkey(self):
        o = string_to_bits(self.key)
        k = []
        for i in range(8):
	        o = generate(o)
        	k.extend(o)
        	o = string_to_bits([chr(c) for c in o[0:24]])
        self.Kn = []
        for i in range(32):
            self.Kn.append(map(chr, k[i * 8: i * 8 + 8]))
        return 

    def encrypt(self, plaintext):
        if (len(plaintext) % 16 != 0 or isinstance(plaintext, bytes) == False):
            raise Exception("plaintext must be a multiple of 16 in length")
        res = ''
        for i in range(len(plaintext) / 16):
            block = plaintext[i * 16:(i + 1) * 16]
            L = block[:8]
            R = block[8:]
            for round_cnt in range(32):
                L, R = R, (round_add(L, self.Kn[round_cnt]))
            L, R = R, L
            res += L + R
        return res

2.challenge.py

from N1ES import N1ES
import base64
key = "wxy191iss00000000000cute"
n1es = N1ES(key)
flag = "N1CTF{*****************************************}"
cipher = n1es.encrypt(flag)
print base64.b64encode(cipher)  # HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx	

经过观察算法和搜索资料可以知道,这个是Feistel加密的结构,加密和解密的算法是相同的,只是密钥需要取反而已,相似的可以参考一下DES加密算法。

写出解密脚本。

# -*- coding: utf-8 -*-
import base64
def round_add(a,b):
	f = lambda x,y: x + y - 2 * (x & y)
	res = ''
	for i in range(len(a)):
		res += chr(f(ord(a[i]),ord(b[i])))
	return res

def permutate(table,block):
	return list(map(lambda x: block[x], table))

def string_to_bits(data):
	data = [ord(c) for c in data]
	l = len(data)*8
	result = [0] * l
	pos = 0
	for ch in data:
		for i in range(0,8):
			result[(pos<<3)+i] = (ch>>i) & 1
		pos += 1
	return result

s_box = [54, 132, 138, 83, 16, 73, 187, 84, 146, 30, 95, 21, 148, 63, 65, 189, 188, 151, 72, 161, 116, 63, 161, 91, 37, 24, 126, 107, 87, 30, 117, 185, 98, 90, 0, 42, 140, 70, 86, 0, 42, 150, 54, 22, 144, 153, 36, 90, 149, 54, 156, 8, 59, 40, 110, 56,1, 84, 103, 22, 65, 17, 190, 41, 99, 151, 119, 124, 68, 17, 166, 125, 95, 65, 105, 133, 49, 19, 138, 29, 110, 7, 81, 134, 70, 87, 180, 78, 175, 108, 26, 121, 74, 29, 68, 162, 142, 177, 143, 86, 129, 101, 117, 41, 57, 34, 177, 103, 61, 135, 191, 74, 69, 147, 90, 49, 135, 124, 106, 19, 89, 38, 21, 41, 17, 155, 83, 38, 159, 179, 19, 157, 68, 105, 151, 166, 171, 122, 179, 114, 52, 183, 89, 107, 113, 65, 161, 141, 18, 121, 95, 4, 95, 101, 81, 156, 17, 190, 38, 84, 9, 171, 180, 59, 45, 15, 34, 89, 75, 164, 190, 140, 6, 41, 188, 77, 165, 105, 5, 107, 31, 183, 107, 141, 66, 63, 10, 9, 125, 50, 2, 153, 156, 162, 186, 76, 158, 153, 117, 9, 77, 156, 11, 145, 12, 169, 52, 57, 161, 7, 158, 110, 191, 43, 82, 186, 49, 102, 166, 31, 41, 5, 189, 27]

def generate(o):
	k = permutate(s_box,o)
	b = []
	for i in range(0,len(k),7):
		b.append(k[i:i+7]+[1])
	c = []
	for i in range(32):
		pos = 0
		x = 0
		for j in b[i]:
			x += (j<<pos)
			pos += 1
		c.append((0x10001**x) % (0x7f))
	return c

class N1ES:
	def __init__(self,key):
		if (len(key) != 24 or isinstance(key,bytes) == False):
			raise Exception("key must be 24 bytes long")
		self.key = key
		self.gen_subkey()
	
	def gen_subkey(self):
		o = string_to_bits(self.key)
		k = []
		for i in range(8):
			o = generate(o)
			k.extend(o)
			o = string_to_bits([chr(c) for c in o[0:24]])
		self.Kn = []
		for i in range(32):
			self.Kn.append(map(chr,k[i*8: i*8+8]))
		return
	
	def decrypt(self,plaintext):
		res = ''
		for i in range(len(plaintext)/16):
			block = plaintext[i*16:(i + 1)*16]	
			L = block[:8]
			R = block[8:]
			for round_cnt in range(32):
				L,R = R, (round_add(L, self.Kn[31-round_cnt]))
			L,R = R,L
			res += L + R
		return res


key = "wxy191iss00000000000cute"
nles = N1ES(key)
flag = base64.b64decode("HRlgC2ReHW1/WRk2DikfNBo1dl1XZBJrRR9qECMNOjNHDktBJSxcI1hZIz07YjVx")
flag = nles.decrypt(flag)
print flag

N1CTF{F3istel_n3tw0rk_c4n_b3_ea5i1y_s0lv3d_/–/}

20.进制转换

d87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e

很明显这题也需要脚本,不多说,直接上脚本。

# -*- coding: utf-8 -*-

def bin_to_dec(x):
	return chr(int(x,2))

def hex_to_dec(x):
	return chr(int(x,16))

def oct_to_dec(x):
	return chr(int(x,8))


data = 'd87 x65 x6c x63 o157 d109 o145 b100000 d116 b1101111 o40 x6b b1100101 b1101100 o141 d105 x62 d101 b1101001 d46 o40 d71 x69 d118 x65 x20 b1111001 o157 b1110101 d32 o141 d32 d102 o154 x61 x67 b100000 o141 d115 b100000 b1100001 d32 x67 o151 x66 d116 b101110 b100000 d32 d102 d108 d97 o147 d123 x31 b1100101 b110100 d98 d102 b111000 d49 b1100001 d54 b110011 x39 o64 o144 o145 d53 x61 b1100010 b1100011 o60 d48 o65 b1100001 x63 b110110 d101 o63 b111001 d97 d51 o70 d55 b1100010 d125 x20 b101110 x20 b1001000 d97 d118 o145 x20 d97 o40 d103 d111 d111 x64 d32 o164 b1101001 x6d o145 x7e'
listd = data.split(' ')
res = ''

for x in listd:
	ch = x[0]
	if ch == 'x':
		res += hex_to_dec(x[1:])
	elif ch == 'o':
		res += oct_to_dec(x[1:])
	elif ch == 'b':
		res += bin_to_dec(x[1:])
	elif ch == 'd':
		res += chr(int(x[1:]))

print res

解出的结果是Welcome to kelaibei. Give you a flag as a gift. flag{1e4bf81a6394de5abc005ac6e39a387b} . Have a good time~

flag{1e4bf81a6394de5abc005ac6e39a387b}

21.affine

y = 17x-8 flag{szzyfimhyzd}

看题目名称感觉是仿射加密,写出脚本

# -*- coding: utf-8 -*-

data = 'szzyfimhyzd'
res = ''
for x in data:
	x = ord(x)
	for i in range(0,26):
		if x == (17*i-8)%26+97:
			res += chr(i+97)

print res

解出flag

flag{affineshift}

22.Crack it

破解该文件,获得密码,flag格式为:flag{*}

题目给了一个shadow文件,我们需要把shadow文件中的密码破解出来即可得到flag。

这里就要介绍一下kali下自带的一个工具John the Ripper,是可以破解passwd文件和shadow文件的密码的,具体这里就不多说了,想要了解的可以自行百度。

john shadow
john --show shadow

解出密码

flag{hellokitty}

23.rsa

未果。。。等我大概懂了rsa再来写这题的WP
######Copyright © 2018 by Prowes5

######版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值