【C言語】
シーザー暗号の暗号化と復号化をC言語でプログラミングしよう


■この記事の概要

この記事では、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”が
作られます。