• 締切済み

ハイブリッド暗号方式

こんにちは。暗号化方式を勉強しているのですが、ハイブリッド暗号方式がどのようにう動くかよく理解できません。参考にしてある本には「最初に公開鍵暗号方式を利用して共通鍵を受け渡します。その後に伝送データの暗号化は処理速度の早い共通鍵暗号方式を利用します。」と書いてあります。 公開暗号方式なら公開鍵を渡すんじゃないんですか? でもそれからあとの通信やりとりも想像できません。

みんなの回答

回答No.3

>公開暗号方式なら公開鍵を渡すんじゃないんですか? 公開鍵は公開されているので、何らかの方法で事前に入手していることが前提です。 httpsプロトコルであれば、接続要求時にサーバー証明書と一緒に入手できます。 なお、秘密鍵で暗号化した内容は対応する共通鍵で復号できます。ただし、この場合公開鍵は複数が所有している可能性があるため、内容の秘匿性は担保されません。ここで担保されるのは送信者のなりすましがないことです。 また、https通信の際に公開鍵はサーバーから送信されるので、認証局から公開鍵を入手することもありません。クライアントはサーバー証明書の発行元の証明書を順にたどっていき、ルート認証局にたどり着くかどうかを検証します。ルート認証局の証明書はブラウザが最初から持っています。認証局に問い合わせるのは、証明書が無効になっていないかの情報です。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 例えば、暗号の強度だけを問うのでしたら、最初から最後まで、キー長の長い公開キー暗号方式を使った方が良いです・・・というのは、わかりきっています。でも、計算式が複雑で処理量が多いため、処理をするのには、時間がかかります。極端な話、https:で始まるページを表示するのに1分も2分もかかったら、誰も使わなくなりますよね。  そこで、速度と強度を両立したい・・・となります。  ところで、一方、共通キー式の暗号は、大抵計算式が簡単です(つまり、とても早く暗号化・復号化ができます)。でも、暗号強度が残念ながら弱いとされています。しかし、どんなに弱いとされる暗号でも、例えば、キー長が無限の長さがあれば・・・送りたい文書と同じ長さの暗号キーが有り、一回限りしか使わないというのが可能であれば、実は、理論的に解読不能な暗号となります。  暗号キーを、安全な方法で、しょっちゅう伝達し合うことが出来るなら、共通キー式の暗号は、意外と強く、しかも計算量は少ない(つまり、暗号化も復号かも早く出来る)と言うことです。  そこで、次のようなストーリーを考えます。  あなたは、あらかじめ決められた方式の共通キー式の暗号方法で相手と通信します。  まず最初に、今から1分間の伝送に対して使用する暗号キーAを決めます。  あなたは、この暗号キーAを、安全な形で相手に送付しなければなりません。  そのために、この暗号キーAを相手に伝えるために、公開キー暗号方式を使用することにします。あなたは、相手から、あらかじめもらってある公開キーでこの暗号キーAを暗号化して相手に送ります。  相手は、それに対応する秘密キーを使用して、暗号キーAを取り出します。  これで、1分間だけ有効と決めた共通キー式の暗号キーAが両者の手元にそろい、共通キー暗号を送り合う準備が出来ました。  1分間、このキーで共通キー式の簡単な暗号でやりとりします。  あまり長くやりとりすると、暗号キーAが解析されてしまいますから、1分経ったら、また、あなたは、次の一分間に使用する暗号キーBを相手に、さっきと同じ方法で送ります。  しょっちゅうキーが変わるので、いくら単純な共通キー式の暗号といえども、途中で盗み見して解読するのは、困難極まります。暗号キーAは、強度の強い公開キー暗号で暗号化されているので、こっちを解読するのは、もっと無理です。  こうして、無事、安全に早く、文書が交換できるようになりました・・・  というのが、ハイブリッド暗号方式の基本的原理です。  物語は、かなり単純化していますが、1分という時間の長さ(または、同じキーで送る文書の長さ)と、キー長を適切に決めてあげれば、実用上問題の無い強度で計算量の少ない(速度の速い)暗号方式となります。

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.1

公開鍵暗号は公開鍵と秘密鍵の2つの鍵を使って暗号化と復号化を行う暗号方式で、公開鍵を使って暗号化したデータは秘密鍵でしか復号化できず、秘密鍵で暗号化しても公開鍵では復号化できないですし、公開鍵で暗号化したデータを公開鍵で復号化することもできない一方向の暗号化方式です。 なので、AがBの公開鍵を使って暗号化したデータをBが自身の秘密鍵で復号化する事はできますが、Bが自身の秘密鍵で暗号化したデータをAが受け取ってもBの公開鍵で復号化できませんし、Bの公開鍵で暗号化したデータをBの公開鍵で復号化することもできません。 また、公開鍵暗号は暗号化復号化にCPUパワーを必要とする処理のため、処理時間が掛かってしまいます。 なので処理が軽量な共通鍵暗号を使って暗号化通信をしたいけど、共通鍵暗号は共通鍵を予め双方で所有している必要があり、安全に共通鍵の受け渡しをする手段が必要になるので、公開鍵暗号を使って共通鍵を安全に受け渡すという手段がとられます。 HTTPS通信を例にすると、まず最初にブラウザからサイトへセッションを確立するとサイト側の公開鍵証明書を受け取ります。 その公開鍵証明書を使ってブラウザは証明機関に登録されている公開鍵を受け取ります。 ブラウザは共通鍵暗号用の共通鍵を生成し、サイトの公開鍵を使って共通鍵を暗号化してサーバに送り、サイトは秘密鍵を使って共通鍵を取り出します。 ブラウザは共通鍵を使ってサイトへのリクエスト内容を暗号化して送り、サイトは共通鍵を使って応答内容を暗号化してブラウザへ返します。 これで、動作が軽量で双方向で利用可能な共通鍵暗号を使って通信することが可能で、共通鍵暗号の共通鍵を第三者に知られること無くブラウザとサイト間で交換する事ができます。

関連するQ&A