新版暗号技術入門 秘密の国のアリスを読み始めた.
新版暗号技術入門 秘密の国のアリス、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; }
感想
- 研修で使ったC言語、もう結構忘れてた(アドレス演算子忘れとか、変換指定子とか)。
- まあ学習用ならscanfで良いかな。C言語講座:gets( )とscanf( )の問題点の解決あたりに従うと、scanfは
fgets(code, sizeof(code), stdin);
fflush(stdin);
とでも書きなおすべきなのかもしれないけど、仕様がよく分からないので調べましょう。
追記(2013/7/16)
わざわざプログラム書いたけれども、sedによる単一換字暗号: 情報セキュリティにあるように、sedコマンドで簡単に復号できる。