まりものメモ帳

なぐり書き

C言語でシーザー暗号を作る/解くプログラムを書いた話

どうも、まりもです。レポートが終わりません。助けて。
えーと今回は結構前に書いたシーザー暗号という暗号を作る/解く為のプログラムを発掘したんで載せようと思います。
内容薄。

シーザー暗号って何や

 アルファベットを何文字かずらして書く暗号という超がめっちゃつくほど簡単で単純な暗号です。ジュリアス・シーザーさんが使ったとされてます。
例えば、
I am marimo.
を3文字ずらすと
L dp pdulpr.
となります。結構これでもわかりにくくなったりするんですごいと思います。
今回作ったプログラムは13文字ずらすようになっています。

プログラム

#include<stdio.h>
int main(void){
	char c;
	while((c=getchar()) != '\n'){    //改行される、すなわちエンターキーが押されるまで
		if((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z')){
			c -= 13;    //n~zまたはN~Zの時に13文字前にずらす
		}
		else if((c < 'n' && c >= 'a') || (c < 'N' && c >= 'A')){
			c += 13;    //a~nまたはA~Nの時に13文字後にずらす
		}
		printf("%c",c);    //文字で出力
	}
	printf("\n");
	return 0;
}	

C言語において文字は全て数字管理されています。
ASCIIコードでAは0x41(= 65)、aは0x61(= 97)です。b = 0x62、c = 0x63...と続いていきます。
なので文字にnを足してあげるとn文字後にずらされた文字になるということなのです。わかりにくいですかね。
ちなみに13は16進数表記で0xDです。
 実際に実行してみましょう。

$ ./a.out
My Twitter Account is @admarimoin!
Zl Gjvggre Nppbhag vf @nqznevzbva!

見事にずらされて帰ってきました。スペース、@マーク、!マークはアルファベットでは無いので変更無しですね。
では逆に戻してみましょう。

$ ./a.out
Zl Gjvggre Nppbhag vf @nqznevzbva!
My Twitter Account is @admarimoin!

やったぜ。ちゃんと帰ってきました。

おわりに

 いかがでしたでしょうか。意外と簡単に自分で暗号が作れちゃうもんですね。

お疲れ様でした。