かんたんな暗号化プログラム

せっかくなので挑戦してみましょう。

用語

  • 暗号化: 通信内容や文書の内容を、鍵無しでは読めないように変換すること。
  • 復号: 暗号文をもとの読める状態に変換すること。
  • 平文: 元の文章。
  • 暗号文: 暗号からされた文章のこと。

仕様

  1. モードを選択する。(暗号化または復号)
  2. 鍵を入力する。鍵は、1から9までの整数値とする。
  3. 暗号化モードの場合は平文を、復号モードの場合は暗号文を入力させる。
  4. 暗号化モードの場合は暗号文を、復号モードの場合は平文をそれぞれ出力する。なお、暗号化/復号の際には、ユーザが入力した鍵を利用すること。

プログラムの実行例

かんたんな暗号化プログラムの実行例

アルゴリズム

暗号化のアルゴリズム

  1. ユーザから鍵と文字列(平文)が入力される。
  2. 文字列に対してループを回して、各文字に鍵の値を足して出力していく。

復号のアルゴリズム

  1. ユーザから鍵と文字列(暗号文)が入力される。
  2. 文字列に対してループを回して、一文字ずつ鍵を引いて出力していく。

文字列から鍵を足す/引くってどういうこと?

  • char型の値(文字)は、実は内部的にはタダの数値である。→ASCIIコード
    • 例えば、アルファベット大文字のAは10進で ‘65’ だし、アルファベット小文字のaは ‘97’ である。
    • 詳しくはASCII文字コード - IT用語辞典あたりを参照
  • ‘A’(65)に1を足せば、’B’(66)になる。
  • 今回の暗号化プログラムは、これを利用して、暗号化を行っている。
    • 平文が”Hello”で、鍵が3だとすると……。
    • ‘H’ + 3 –> ‘K’
    • ‘e + 3 –> ‘h’
    • ‘l’ + 3 –> ‘o’
    • ‘l’ + 3 –> ‘o’
    • ‘o’ + 3 –> ‘r’
    • よって暗号文は、 “khoor” である。
  • 復号は逆のことをすればOKです。
  • AさんとBさんで文書をやり取りする際に、お互いに「鍵は3にしておこう」と決めておいて文章を暗号化すれば、その鍵が第三者に知られない限り、文書の内容が盗み見られる事は無い、というわけです。
    • このような暗号化の形式を「共通鍵暗号」といいます。
    • 逆に言えば、鍵がバレたら終了です。
  • 暗号化用の鍵と復号用の鍵が別々な、「公開鍵暗号」という方式もあります。詳しくはググって。

ソースコードの例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// ソフトウェアテクノロジー部2016年度1年生向け
// 「かんたんな暗号化プログラム」

#include <stdio.h>

int main(void)
{
        char message[20];
        int mode;
        int key;
        int i;

        printf("モード選択(暗号化=1, 復号=2)\n");
        printf("--> ");
        scanf("%d", &mode);

        printf("鍵を入力\n");
        printf("--> ");
        scanf("%d", &key);

        switch(mode) {
                case 1:
                        printf("平文を入力\n");
                        printf("--> ");
                        scanf("%s", message);

                        i = 0;
                        printf("暗号文は ");
                        while(message[i] != '\0') {
                                printf("%c", message[i] + (char)key);
                                i++;
                        }
                        printf(" です。\n");
                        break;
                case 2:
                        printf("暗号文を入力\n");
                        printf("--> ");
                        scanf("%s", message);

                        i = 0;
                        printf("平文は ");
                        while(message[i] != '\0') {
                                printf("%c", message[i] - (char)key);
                                i++;
                        }
                        printf(" です。\n");
                        break;
                default:
                        printf("無効なモードです。");
                        break;
        }
        return 0;
}