C言語

【C言語】第10章第5回:暗号化と復号化プログラム

本記事では、C言語を用いて文字列の暗号化と復号化を行うプログラムを作成します。基本的な暗号化アルゴリズムと実装方法を学びます。

0. 記事の概要

この記事を読むメリット

  • データセキュリティの基礎理解:シンプルな暗号化アルゴリズムの実装を通じて、セキュリティの基本を学べます。
  • 文字列操作スキルの向上:文字列の操作や処理に関するスキルが向上します。
  • プログラムの応用可能性:暗号化ロジックを応用して、高度なセキュリティシステムの開発が可能です。

この記事で学べること

  • シーザー暗号の原理と実装
  • 暗号化と復号化のプロセス
  • 文字列操作の基本技術

1. 暗号化と復号化プログラムの基本設計

1.1 シーザー暗号とは?

シーザー暗号は、各文字を一定のシフト値でずらすことで暗号化を行う簡単な方法です。

例:
入力: "HELLO", シフト値: 3
暗号化: "KHOOR"

1.2 必要なプログラム構造

プログラムは以下の3つの主要部分で構成されます。

  • 文字列の入力処理
  • 暗号化と復号化の実装
  • ユーザーインタラクションの処理

2. コード例と詳細解説

2.1 基本コード例

#include <stdio.h>
#include <string.h>

void encrypt(char *text, int shift) {
    for (int i = 0; text[i] != '\\0'; i++) {
        if (text[i] >= 'A' && text[i] <= 'Z') {
            text[i] = ((text[i] - 'A' + shift) % 26) + 'A';
        } else if (text[i] >= 'a' && text[i] <= 'z') {
            text[i] = ((text[i] - 'a' + shift) % 26) + 'a';
        }
    }
}

void decrypt(char *text, int shift) {
    encrypt(text, 26 - shift); // 復号化はシフト値を逆に
}

int main() {
    char text[256];
    int shift, choice;

    printf("暗号化/復号化プログラムへようこそ!\\n");
    printf("文字列を入力してください: ");
    scanf("%s", text);
    printf("シフト値を入力してください: ");
    scanf("%d", &shift);

    printf("1. 暗号化\\n");
    printf("2. 復号化\\n");
    printf("選択してください: ");
    scanf("%d", &choice);

    if (choice == 1) {
        encrypt(text, shift);
        printf("暗号化された文字列: %s\\n", text);
    } else if (choice == 2) {
        decrypt(text, shift);
        printf("復号化された文字列: %s\\n", text);
    } else {
        printf("無効な選択です。\\n");
    }

    return 0;
}
動作解説
  1. 文字列の入力処理:`scanf`でユーザーから暗号化対象の文字列とシフト値を取得します。
  2. 暗号化処理:`encrypt`関数で各文字をシフトして暗号化します。
  3. 復号化処理:`decrypt`関数でシフトを逆方向に適用して復号化します。

3. 練習問題

以下の課題に挑戦して、暗号化プログラムを拡張してみましょう。

  1. 暗号化に対応するアルゴリズムを変更して、ヴィジュネル暗号を実装してください。
  2. 英数字以外の文字(例: 空白や記号)をスキップする機能を追加してください。
  3. 暗号化された文字列を復号化する際に、自動でシフト値を判別する機能を実装してください。

4. 練習問題の解答と解説

問2の解答例

// 英数字以外の文字をスキップ
void encryptEnhanced(char *text, int shift) {
    for (int i = 0; text[i] != '\\0'; i++) {
        if ((text[i] >= 'A' && text[i] <= 'Z') || (text[i] >= 'a' && text[i] <= 'z')) {
            if (text[i] >= 'A' && text[i] <= 'Z') {
                text[i] = ((text[i] - 'A' + shift) % 26) + 'A';
            } else if (text[i] >= 'a' && text[i] <= 'z') {
                text[i] = ((text[i] - 'a' + shift) % 26) + 'a';
            }
        }
    }
}

この関数では、アルファベット以外の文字をスキップする機能を追加しました。

5. まとめ

本記事では、シーザー暗号を用いた暗号化と復号化の基本プログラムを実装しました。次はヴィジュネル暗号やその他のアルゴリズムを試してみましょう。