BJDCTF2020CRYPTO

这次做一些简单题,巩固一下基础

首先是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倍关系,所以说棋盘密码无疑了,那现在就是有一个问题,不知道顺序。

现在的已知罗列如下:

aeoiu
aabcde
efghi,jk
olmnop
iqrstu
uvwxyz

以及第一行有字符: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}。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 中的 crypto 是一个内置模块,用于提供加密和解密功能。它支持各种加密算法和操作,包括哈希函数、对称加密和非对称加密。你可以使用 crypto 模块来实现数据的加密、解密、签名和验证等操作。 要使用 crypto 模块,你需要在你的代码中引入它,例如: ```javascript const crypto = require('crypto'); ``` 一些常见的 crypto 操作包括: 1. 哈希函数:crypto 模块提供了多个哈希函数,如 MD5、SHA-1、SHA-256 等。你可以使用这些函数对数据进行哈希处理,生成唯一的摘要。例如: ```javascript const hash = crypto.createHash('sha256'); hash.update('Hello, world!'); const digest = hash.digest('hex'); console.log(digest); // 输出生成的摘要 ``` 2. 对称加密:crypto 模块支持对称加密算法,如 AES、DES、3DES 等。你可以使用这些算法对数据进行加密和解密。例如: ```javascript const cipher = crypto.createCipher('aes192', 'password'); let encrypted = cipher.update('Hello, world!', 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log(encrypted); // 输出加密后的数据 const decipher = crypto.createDecipher('aes192', 'password'); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log(decrypted); // 输出解密后的数据 ``` 3. 非对称加密:crypto 模块还支持非对称加密算法,如 RSA。你可以使用这些算法生成公钥和私钥,进行加密和解密。例如: ```javascript const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 4096, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' } }); console.log(publicKey); // 输出生成的公钥 console.log(privateKey); // 输出生成的私钥 const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('Hello, world!')); console.log(encrypted.toString('base64')); // 输出加密后的数据 const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log(decrypted.toString('utf8')); // 输出解密后的数据 ``` 这只是 crypto 模块的一小部分功能,你可以查阅 Node.js 文档以获取更详细的信息和使用方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值