分析:
1.利用搜索引擎找到Symphony From New World的作者是Antonín Dvořák
2.最后关头搜到Dvorak是一种键盘布局,如下图
Dvorak键盘布局
传统键盘布局
3.然后查看题目提供的密文
Paste_Image.png
4.想到有可能是两种键盘字符的对应关系,尝试了前几个字符,发现有实际意义,密文实际上是一串英文.
5.于是编写脚本破译密文:
C语言源码如下:
#include <stdio.h>
#include <stdlib.h>
//Dvorak->QWERTY
void Dvorak_To_QWERT();
//QWERTY->Dvorak
void QWERT_To_Dvorak();
//主函数
int main()
{
int choose;//1,2表示不同功能
do{
fflush(stdin);
printf("1. Dvorak->QWERT (Please make sure the input is ended with '$')\n");
printf("2. QWERT->Dvorak (Please make sure the input is ended with '$')\n");
printf("3. exit\n");
scanf("%d", &choose);
if(choose == 1){
Dvorak_To_QWERT();
}else if(choose == 2){
QWERT_To_Dvorak();
}else if(choose == 3){
exit(0);
}
printf("\n");
}while(choose != 1 && choose != 2 && choose != 3);
return 0;
}
//Dvorak->QWERTY
void Dvorak_To_QWERT(){
int i = 0;//times
int count = 0;//the length of input string
char ch[1000];//input string
printf("Input : \n");
fflush(stdin);
while((ch[count] = getchar()) != '$'){
count++;
}
printf("The length is : %d \n", count);
printf("Output : \n");
printf("***********************************\n");
for(i = 0; i < count; i++){
if(ch[i] == '['){
printf("-");
}else if(ch[i] == '{'){
printf("_");
}else if(ch[i] == ']'){
printf("=");
}else if(ch[i] == '}'){
printf("+");
}else if(ch[i] == '\''){
printf("q");
}else if(ch[i] == '"'){
printf("Q");
}else if(ch[i] == ','){
printf("w");
}else if(ch[i] == '<'){
printf("W");
}else if(ch[i] == '.'){
printf("e");
}else if(ch[i] == '>'){
printf("E");
}else if(ch[i] == 'p'){
printf("r");
}else if(ch[i] == 'P'){
printf("R");
}else if(ch[i] == 'y'){
printf("t");
}else if(ch[i] == 'Y'){
printf("T");
}else if(ch[i] == 'f'){
printf("y");
}else if(ch[i] == 'F'){
printf("Y");
}else if(ch[i] == 'g'){
printf("u");
}else if(ch[i] == 'G'){
printf("U");
}else if(ch[i] == 'c'){
printf("i");
}else if(ch[i] == 'C'){
printf("I");
}else if(ch[i] == 'r'){
printf("o");
}else if(ch[i] == 'R'){
printf("O");
}else if(ch[i] == 'l'){
printf("p");
}else if(ch[i] == 'L'){
printf("P");
}else if(ch[i] == '/'){
printf("[");
}else if(ch[i] == '?'){
printf("{");
}else if(ch[i] == '='){
printf("]");
}else if(ch[i] == '+'){
printf("}");
}else if(ch[i] == 'o'){
printf("s");
}else if(ch[i] == 'O'){
printf("S");
}else if(ch[i] == 'e'){
printf("d");
}else if(ch[i] == 'E'){
printf("D");
}else if(ch[i] == 'u'){
printf("f");
}else if(ch[i] == 'U'){
printf("F");
}else if(ch[i] == 'i'){
printf("g");
}else if(ch[i] == 'I'){
printf("G");
}else if(ch[i] == 'd'){
printf("h");
}else if(ch[i] == 'D'){
printf("H");
}else if(ch[i] == 'h'){
printf("j");
}else if(ch[i] == 'H'){
printf("J");
}else if(ch[i] == 't'){
printf("k");
}else if(ch[i] == 'T'){
printf("K");
}else if(ch[i] == 'n'){
printf("l");
}else if(ch[i] == 'N'){
printf("L");
}else if(ch[i] == 's'){
printf(";");
}else if(ch[i] == 'S'){
printf(":");
}else if(ch[i] == '_'){
printf("\'");
}else if(ch[i] == '-'){
printf("\"");
}else if(ch[i] == ':'){
printf("z");
}else if(ch[i] == ';'){
printf("Z");
}else if(ch[i] == 'q'){
printf("x");
}else if(ch[i] == 'Q'){
printf("X");
}else if(ch[i] == 'j'){
printf("c");
}else if(ch[i] == 'J'){
printf("C");
}else if(ch[i] == 'k'){
printf("v");
}else if(ch[i] == 'K'){
printf("V");
}else if(ch[i] == 'x'){
printf("b");
}else if(ch[i] == 'X'){
printf("B");
}else if(ch[i] == 'b'){
printf("n");
}else if(ch[i] == 'B'){
printf("N");
}else if(ch[i] == 'w'){
printf(",");
}else if(ch[i] == 'W'){
printf("<");
}else if(ch[i] == 'v'){
printf(".");
}else if(ch[i] == 'V'){
printf(">");
}else if(ch[i] == 'z'){
printf("/");
}else if(ch[i] == 'Z'){
printf("?");
}else{
printf("%c", ch[i]);
}
}
printf("\n***********************************\n");
printf("\nFinished!");
}
//QWERTY->Dvorak
void QWERT_To_Dvorak(){
int i = 0;//times
int count = 0;//the length of input string
char ch[1000];//input string
printf("Input : \n");
fflush(stdin);
while((ch[count] = getchar()) != '$'){
count++;
}
printf("The length is : %d \n", count);
printf("Output : \n");
printf("***********************************\n");
for(i = 0; i < count; i++){
if(ch[i] == '-'){
printf("[");
}else if(ch[i] == '_'){
printf("{");
}else if(ch[i] == '='){
printf("]");
}else if(ch[i] == '+'){
printf("}");
}else if(ch[i] == 'q'){
printf("\'");
}else if(ch[i] == 'Q'){
printf("\"");
}else if(ch[i] == 'w'){
printf(",");
}else if(ch[i] == 'W'){
printf("<");
}else if(ch[i] == 'e'){
printf(".");
}else if(ch[i] == 'E'){
printf(">");
}else if(ch[i] == 'r'){
printf("p");
}else if(ch[i] == 'R'){
printf("P");
}else if(ch[i] == 't'){
printf("y");
}else if(ch[i] == 'T'){
printf("Y");
}else if(ch[i] == 'y'){
printf("f");
}else if(ch[i] == 'Y'){
printf("F");
}else if(ch[i] == 'u'){
printf("g");
}else if(ch[i] == 'U'){
printf("G");
}else if(ch[i] == 'i'){
printf("c");
}else if(ch[i] == 'I'){
printf("C");
}else if(ch[i] == 'o'){
printf("r");
}else if(ch[i] == 'O'){
printf("R");
}else if(ch[i] == 'p'){
printf("l");
}else if(ch[i] == 'P'){
printf("L");
}else if(ch[i] == '['){
printf("/");
}else if(ch[i] == '{'){
printf("?");
}else if(ch[i] == ']'){
printf("=");
}else if(ch[i] == '}'){
printf("+");
}else if(ch[i] == 's'){
printf("o");
}else if(ch[i] == 'S'){
printf("O");
}else if(ch[i] == 'd'){
printf("e");
}else if(ch[i] == 'D'){
printf("E");
}else if(ch[i] == 'f'){
printf("u");
}else if(ch[i] == 'F'){
printf("U");
}else if(ch[i] == 'g'){
printf("i");
}else if(ch[i] == 'G'){
printf("I");
}else if(ch[i] == 'h'){
printf("d");
}else if(ch[i] == 'H'){
printf("D");
}else if(ch[i] == 'j'){
printf("h");
}else if(ch[i] == 'J'){
printf("H");
}else if(ch[i] == 'k'){
printf("t");
}else if(ch[i] == 'K'){
printf("T");
}else if(ch[i] == 'l'){
printf("n");
}else if(ch[i] == 'L'){
printf("N");
}else if(ch[i] == ';'){
printf("s");
}else if(ch[i] == ':'){
printf("S");
}else if(ch[i] == '\''){
printf("_");
}else if(ch[i] == '"'){
printf("-");
}else if(ch[i] == 'z'){
printf(":");
}else if(ch[i] == 'Z'){
printf(";");
}else if(ch[i] == 'x'){
printf("q");
}else if(ch[i] == 'X'){
printf("Q");
}else if(ch[i] == 'c'){
printf("j");
}else if(ch[i] == 'C'){
printf("J");
}else if(ch[i] == 'v'){
printf("k");
}else if(ch[i] == 'V'){
printf("K");
}else if(ch[i] == 'b'){
printf("x");
}else if(ch[i] == 'B'){
printf("X");
}else if(ch[i] == 'n'){
printf("b");
}else if(ch[i] == 'N'){
printf("B");
}else if(ch[i] == ','){
printf("w");
}else if(ch[i] == '<'){
printf("W");
}else if(ch[i] == '.'){
printf("v");
}else if(ch[i] == '>'){
printf("V");
}else if(ch[i] == '/'){
printf("z");
}else if(ch[i] == '?'){
printf("Z");
}else{
printf("%c", ch[i]);
}
}
printf("\n***********************************\n");
printf("\nFinished!");
}
运行的结果如下:
Paste_Image.png
成功拿到flag
后记:
Bug
发现出题人的一个小Bug
在成功翻译出明文后,利用搜索引擎找到了原文
然后利用NodePad的插件Compare进行原文和明文进行比较
发现有两处不同,这也是出题人有一点不严密的地方吧
在写算法的时候可能没有考虑到键盘上某一些符号的转换
答案:
hitctf{Dv0raks{3ymph0nies{are{gr8}
知识点:
1.Dvorak键盘布局
2.计算机基本编程