■この記事の概要
この記事では、C言語を用いたシーザー暗号の暗号化・復号化プログラムを解説しています。文字列のシフト操作を実現する関数や、ファイル入出力を用いた実例を提示し、暗号化・復号化結果を別ファイルに保存する方法を説明。サンプルコード付きで実用的な内容です。
■シーザー暗号ソース全文
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
char caesar(char c,int n) {
if (isupper(c))
return 'A' + (c - 'A' + n + 26) % 26;
if (islower(c))
return 'a' + (c - 'a' + n + 26) % 26;
return c;
}
void encrypt(char *input,int add){
for(char *cp = &input[0]; *cp != '\0'; cp++){
*cp = caesar(*cp,add);
}
}
void decrypt(char *input,int sub){
for(char *cp = &input[0]; *cp != '\0'; cp++){
*cp = caesar(*cp,-sub) ;
}
}
int main(int argc,char *argv[]){
char *filename ;
if(argc == 2) {
filename = argv[1];
} else {
filename = "input.txt";
}
FILE *fp = fopen(filename,"re");
if(fp == NULL){
fprintf(stderr,"開かん %s\n",filename);
exit(1);
}
FILE *en = fopen("encrypt.txt","we");
if(en == NULL){
fprintf(stderr,"開かん %s\n","encrypt.txt");
exit(1);
}
FILE *de = fopen("decrypt.txt","we");
if(en == NULL){
fprintf(stderr,"開かん %s\n","decrypt.txt");
exit(1);
}
char buf[BUFSIZ];
int line = 0 ;
while(fgets(buf,BUFSIZ,fp) != NULL){
int shift = (line%25)+1 ; // 0~25
line++ ;
printf("S=%d:暗号入力:%s",shift,buf);
encrypt(buf,shift);
printf("S=%d:暗号結果:%s",shift,buf);
fprintf(en,"%s",buf);
decrypt(buf,shift);
printf("S=%d:復号結果:%s",shift,buf);
fprintf(de,"%s",buf);
printf("------\n");
}
fclose(fp);
fclose(en);
fclose(de);
}
■遊び方
$./a.out /usr/include/stdio.h↓
暗号化したいファイル名を指定します。
暗号化したファイル”encrypt.txt”と、
復号化したファイル”decrypt.txt”が
作られます。