暗号化の基本
1-1. シーザー暗号
シーザー暗号とは、古代ローマのジュリアス・シーザーが使ったとされる暗号方式です。
平文の各文字をアルファベット順に3文字だけシフトして暗号文を作ったとされています。
平文の各文字をアルファベット順に3文字だけシフトして暗号文を作ったとされています。
ABC
DEF
実際には、シフトする文字数は3文字に限る必要はないので、状況に応じて「鍵」であるシフト数を変えればいいことになります。
また、この暗号を読む側も、「鍵」であるシフト数を知っていれば、容易に解読することができます。
現代でも、この暗号化とその復元というアルゴリズムは生きているといっていいでしょう。
現在では、このような機械的な暗号・復号の処理は、プログラムが得意とするところです。
これをPerlプログラムで作成してみると、次のように記述することができます(暗号・復号の対象文字は英小文字限定の場合です)。
上記のとおり、文字列を暗号し、さらに無事に元の文字列に戻すことができました。
古代の暗号方式はここまでにして、次からは近年の暗号方式についてです。
use strict; # 対象文字 my $passwd = 'this is a pen.'; # シフト数 (1 〜 25 まで) my $shift = 3; # 暗号 my $crypt = &encrypt($passwd, $shift); print "$crypt\n"; # 復号 print &decrypt($crypt, $shift), "\n"; #----------------------------------------------------------- # シーザー暗号 #----------------------------------------------------------- sub encrypt { my ($wd, $shift) = @_; # 対象文字 my @wd = ('a' .. 'z'); # 変換テーブル作成 my %wd; for (0 .. $#wd) { # 添字を定義 my $key = $_ <= $#wd - $shift ? $_ + $shift : $_ - $#wd + $shift - 1; # ハッシュ生成 $wd{$wd[$_]} = $wd[$key]; } # 変換テーブルにより暗号化 my $ret; for ( split(//,$wd) ) { # 定義済は変換 if (defined($wd{$_})) { $ret .= $wd{$_}; # 未定義はそのまま } else { $ret .= $_; } } return $ret; } #----------------------------------------------------------- # シーザー復号 #----------------------------------------------------------- sub decrypt { my ($crypt, $shift) = @_; # 対象文字 my @wd = ('a' .. 'z'); # 変換テーブル作成 my %wd; for (0 .. $#wd) { # 添字を定義 my $key = $_ <= $#wd + $shift ? $_ - $shift : $_ + $#wd - $shift + 1; # ハッシュ生成 $wd{$wd[$_]} = $wd[$key]; } # 復号 my $ret; for ( split(//,$crypt) ) { # 定義済は変換 if (defined($wd{$_})) { $ret .= $wd{$_}; # 未定義はそのまま } else { $ret .= $_; } } return $ret; }
> wklv lv d shq. > this is a pen.
古代の暗号方式はここまでにして、次からは近年の暗号方式についてです。
1-2. 可逆式と不可逆式
近年の暗号方式を見ていく場合、文字列を暗号化するスタイルとして、「可逆式」か「不可逆式」かの2つがあります。
「可逆式」とは、一度暗号化したものを、そっくりそのまま元に戻せるものをいいます。 それに対して、「不可逆式」とは、一度暗号化すると、元の文字列に戻せない方式をいいます。
「可逆式」とは、一度暗号化したものを、そっくりそのまま元に戻せるものをいいます。 それに対して、「不可逆式」とは、一度暗号化すると、元の文字列に戻せない方式をいいます。
「不可逆式」の場合、元に戻せないような暗号化処理をするため、一般的には「可逆式」に比べて暗号化の強度が堅牢であるといえます。
ここで、「不可逆式」の場合に疑問に思う人がいるかもしれません。元に戻せない暗号文字を、どうやって元の文字列(平文)と照らし合わせるのかと。
それは、照らし合わせたい文字列の方(平文)を同様に暗号化して、同じ暗号文字になっているかどうかを比較すればいいことになります。 これをここでは「照合」と呼ぶことにしましょう。
ちなみに、「可逆式」の場合は、いったん元の文字列に戻す訳ですから、これを「復号」といいます。
それは、照らし合わせたい文字列の方(平文)を同様に暗号化して、同じ暗号文字になっているかどうかを比較すればいいことになります。 これをここでは「照合」と呼ぶことにしましょう。
ちなみに、「可逆式」の場合は、いったん元の文字列に戻す訳ですから、これを「復号」といいます。
スタイル | 特徴 | 復号・照合 |
---|---|---|
可逆式 | 元の文字列に復元できる | 復号 |
不可逆式 | 元の文字列に復元できない 可逆式に比べて強固 |
照合 |
1-3. DESとMD5について
具体的な暗号化方式は、近年では次の2種が有名で、1つは「DES方式」、もう1つは「MD5方式」です。
いずれも、不可逆式の暗号化方式です。
いずれも、不可逆式の暗号化方式です。
「DES方式」とは、「Data Encryption Standard(データ暗号化標準)」の略で、1977年に開発された暗号化方式です。
56ビットの鍵を使った共通鍵暗号を基盤としており、アルゴリズムを広く公開した初めての暗号方式で、かつて広く普及していました。
しかしながら、最近では暗号強度が弱いとされ、あまり使われなくなってきました。
しかしながら、最近では暗号強度が弱いとされ、あまり使われなくなってきました。
「MD5方式」の方は、「Message Digest Algorithm 5」の略で、1991年に開発された暗号化方式です。
128ビットのハッシュ値を出力するハッシュ関数で、DES方式に比較して暗号強度が強く、DES方式に取って代わりました。
しかし、ここ最近では弱点も次第に指摘されてくるようになってきました。