bugku密码学通关指南

1.滴答~滴

1
-... -.- -.-. - ..-. -- .. ... -.-.

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

1
KEY{BKCTFMISC}

2.聪明的小羊

一只小羊翻过了2个栅栏

1
KYsd3js2E{a2jda}

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

1
KEY{sad23jjdsa2}

3.ok

1
2
3
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.

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

https://www.splitbrain.org/services/ook

4.这不是摩斯密码

1
2
3
4
5
6
7
+++++ +++++ [->++ +++++ +++<]>++.+ +++++ .<+++ [-="">-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< +++[- >---< ]>--- .---- .<+++ ++++[="" -="">--- ----<
]>--- ----- ----- .<+++ ++++[="" -="">+++ ++++< ]>+++ ++.<+ +++++="" +[-="">- -----
-<]>. <++++ ++++[="" -="">+++ +++++ <]>++ .<+++ [-="">-- -<]>- ----. <++++ +++[-<="" span="">
>---- ---<]>---- ----. +++++ +..++ +++.+ .<+++ [-="">-- -<]>- --.<+ +++++<="" span="">
+[->+ +++++ +<]>+ ++.++ +.+++ +++++ +.--- -.+++ ++.<+ ++[-=""> +++<]>++++
++.<

Brainfuck 选择Brainfuck to Text解密即可

https://www.splitbrain.org/services/ook

5.easy_crypto

1
0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0 000 1 01111 10 11110 101011 1111101

莫尔斯电码加密。
通过百度文库,找到了mrose和ascii的对应关系如下

抄别人的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
string=input()
key=string.split(" ")
dictionary= {'01': 'A',
'1000': 'B',
'1010': 'C',
'100':'D',
'0':'E',
'0010':'F',
'110': 'G',
'0000': 'H',
'00': 'I',
'0111':'J',
'101': 'K',
'0100': 'L',
'11': 'M',
'10': 'N',
'111': 'O',
'0110': 'P',
'1101': 'Q',
'010': 'R',
'000': 'S',
'1': 'T',
'001': 'U',
'0001': 'V',
'011': 'W',
'1001': 'X',
'1011': 'Y',
'1100': 'Z',
'01111': '1',
'00111': '2',
'00011': '3',
'00001': '4',
'00000': '5',
'10000': '6',
'11000': '7',
'11100': '8',
'11110': '9',
'11111': '0',
'001100': '?',
'10010': '/',
'101101': '()',
'100001': '-',
'010101': '.',
'110011':',',
'011010':'@',
'111000':':',
'101010':':',
'10001':'=',
'011110':"'",
'101011':'!',
'001101':'_',
'010010':'"',
'10110':'(',
'1111011':'{',
'1111101':'}'
};
for item in key:
print(dictionary[item],end='')

6.简单加密

1
2
3
4
5
6
7
8
9
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}

7.散乱的密文

lf5{ag024c483549d7fd@@1}

一张纸条上凌乱的写着2 1 6 5 3 4

排好顺序按照1-6的顺序读出

1
2
3
4
5
6
216534
lf5{ag
024c48
3549d7
fd@@1}
flag{52048c453d794df1}

8.凯撒部长的奖励

1
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}

凯撒加密

1
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}

9.一段Base64

https://ctf.bugku.com/files/39488475fd87c064f9401eec2299c03e/1.txt

解码顺序:Base64 to Text ->Unescape->Hex to text->Unescape->Dec to Text->Decode HTML->Decode HTML->Unescape。

https://blog.csdn.net/pdsu161530247/article/details/74640746

10..!?

1
2
3
4
5
6
7
8
9
..... ..... ..... ..... !?!!. ?.... ..... ..... ..... .?.?! .?... .!...
..... ..... !.?.. ..... !?!!. ?!!!! !!?.? !.?!! !!!.. ..... ..... .!.?.
..... ...!? !!.?. ..... ..?.? !.?.. ..... .!.?. ..... ..... !?!!. ?!!!!
!!!!! !?.?! .?!.? ..... ....! ?!!.? ..... ...?. ?!.?. ..... !.?.. .....
!?!!. ?!!!! !!?.? !.?!! !!!!! !!!!. ..... ...!. ?.... ...!? !!.?. .....
?.?!. ?..!. ?.... ..... !?!!. ?!!!! !!!!? .?!.? !!!!! !!!!! !!!.? .....
..!?! !.?.. ....? .?!.? ....! .!!!. !!!!! !!!!! !!!!! !!.?. ..... .!?!!
.?... ...?. ?!.?. ..... !.!!! !!!!! !.?.. ..... ..!?! !.?.. ..... .?.?!
.?... ..... !.?.

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

https://www.splitbrain.org/services/ook

11.+[]-

1
2
3
4
5
6
+++++ +++++ [->++ +++++ +++<]>++.+ +++++ .<+++ [-="">-- -<]>- -.+++ +++.<
++++[ ->+++ +<]>+ +++.< +++++ [->-- ---<]>.<++ ++[-=""> ++++< ]>+++ .<+++< span="">
[->-- -<]>- ----. ++++. <+++[ -="">+++ <]>+. <++++ [-="">-- --<]> ----- -.<++< span="">
+[->+ ++<]> ++.-. ----- ---.< +++[- >+++< ]>+++ .---- .<+++ [-="">-- -<]>-
.<+++ +++[-="">---- --<]> ----- ----. +.<++ +++++="" +[-="">+ +++++ ++<]> +++++
+++++ .<

Brainfuck 选择Brainfuck to Text解密即可

https://www.splitbrain.org/services/ook

12.奇怪的密码

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

gndk€rlqhmtkwwp}z这个格式像不像flag{***}?

我们比较一下”gndk”与”flag”的ASCII码

