#■はじめに
暗号化は、クレジットカードの番号やパスワードなどの秘密情報を暗号化し、「jd9w%siew0=oha」みたいな文字列することで、元のデータをわからなくすること。
復号化は、「jd9w%siew0=oha」を元のデータに戻すこと。
というのが、暗号化をよく知らないSEの理解ではないだろうか。と思ったので、出来るだけ簡単に、もうちょっと詳しく、説明してみる。
#■暗号化処理の基本
暗号化は、元のデータ(平文)を暗号化処理(AES、DESなど)で、暗号鍵を指定することで、暗号化文字列を生成する。
復号化は、逆に、暗号化文字列に暗号化処理(AES、DESなど)で、復号鍵を指定すること、元のデータ(平文)を生成する。
暗号化法式は、大きく、秘密鍵暗号方式と公開鍵暗号方式の2種類が存在する。
#■秘密鍵暗号方式(共通鍵暗号方式)
秘密鍵暗号方式は、暗号鍵と復号鍵を同じ鍵を利用する。
一般的なドアと一緒で、ロックするのとロック解除が同じ鍵なのです。
考え方的には、メールの添付ファイルにパスワードをつけて、送るのと同じ考えです。
メール送信者が添付ファイルにパスワード「pass2017」とつけて、送信し、受信者が添付ファイルをパスワード「pass2017」で解凍することで、第三者に添付ファイルが見れないように対策する。
暗号化は基本的に、数学の世界です。デジタルデータは2進数なので、全て、数値として扱うことができます。
なので、暗号化処理は数学者が考えて、作っています。
平文データを「x」とし、今回の例では、「2」とします。「x=2」
どのように暗号化処理をするかと言うと、「y=2x+1」とし、暗号化文字列を「y」を生成します。
x=2のため、y=5となります。これが暗号化です。
復号化はこれの逆のため、「x=(y-1)÷2」となります。
この数式「y=2x+1」が暗号化処理(AES、DESなど)です。(実際はもっと難しい式です)
しかし、これでは、暗号化処理が分かれば、数式が分かるため、復号化できてしまうので、「y=2x+a」とし、「a」を暗号処理をする人が値を決めることで復号化できなくします。
今回は「a=3」とします。そうすると、「y=2x+3」となるため、「x=2」は「y=7」となります。
復号化も「x=(y-3)÷2」となるため、「y=7」は「x=2」に復号化できます。
しかし、秘密鍵暗号方式は大きな問題があります。
鍵を秘密にしなければならないため、
AさんとBさんで暗号化してデータをやり取りする場合、その鍵をCさんには、ばれては、いけませんし、
AさんとCさんで暗号化してデータをやり取りする場合、その鍵をBさんには、ばれては、いけません。
つまり、秘密を共有する2者間で絶対に鍵がばれないようにしなければ、ならないのです。
分かりやすい例でいうと、ショッピングサイトで、クレジットカードを暗号化して、利用者がショッピングサイトに暗号化して送る場合、
利用者Aさんが暗号化して送る際に、利用者Bさんと同じ暗号化鍵だと、利用者Bさんに復号化されてしまうので、誰にも知られないようにAさんにショッピングサイトは暗号化鍵を送らなくてはならない。
郵送なり電話なりで、暗号化鍵を秘密裏に教える必要があり、また、ショッピングサイトも利用者ごとの鍵を管理しなければならず、非常に大変です。
これを解決するのが、「公開鍵暗号方式」です。
#■公開鍵暗号方式(非対象鍵暗号方式)
公開鍵暗号方式は、暗号化鍵と復号化鍵を別の鍵にし、どちらか片方を公開します。
上記のショッピングサイトの例でいえば、ショッピングサイトが暗号化鍵の方を公開し、皆が同じ鍵で暗号化しますが、復号化鍵は秘密にし、復号化は復号化鍵を持っているショッピングサイトしか、できません。
ドアで言うと、ロック用の鍵とロック解除用の鍵が別になります。ドアに鍵穴が2個あり、それぞれに鍵が用意されているイメージです。
数式的に、どうするかというと、簡単な話で暗号化「y=2x+a」と復号化「x=(y-2b)÷2」とし、暗号化鍵「a」と復号化鍵「b」に「a=2b」という関係性を持たせることで、これを実現します。
つまり、暗号鍵が「a=2」なら復号化鍵は「b=1」なのです。
しかし、これだと、片方の鍵からもう片方の鍵が分かってしまうため、実際には、一過性関数と言って、a→bは分かるが、b→aは分からないような関数を実施します。身近な一過性関数は四捨五入ですね。
秘密鍵から公開鍵を一過性関数で生成します。
#■公開鍵暗号方式のもう一つの顔
上記のようにすることで、「秘密鍵暗号方式」と「公開鍵暗号方式」で、秘密情報をばれないようにできます。
けど、「公開鍵暗号方式」には、もう1つ、重要な用途があります。
それが「デジタル署名(以下、署名)」です。
上記の処理では、暗号化鍵を公開しましたが、デジタル署名は、復号化鍵を公開し、暗号化鍵を秘密にします。
デジタル署名とは、会社Aからユーザに対して、文書で情報を発信した際に、その文書が会社Aが書いたものであることを証明するものが署名です。
どのようにやるかと言うと、文書を秘密にした暗号化鍵で、暗号化し、暗号化文字列を文書と一緒に公開します。
ユーザは暗号化文字列を公開されている復号化鍵で復号化し、復号されたデータが文書と一致していることで、会社Aが書いたものと確認することができます。
実際は、文書全体を暗号化すると、データもでかいし、処理時間もかかるため、文書をダイジェストデータにして(データの1部をかいつまんで)、暗号化しますが、そこは割愛します。
署名を簡単に言うと、文書の暗号化文字列を作れることで、文書の正当性を証明する仕組みです。
ショッピングサイトの例も実際は、この署名の仕組みを利用しています。
ショッピングサイトで暗号化鍵を公開する場合も、公開した暗号化鍵がショッピングサイトのものであることを証明するため、暗号化鍵に署名を付与し、暗号化鍵がショッピングサイトが発行しているものを証明し、暗号化してもらう仕組みになっています。
#■ついでに説明したい「3DES」
共通鍵暗号化処理「DES」を3回かけるのが共通鍵暗号化処理「3DES」です。
たまに勘違いしている人がいますが、3DESは3回DESの暗号化処理をかけるのではなく、「DES暗号化処理、DES復号化処理、DES暗号化処理」の3つを実施します。
復号化する場合は、逆に、「DES復号化処理、DES暗号化処理、DES復号化処理」を実施します。
数式で言うと、暗号化処理は、鍵「a」「b」「c」の3つを用意し、
「y=2x+a」→「x=(y-b)÷2」→「y=2x+c」を実施します。
つまり、暗号化し、間違った復号化をし、更に、別の暗号化をする。これが3DESです。
なので「a」と「c」は、同じでもいいですが、「a」と「b」は同じではいけませんし、「c」と「b」も同じではいけません。
「a」と「b」同じだと、「y=2x+a」→「x=(y-b)÷2」の時点で、元の平文に戻ってしまい。
「y=2x+c」の暗号化をかけただけの状態、ただのDESと同じ状態に戻ってしまいます。
;=w=)簡単に説明したかったけど、文字だけだと、難しいですね。。。