题目链接:http://www.shiyanbar.com/ctf/1870
这题提示里说:加解密方法就在谜面中
感动,这是我见过最良心的提示了(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