LoginSignup
2
2

More than 5 years have passed since last update.

シーザー暗号の解読(CpawCTF write up)

Last updated at Posted at 2018-07-22

はじめに

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の方がよかったかもしれない。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2