决斗场 - 实验吧 密码学 古典密码

题目链接:http://www.shiyanbar.com/ctf/1870

决斗场 - 实验吧 密码学 古典密码_第1张图片

这题提示里说:加解密方法就在谜面中

感动,这是我见过最良心的提示了(0.0)。那么在知道了加解密方法是古典密码之后,我们先对密文进行字符转换。观察密文的结构,先进行ascii码转换

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100;
int str_1[maxn] = {79,67,85,123,67,70,84,69,76,88,79,85,89,68,69,67,84,78,71,65,72,79,72,82,78,70,73,69,78,77,125,73,79,84,65};
char str_2[maxn];
int len = 35;
int main() {
	freopen("out.txt", "w", stdout);
	for(int i=0; i


幸运的是,acsii转换出来看起来并不奇怪,得到了一串字符:

OCU{CFTELXOUYDECTNGAHOHRNFIENM}IOTA


在第二个提示中,有说道我们可以利用flag的固定结构为ctf{XXXXX}的结构。


那么古典密码那么多种类,到底是哪一种呢。

问题现在变成了通过用古典密码凑出ctf{XXXX}的固定结构。


古典密码主要分为两种:置换、代换。

接下来我们分析一下,密文的字符串中,已经有{}这个结构,那么仔细思考,这里用到的方法应该不会是代换密码,而是置换密码,否则要在这串字符串相应位置中代换出{}且原字符串中的{}代换为字母,应该是做不到的。


那么这个问题又简化为用置换密码凑出ctf{XXXX}的结构。

考虑到列置换中的分组,因为这个字符串的长度为35,35 = 5 * 7。我们可以考虑将这个字符串分为5组或者7组。

当字符串分成组时:

OCU{C

FTELX

OUYDE

CTNGA

HOHRN

FIENM

}IOTA

第一行,怎么进行列置换都达不到ctf{}的固定结构,故舍弃。

当字符串分成7组时:

OCU{CFT

ELXOUYD

ECTNGAH

OHRNFIE

NM}IOTA

观察可以发现,第一行通过2764…或5764…时,第一行能够构造出CTF{的结构,而这种置换同时也要使得最后一行的最后一个字符变为},那么可行的置换为2764…3,和5764…3,那么加上剩下未知的一共四种方案,经过我们提交尝试后得出,正确的置换方案为2764513
CTF{COU
LDYDUEX
CHANGET   ----> CTF{COULDYOUEXCHANGETHEINFORMATION}
HEINFOR
MATION}




你可能感兴趣的:(安全_密码学,实验吧-CTF题解)