技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く興味があります。

RSA暗号を実装してみる(知識編)

WEPキーに脆弱性があって突破されてしまうということを知ってから、最近暗号理論に興味をもって勉強していた。その中で、RSA暗号すげえってなったから実装してみたいと思う。単純そうに見えて奥深い。

今回はまず暗号について勉強した知識をまとめる。数学的なことやプログラムは後日書いていこうと思う。

続編
(RSA暗号を実装してみる(理論編) - 技術メモ
,RSA暗号を実装してみる(プログラム編) - 技術メモ)

暗号とは

そもそも暗号とは何か。
一言で言えば、第三者から通信内容を知られないように通信すること。
その上で満たすべき2つの条件がある。

1.「ある規則」を使って平文を暗号文に(暗号化)、暗号文を平文に(復号化)できる。
2.暗号文から「ある規則」を類推することが難しい。

※最近話題になったWEPkeyの突破は2.の条件が満たされていなかったことが原因っぽい。暗号文がたくさんあれば「ある規則」が類推できるようになってしまう。

RSA暗号の周辺知識

RSA暗号とは公開鍵暗号の一種。現在でも幅広く使われている暗号方式。

公開鍵暗号と対をなすのが共通鍵暗号といって、これは単純な暗号方式。
暗号化にも復号化にも同じ鍵を使うというもの。
だから、送信側と受信側のどちらも同じ鍵を持ち、それを秘密にする。

一方で公開鍵暗号は、公開する鍵と秘密にする鍵のペアがあり、それぞれ別々に暗号と復号の役割を担っている。
暗号化のための鍵は公開しているため、誰でも暗号化ができる。
逆に復号化の鍵は秘密にしているので、鍵を持つ者しか復号化できない。
この特徴によって、受信側が誰からも安全にデータを受け取ることを可能にしている。

公開鍵暗号の特徴として、暗号鍵から復号鍵を推測することが事実上不可能ということがある。
これが共通鍵暗号公開鍵暗号の違うところで、暗号はできるが復号ができないという点が公開鍵方式を実現している。

f:id:swdrsker:20161222030558p:plain

どうしてこんな面倒くさいことが必要なのか?

共通鍵方式だと
1.そもそも鍵の受け渡しの途中で傍受されてしまうとダメ
2.多人数間で通信する場合でも2者間の共通鍵が必要
という弱点があるためだ。

安全に双方向通信ができるハイブリッド方式

そこで、公開鍵暗号共通鍵暗号を組み合わせたハイブリッド方式というものがある。
ハイブリッド方式はこのような方法で双方向通信を可能にする。

1.クライアントがSSLでのアクセスをサーバ要求します。
2.サーバは、サーバの公開鍵を含む証明書をクライアントに送ります。
3.クライアントは、証明機関の公開鍵を使って、証明書を復号、検証を行い、サーバ側の公開鍵を手に入れます。
4.クライアントは、一時的な共通鍵を生成し、サーバの公開鍵で暗号化して、サーバに送ります。
5.サーバは、クライアントから暗号化された共通鍵を受け取り、自分の秘密鍵で復号し、共通鍵を手に入れます。
6.同じ共通鍵で、クライアントとサーバは通信を始めます。

引用:@IT:連載 XML Webサービスのセキュリティ実装 第3回 SSLを利用した暗号化(サーバ編)

公開鍵方式のみで、最初に公開鍵Aを使って新しく作成した公開鍵Bと秘密鍵Bを受け渡すという方法も考えられるが、このハイブリッド方式を使うのは計算時間の問題もある。公開鍵方式の場合、共通鍵方式に比べ格段に暗号化復号化に時間がかかるのだ。
そのため、大規模なデータをやり取りする必要がある場合にもハイブリッド方式を使うことがある。


参考サイト:
ハイブリッド暗号方式 : 情報セキュリティスペシャリスト(情報処理安全確保支援士) - SE娘の剣 -
cryptography - How does WEP wireless security work? - Information Security Stack Exchange
@IT:連載 XML Webサービスのセキュリティ実装 第3回 SSLを利用した暗号化(サーバ編)