WhaleCTF 密码学_Writeup

期末事情有点多,新年放一波完整wp



Death_Chain

夏多密码,对照翻译即可,参考链接如下
https://www.33iq.com/group/topic/242254/
PS:所有的变换都要以原图中的为准,而不是基于上一次变换

先有什么

对着键盘画圈圈

检查符号

摩斯密码,写个替换脚本再翻译即可

# -*- coding: utf-8 -*-
# __author__: Pad0y

import re
s = "o00。o。o0oo。0o0o。000。00。o。0。000。ooo0。o。0o。oo0。ooo。0o0o。0。oo0o"
a = ["。", "o","0"]
b = [" ", ".","-"]
dic = dict(zip(a,b))
pattern = re.compile('(' + '|'.join(a) + ')')
s = pattern.sub(lambda a:dic[a.group()], s)
print(s)

德军密码

费娜姆密码,密文每7个一组,与密钥进行异或处理,详情看这里,脚本如下

# coding=utf-8
# __author__: Pad0y

import re


def b2ten(string):
    split = re.findall(r'.{7}', string)
    ten = []
    for i in split:
        ten.append(int(i, base=2))
    return ten

bin_t= '0000011000000000101010110111001011000101100000111001100100111100111001'
private_key= 'helloworld'
b2ascii = map(ord, private_key)
a_ten = b2ten(bin_t)
c = []
for i in range(len(a_ten)):
    c.append(a_ten[i] ^ b2ascii[i])
print ''.join(map(chr, c))

密钥生成

找个工具算下

规则很公平

tips是公平的游戏规则,想到了Playfair密码,也是一种古典密码,基于字符替换的密码。参考如下

Playfair算法是基于一个5*5的字母矩阵,
题目中CGOCPMOFEBMLUNISEOZY是密文,
关键词矩阵题目已经构造好了,比较省事。

  • 矩阵构造规则
按从左到右、从上到下顺序
填入关键词的字母(去除重复字母)后
将字母表其作余字母填入
  • 加密规则
Playfair加密算法是先将明文按两个字母一组进行分组,然后在矩阵中找对应的密文。

取密文的规则如下:
- 若明文出现相同字母在一组,则在重复的明文字母中插入
  一个填充字母(eg:z)进行分隔后重新分组(eg: balloon被重新分组为ba lz lo on)
  
- 若分组到最后一组时只有一个字母,则补充字母z
  若明文字母在矩阵中同行,则循环取其右边下一个字母为密文
  (矩阵最右边的下一个是最左边的第一个)(eg: ar被加密为RM)
  
- 若明文字母在矩阵中同列,则循环取其下边下一个字母为密文
  (矩阵最下边的下一个是最上边的第一个)(eg: mu被加密为CM)
  
- 若明文字母在矩阵中不同行不同列,则取其同行且与同组另一字
  母同列的字母为密文(eg: hs被加密为BP,ea被加密为IM或JM)

为了方便用numpy构造下5*5的关键词矩阵(其实是懒的画图)

# coding=utf-8
# __author__: Pad0y

import numpy as np
s = 'CULTREABDFGHIKMNOPQSVWXYZ'
print(np.array(list(s)).reshape(5, 5))

"""
手动解密对照如下,python两行代码的事情(pycipher)

[['C' 'U' 'L' 'T' 'R']
 ['E' 'A' 'B' 'D' 'F']
 ['G' 'H' 'I' 'K' 'M']
 ['N' 'O' 'P' 'Q' 'S']
 ['V' 'W' 'X' 'Y' 'Z']]
 """
# 从矩阵可以看出密钥是CULTRE
# CG OC PM OF EB ML UN IS EO ZY

栅栏加密

根据题目描述是分成了3根栅栏,将密文每3个字符一组,将第一列与第二列换一下位置(用notepad/sublime的列编辑模式很容易做到),得到如下

duJ
mZl
V2Y
uVW
dkx
XXs
N2e
D1V
V59
EXs
Z2d
7ZW
SlN
Vbr
9me
DNS
alF
GX9
F1

然后将所得到的字符串从上到下从左至右组合在一起再base64解码即可
numpy很容易就可以实现转换过程,解密脚本如下

# -*- coding: utf-8 -*-
# __author__: Pad0y

import numpy as np
import base64

s = 'udJZml2VYVuWkdxXXs2Ne1DV5V9XEs2ZdZ7WlSNbVrm9eNDSlaFXG91F*'  # 字符串末尾补充*,构造19*3的矩阵
arr = np.
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值