読者です 読者をやめる 読者になる 読者になる

シーザー暗号の解読

C言語 暗号

新版暗号技術入門 秘密の国のアリスを読み始めた.

新版暗号技術入門 秘密の国のアリス、p26クイズ1でシーザー暗号の解読をするためのプログラムをC言語で書いた。

#include <stdio.h>
#define NUM_ALPHABET 26

/*
シーザー暗号復号プログラム
→Caesar cipherによる暗号文をbrute-force attackにより解読する
*/
int main()
{
	int i = 0;
	char code[32]={'\0'};
	char *ptr = &code[0];
	printf("--シーザー暗号復号プログラム--\n\n");
	
	printf("複合したい暗号文を入力してください:");
	scanf("%s",code);
	putchar('\n');
	
	for(i=0;i<NUM_ALPHABET;i++)
	{
		ptr = &code[0];
		printf("鍵%2dで復号: ",i);
		while(!(*ptr == '\0'))
		{  
	 		if(*ptr+i<='z'){
			/*文字コードにiを足す(文字コードをi字分ずらす)*/
				printf("%c",*ptr+i);
			}else{
			/*
			文字コードをずらすとzを超えるときは、
			先頭(a)から文字コードに(i-26)を足す
			*/
				printf("%c",*ptr+i-NUM_ALPHABET);
			}
			ptr++;
		}
		putchar('\n');
	}
	return 0;
}

感想

 fgets(code, sizeof(code), stdin);
 fflush(stdin);
とでも書きなおすべきなのかもしれないけど、仕様がよく分からないので調べましょう。

  • gedit+gccでやるのはちょっとだるい。VisualStudioは便利だった。
  • ↑でもUbuntu環境でも便利な方法はあるはず。探そう。
  • ↑というか、普段使いの言語はコンパイルしなくても良いものを探すべきかも?
  • "crypt"と"cipher"と"code"の意味って違うのだろうか?

追記(2013/7/16)

わざわざプログラム書いたけれども、sedによる単一換字暗号: 情報セキュリティにあるように、sedコマンドで簡単に復号できる。

追記(2014/3/9)

文字コードをずらすとzを超えるときは、先頭(a)から文字コードに(i-26)を足す”なんてせずmodを使ったらいよかったかもしれない。