【PolarCTF】你知道M型栅栏密码吗?

原题网址:PolarD&N

下载题目文件,解压完就有一个txt文件

然后根据给的一大行字符里的B、O、D、H我就联想到了进制,正好分别是二进制、八进制、十进制、十六进制。

然后就用代码把这些数都转成字符。

import binascii
text = "H7b D97 B00110111 D57 H37 H67 D55 B00110100 D52 H31 H62 O65 O65 H33 H7d D97 D101 H66 H39 O143 B00110110 D98 H32 H65 O154 O67 B01100100 D98 H36 H30 O67 O145 D53 O146 D51 H61 H61 O145"
result = ''
text2 = text.split(' ')
for i in text2:
	if i[0] == 'B':
		result += chr(int(i[1:], 2))
	if i[0] == 'O':
		result += chr(int(i[1:], 8))
	if i[0] == 'D':
		result += chr(int(i[1:]))
	if i[0] == 'H':
		result += chr(int(i[1:], 16))
print(result)

然后就得到一串字符。

{a797g7441b553}aef9c6b2el7db607e5f3aae 

根据题目名字,我就去找了栅栏密码,本来以为能直接解出,结果出了问题,解密出来的不是flag

没办法,又去找度娘问了栅栏密码,发现普通的栅栏密码和M型的栅栏密码的解密时不一样的,原来问题在这里!

但我搜索了好久也没找到M型栅栏密码的解密网站,呜呜呜~

没办法,只能自己手动解密了。

. . . . {. . . . . . . a. . . . . . . 7. . . . . . . 9. . . . . . . 7

. . . g. 7. . . . . 4. 4. . . . . 1. b. . . . . 5. 5. . . . . 3. }

. . a. . . e. . . f. . . 9. . . c. . . 6. . . b. . . 2. . . e

. l. . . . . 7. d. . . . . b. 6. . . . . 0. 7. . . . . e. 5

f. . . . . . .3. . . . . . . a. . . . . . . a. . . . . . . e

然后连起来就成功了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
W栅栏密码是一种简单的加密算法,它通过将明文按照一定规则排列成W,然后按照特定顺序读取密文来实现加密。解密W栅栏密码的过程与加密相反,需要按照相同的规则重新排列密文,然后按照特定顺序读取明文。 以下是一个使用C++实现W栅栏密码解密的示例代码: ```cpp #include <iostream> #include <string> std::string decryptWZhalan(const std::string& ciphertext, int numRows) { if (numRows <= 1) { return ciphertext; } int len = ciphertext.length(); std::string plaintext(len, ' '); int cycleLen = 2 * numRows - 2; int index = 0; for (int i = 0; i < numRows; i++) { for (int j = 0; j + i < len; j += cycleLen) { plaintext[index++] = ciphertext[j + i]; if (i != 0 && i != numRows - 1 && j + cycleLen - i < len) { plaintext[index++] = ciphertext[j + cycleLen - i]; } } } return plaintext; } int main() { std::string ciphertext = "WZHALNCPTOY"; int numRows = 4; std::string plaintext = decryptWZhalan(ciphertext, numRows); std::cout << "Plaintext: " << plaintext << std::endl; return 0; } ``` 在上述代码中,`decryptWZhalan`函数接受两个参数:密文和栅栏的行数。它首先判断行数是否小于等于1,如果是,则直接返回密文。然后,根据W栅栏的规则,按照特定顺序将密文中的字符重新排列成明文。最后,返回解密后的明文。 在示例代码中,我们使用了一个密文"WZHALNCPTOY"和4行的栅栏进行解密。运行代码后,将输出解密后的明文"WHYCATZLONP"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值