这次做一些简单题,巩固一下基础
首先是ctfshow内部赛密码2
全文只给出了ctf和show两个单词,不是什么特殊字符,也不属于特殊解密,类似于这样的,可以想到摩斯密码,它是由-与.组成的,试着用ctf作.,show作-,敲完前四行编码,转换之后为flag,所以挨个敲就好了。
BJDCTF2020签到题
这种题目一般是归纳总结,仅有小写字母与数字组成的密文,我们可以想到MD5,hex,键盘密码等等,这道题使用的是hex编码,直接带入网站就好。
BJDCTF2020编码与调制
这道题主要考的是,曼彻斯特编码,我也是第一次见,所以先解释一下曼彻斯特编码,同时给自己浅浅巩固一下,
首先来看一张图,曼彻斯特编码也是由0和1组成,关键要看那跟线的起伏.
由低转高为1,由高转低为0,有时候不一样,这个需要看上面的数字信号,比如这张图,就代表着由高转低为1,由低转高为0,这里把这个转变就成为跳
接下来是差分曼彻斯特编码,首先第一个字母就按曼彻斯特编码来,从第二个字母开始,如果说跳的话就转变数字,不跳的话就继续填那个数字。
那接下来我们来看题目
首先看Manchester这一行,它首先从高向下跳,并且这一列对应的是0,也就是说从上到下是0,从下到上是1.
然后我们在读取它时,从上到下读取,然后在整合起来,例如第一行是0000,第二行是1011
那么下来就是0100/1011/0101/0101/1010/1011/0101/0101/0101/1010/1011
01001011010101011010101101010101010110101011
对,我就试着这么写的,结果是错误答案,我以为是自己推导错误,然后才发现推导没错,思路错了,我们只需要把题目附件给出的
放到工具里,先把这个密文转二进制,在二进制转曼彻斯特编码,最后曼彻斯特转16进制,然后解得出了字符串024A447B4469664D616E63686573746572636F64657D,然后16进制转字符串就ok了。(注意选标准曼彻斯特解码)
这道题曼彻斯特编码的图片只是告诉我们需要使用这个方法,但不是用那个图给出的二进制进行推导,以至于现在到凌晨,希望更多的人避雷!
BJDCTF2020Polybius
题目已经说了是Polybius,说明是棋盘密码,来介绍一下棋盘密码
棋盘密码有许多种,这只是其中一种,第一行与第一列的字符可以随意替换,但中间部分是固定的,加密也非常简单,例如如果要加密a,就是11,加密s,就是43以此类推。
那现在来看一下题目
密文:ouauuuoooeeaaiaeauieuooeeiea
hint:VGhlIGxlbmd0aCBvZiB0aGlzIHBsYWludGV4dDogMTQ=
flag:解出明文后,请加上BJD{}
有提示先解提示,最后那个等于号可以看出是base64编码,解密之后,可以得到
The length of this plaintext: 14
翻译一下就是该明文的长度为14,然后再看密文的长度为28,刚好为2倍关系,所以说棋盘密码无疑了,那现在就是有一个问题,不知道顺序。
现在的已知罗列如下:
a | e | o | i | u | |
a | a | b | c | d | e |
e | f | g | h | i,j | k |
o | l | m | n | o | p |
i | q | r | s | t | u |
u | v | w | x | y | z |
以及第一行有字符:u,o,e,a,i
第一列有字符:o,a,u,i,e
但是现在不清楚它们的排列方式是怎样的,也就是说现在一共有5!=120种情况,当然如果有耐心的话一个一个是可以试出来的,在这里我们使用脚本
import itertools
s="aeoiu"
sumresult=[]
numsumresult=[]
ciper="ouauuuoooeeaaiaeauieuooeeiea"
for i in itertools.permutations(s,5):#因为在这里并不清楚aeoiu的排列顺序,因此调用函数做一个全排列
sumresult.append("".join(i))
"""
下面这行代码是来进行一个棋盘的演示:
首先从上面的全排列先选出一组字符,然后在找到密文的对应的字符
最后我们得到得数字,就是密文各个字符,在表格中排列位置
可以进行调试,第一次调试过后,j为o,此时temp为3,而按照刚才的aeoiu的顺序,o也的确在第三个位置。
"""
for i in sumresult:
temp=""
for j in ciper:
temp+=str(i.index(j)+1)
numsumresult.append(temp)
"""
在进行棋盘演示之后,我们就需要开始自己的表演了:
首先取上面的第一串数字,然后因为在明文中,每一个字符需要用两个字母加密,那在下面的循环结构里,
也是以每两个数字为一个单位进行求解,
后面这个计算式:xx=(int(i[j])-1)*5+int(i[j+1])+96其实就是一个棋盘里找规律
来浅浅验证一下子吧,ou,所以第一个加密的字符是p,ou为3和5,p的字母表位置是第16,所以说用上面那个算式,但是,这么做会有一个问题
表格里i和j放在一起了,也就是说现在等于缺了一个字符,导致i(包括i)前面的字符不受影响,后面的字符少了一位,那就需要加一个判断语句
让后面的数字挨个+1,问题就都解决了,最后输出就好
另外+96是因为要变成ASCLL值,虽然大家都懂,但还是提示一下下。
"""
for i in numsumresult:
ans_=""
for j in range(0, len(i),2):
xx=(int(i[j])-1)*5+int(i[j+1])+96
if xx>ord('i') :
xx+=1
ans_+=chr(xx)
print(ans_)
上面是所需要的脚本,思路什么的我都进行了标注,不懂得可以再私聊问我,或者自己先试着调试一下,调试真的能解决许多困惑。哦最后的答案是flagispolybius,记得加BJD。
这是base?
码表:
'JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/='
chipertext:
FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw
题目给了这些东西,下面是密文,上面是已经被修改过的码表,但还是平常的base加密,稍有不同的是,这次我们需要一点点手段,换一下码表
import base64
dict='JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/='
normaldict= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
chipertext='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
l=[]
for i in range(len(chipertext)):
l.append(dict.index(chipertext[i]))
Decreptchipertext=''
for m in l:
Decreptchipertext+=normaldict[m]
flag=base64.b64decode(Decreptchipertext)
print(flag)
这里倒是不用担心因为码表被换会不会结果不一样的问题毕竟它变化的是字符而不是数字。
最后是BJD{D0_Y0u_kNoW_Th1s_b4se_map}。