gndk的10进制的ASCII码分别是:103 110 100 107

flag的10进制的ASCII码分别是 :102 108 97 103

发现ASCII以此减少 1 2 3 4,所以以此类推

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

print(str2)

13.托马斯.杰斐逊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1: 
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12

密文:HCBTSXWCRQGLES

flag格式 flag{你解密的内容}

根据密钥将明文重新排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2: 
5:
1:
3:
6:
4:
9:
7:
8:
14:
10:
13:
11:
12:

然后根据密文再次排列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2: 
5:
1:
3:
6:
4:
9:
7:
8:
14:
10:
13:
11:
12:
可以看到倒数第六列XSXSBUGKUADMIN

14.zip伪加密

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

解压得到flag。

15.告诉你个秘密(ISCCCTF)

1
2
636A56355279427363446C4A49454A7154534230526D6843
56445A31614342354E326C4B4946467A5769426961453067

16进制——>acsii——>base64解码——>键盘密码

最后解出来的是tongyuan,直接提交TONGYUAN即可。

16.这不是md5

1
666c61677b616537333538376261353662616566357d

16进制到文本字符串的转换
http://www.bejson.com/convert/ox2str/

17.贝斯家族

1
@iH<,{bdr2h;i6*tm,wx2izpx2!< span="">

base91 解码
http://ctf.ssleye.com/base91.html

flag{554a5058c9021c76}

18.富强民主

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

核心价值观编码
http://www.nicetool.net/app/core_values.html

19.python(N1CTF)

据已知的加密方式,写出解密的脚本

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

抄的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- 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 += 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

20.进制转换

二进制、八进制、十进制、十六进制,你能分的清吗?

1
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import binascii
text = "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"
solution = ''
text2 = text.split(' ')
for x in text2:
print(x)
if x[0] == 'b': #binary
solution += chr(int(x[1:],2))
elif x[0] == 'x': # hexadecimal
solution += x[1:].decode("hex")
elif x[0] == 'd': # decimal
solution += chr(int(x[1:]))
elif x[0] == 'o': # octal
solution += chr(int(x[1:],8))
print(solution)

21. affine

y = 17x-8 flag{szzyfimhyzd}

答案格式:flag{*}

22.Crack it

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

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

kali下自带的一个工具John the Ripper,是可以破解passwd文件和shadow文件的密码的

1
2
john shadow
john --show shadow

flag{hellokitty}

23.rsa

1
2
3
4
N : 460657813884289609896372056585544172485318117026246263899744329237492701820627219556007788200590119136173895989001382151536006853823326382892363143604314518686388786002989248800814861248595075326277099645338694977097459168530898776007293695728101976069423971696524237755227187061418202849911479124793990722597
e : 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619

enc : 38230991316229399651823567590692301060044620412191737764632384680546256228451518238842965221394711848337832459443844446889468362154188214840736744657885858943810177675871991111466653158257191139605699916347308294995664530280816850482740530602254559123759121106338359220242637775919026933563326069449424391192

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#coding:utf-8
from libnum import n2s,s2n
import base64
def gcd(a, b): #࿢๋य़لᕅහ
if a < b:
a, b = b, a
while b != 0:
temp = a % b
a = b
b = temp
return a
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
else:
return x % m
if __name__ == "__main__":
p=15991846970993213322072626901560749932686325766403404864023341810735319249066370916090640926219079368845510444031400322229147771682961132420481897362843199
q=28805791771260259486856902729020438686670354441296247148207862836064657849735343618207098163901787287368569768472521344635567334299356760080507454640207003
e = 354611102441307572056572181827925899198345350228753730931089393275463916544456626894245415096107834465778409532373187125318554614722599301791528916212839368121066035541008808261534500586023652767712271625785204280964688004680328300124849680477105302519377370092578107827116821391826210972320377614967547827619
# tmp = base64.b64decode("qzogS7X8M3ZOpkUhJJcbukaRduLyqHAPblmabaYSm9iatuulrHcEpBmil7V40N7gbsQXwYx5EBH5r5V2HRcEIOXjgfk5vpGLjPVxBLyXh2DajHPX6KvbFpQ8jNpCQbUNq8Hst00yDSO/6ri9dk6bk7+uyuN0b2K1bNG5St6sCQ4qYEA3xJbsHFvMqtvUdhMiqO7tNCUVTKZdN7iFvSJqK2IHosIf7FqO24zkHZpHi31sYU7pcgYEaGkVaKs8pjq6nbnffr4URfoexZHeQtq5UAkr95zD6WgvGcxaTDKafFntboX9GR9VUZnHePiio7nJ3msfue5rkIbISjmGCAlj+w==")
# =
d = modinv(e, (p - 1) * (q - 1))
# c=s2n(tmp)
c = 38230991316229399651823567590692301060044620412191737764632384680546256228451518238842965221394711848337832459443844446889468362154188214840736744657885858943810177675871991111466653158257191139605699916347308294995664530280816850482740530602254559123759121106338359220242637775919026933563326069449424391192
#c = 225031483444634056931067907865853799650197225351377050632290334721073031287701730297815850654473721939907812470206115171738967740183098960272963323728747481560137205796840356532306950935686580268408289864109695494835661414073083573249882362332920722000099781994315336570711188934565379141406727420346806389405536474102730682155998263607095718543239272202402139286809779368710600842078606046563228470023546348908618719147790859257980882643030144242048154566691808688844513142261099020381730517293884263384819159874220288293023868919557980548807831273449743064237407705987056818011286315950476959812697067649075359373253
n = p*q
m=pow(c,d,n)
print (n2s(m))

24.来自宇宙的信号

银河标准字母

对应得到flag:
flag{nopqrst}

0%