#はじめに
CpawCTFを解いていて、久々にC言語を書きたくなったのでプログラムを作成する。
*自分用メモ
*初投稿のため、誤字脱字・コードの間違い等ありましたら申し訳ありません。
#問題
今回の問題はQ6.[Crypto] Classical Cipherである。
問題として出題されていた暗号文は「fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}」である。
そのため、この問題を解くためのプログラムを作成する。
##コード
#include<stdio.h>
int main(void){
char str[256] = {'\0'};
char answer[256]= {'\0'};
char flag[256]= {'\0'};
printf("Please enter a FLAG=");
gets(flag);
printf("Please enter Caesar cipher=");
gets(str);
for(int i = 0;i < 26; i++){
for(int n = 0; str[n] != '\0' ; n++){
if(str[n] >= 'A' && str[n] <= 'Z'){
if(str[n] + i > 'Z') answer[n] = (str[n] + i) - 26;
else answer[n] = str[n] + i;
}else if(str[n] >= 'a' && str[n] <= 'z'){
if(str[n] + i > 'z') answer[n] = (str[n] + i) - 26;
else answer[n] = str[n] + i;
}else answer[n] = str[n];
}
if(answer[0] == flag[0]) printf("%s\n",answer);
}
return 0;
}
上記のプログラムを作成した。
「flag」の配列に入れた文字列とi文字シフトした文字列の一文字目を比較し、一致した場合のみ出力する。
そのため、今回は最初の入力時に「cpaw」と入力し、二度目の入力に暗号文を入力すると答えが出力される。
#まとめ
もう少しわかりやすくコーディングできるかもしれないが、簡単なシーザー暗号を解くにはこのプログラムで十分だと思う。
見直してみると配列名と最初に出力する文はflagではなくkeyの方がよかったかもしれない。