14 かんたんな暗号化プログラム(春休みの暇つぶし その1)
かんたんな暗号化プログラム
春休みの暇つぶしにどうぞ。
用語
- 暗号化: 通信内容や文書の内容を、鍵無しでは読めないように変換すること。
- 復号: 暗号文をもとの読める状態に変換すること。
- 平文: 元の文章。
- 暗号文: 暗号からされた文章のこと。
仕様
- モードを選択する。(暗号化または復号)
- 鍵を入力する。鍵は、1から9までの整数値とする。
- 暗号化モードの場合は平文を、復号モードの場合は暗号文を入力させる。
- 暗号化モードの場合は暗号文を、復号モードの場合は平文をそれぞれ出力する。なお、暗号化/復号の際には、ユーザが入力した鍵を利用すること。
プログラムの実行例
アルゴリズム
暗号化のアルゴリズム
- ユーザから鍵と文字列(平文)が入力される。
- 文字列に対してループを回して、各文字に鍵の値を足して出力していく。
復号のアルゴリズム
- ユーザから鍵と文字列(暗号文)が入力される。
- 文字列に対してループを回して、一文字ずつ鍵を引いて出力していく。
文字列から鍵を足す/引くってどういうこと?
- char型の値(文字)は、実は内部的にはタダの数値である。→ASIIコード
- 例えば、アルファベット大文字の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;
}