どうして公開鍵で鍵をすることができて  
公開鍵で鍵を開けられないのですか？

公開鍵で鍵を出来るのなら  
誰でもなりすますことが可能ですよね  
それって暗号として意味がありますか？
CC BY-SA 3.0
2015-05-27T06:46:05.890
10664
2015-11-11T08:33:38.910
2015-05-27T06:58:41.773
3639
9521
question
アルゴリズム security
公開鍵暗号方式に疑問があります
共通鍵暗号方式の話をしていました。失礼しました。

公開鍵暗号方式では、公開鍵で鍵をかけ、秘密鍵で鍵を開けられます。  
公開鍵で鍵を開けられたら、文字通り公開されている鍵なので、だれでも鍵を開けられてしまうため、暗号化の意味がありません。

わかりやすい例をだすと、南京錠と鍵のペアがあり、  
誰でも南京錠をもらって鍵をかけることはできますが、鍵は南京錠を配った本人しかもっていません。  
そのため、だれでも鍵を掛けられても、空けることができるのは鍵を配布した本人だけになります。

だれでも公開鍵は入手できるので、だれでも鍵を掛けられますが、それだけでは改ざんよね？鍵を開けて改ざんして、また鍵をかける必要があります。  
第三者は鍵を開けることができないので、改ざんすることできません。

また、「なりすます」とおっしゃっているのはサーバーログインに公開鍵を登録するといったケースのことでしょうか？

ログインする側 - A  
ログインされるサーバー側 - B

としたとき、  
①Aは、Bに対し、乱数をBの公開鍵で暗号化したデータを送ります。  
②Bは、Aから送られていたデータを複合、中身を確認し、Aが送ってきた乱数と、自分で生成した乱数を、Aの公開鍵で暗号化し送り返します。  
③Aは、Bから送られてきたデータを複合し、自分が送った乱数が正しいか確認します。正しければ、Bが生成した乱数を、Bの公開鍵で暗号化し、送り返します。  
④Bは、Aから送られてきたデータを確認すれば、

Aは”BがBの秘密鍵をもっていること”  
Bは”AがAの秘密鍵をもっていること”  
が確認できます。
CC BY-SA 3.0
2015-05-27T07:01:20.187
10667
2015-05-27T07:15:32.007
2015-05-27T07:15:32.007
8396
8396
10664
answer
公開鍵の他に受信側(サーバー)が秘密鍵を保持しています。  
サーバー側は、公開鍵+秘密鍵を使用して復号を行うので、秘密鍵が漏れない限り、暗号として成り立ちます。
CC BY-SA 3.0
2015-05-27T07:09:52.177
10669
2015-05-27T07:09:52.177
2207
10664
answer
2015/05/27 追記

以下の電子署名に関する記載は､公開鍵暗号の種類であるRSA暗号に限った話になります。  
公開鍵暗号全般に適用できませんのでご注意ください。

追記ここまで

公開鍵暗号は、公開している公開鍵と自分だけが持っている秘密鍵の2種類の鍵を使い暗号化と復号を行います｡

そして、公開鍵の特徴として､公開鍵を使って暗号化したデータはその一方向性から公開鍵を使って復号することができず、自分だけが持っている秘密鍵を使わなければ復号できません。

ただ、公開鍵暗号の本質は公開されている鍵を使い特定の相手への送信を暗号化することなので､本来的になりすましを防ぐことは考慮されていませんし、又その能力もありません。

逆になりすましを防ぐのは電子署名という技術になり、コレは先の秘密鍵で鍵をかけたデータは公開鍵で開くことができますから、秘密鍵がばれていなければ間違いなく秘密鍵を唯一持っている本人から送信されたものであると証明できます｡

従って､Hogeさんから、Piyoさんへなりすましを防ぎなおかつ暗号化して送信する場合は､

  1. 送るべき平文をHogeさんの秘密鍵を使って暗号化（電子署名）
  2. 先の暗号化された暗号文をさらにPiyoさんの公開鍵を使って暗号化  
となり、受信したPiyoさんは

  3. Piyoさんの秘密鍵を使って復号
  4. Hogeさんの公開鍵を使って復号

と言う手順を踏むことで、暗号化と電子署名を行うことができます｡
CC BY-SA 3.0
2015-05-27T07:23:31.297
10672
2015-11-11T08:33:38.910
2015-11-11T08:33:38.910
5793
7287
10664
answer
鍵Aで暗号化を行い、鍵Bで復号を行うことができる、鍵Aを入手しても復号できない、ということが実現できるアルゴリズムを公開鍵暗号といいます。したがって、

> どうして公開鍵で鍵をすることができて 公開鍵で鍵を開けられないのですか？

に対しての回答は、「公開鍵暗号とはそういうものだから」と言うことになります。

> 公開鍵で鍵を出来るのなら誰でもなりすますことが可能ですよね それって暗号として意味がありますか？

共通鍵暗号方式では、AさんとBさんが共通の鍵を持っていることから、Aさんが暗号化したものをBさんが復号して「正しく」復号できれば元の暗号文はAさんが暗号化したものだと言える、という考えから来る質問だと思います。

この前提が間違っていて、通常の暗号アルゴリズムでは「正しく」復号できたかどうか(使用した鍵が正しかったかどうか)を一般的に判断することはできません。暗号化の鍵と復号に使う鍵が違っても、パスワード付ZIPファイルのように「パスワードが違います」というエラーになるわけではなく、鍵の値により復号が行われます。

元のデータが特定のフォーマットであること(例えばテキストファイル)である、平文の値を受信側があらかじめ知っているなどの条件があれば、復号結果により「正しく」復号できたことを判定できる場合もありますが、これは暗号アルゴリズムの応用の話であって、暗号アルゴリズムそのもの機能ではありません。

「誰でも暗号化できる」ことでメッセージの検証には使いにくいのは事実ですが、それが暗号として意味がないということはありません。

なお、現在ではメッセージの正当性の検証(発信者が正しいか、改竄されていないか)は電子署名で行われます。

暗号技術についての入門書として「暗号技術入門 秘密の国のアリス」(ISBN 4797350997)をお勧めしておきます。
CC BY-SA 3.0
2015-05-29T00:34:52.940
10739
2015-05-29T00:34:52.940
5793
10664
answer
> 公開鍵で鍵を出来るのなら  
>  誰でもなりすますことが可能ですよね

この部分ですが...多分、『暗号化で誰に盗み見られるのを防ぐ事ができるのか？』と『通信相手の保証』という部分がごっちゃまぜになってるだけかと思います。  
『なりすます』と言われているのが、何をもって『なりすまし』と判断するところがポイントですよね。

公開鍵暗号方式は、不特定多数の人と安全な通信環境を作るための技術ですから、通信相手が誰でも良いんですよ。  
秘密鍵を持ってる人は、公開鍵を配布することで、不特定多数の人達が秘密鍵を持ってる人へ情報を送る時に安全に送る事ができる。秘密鍵だけを、誰にも分からないように隠し持っておけば、公開鍵で暗号化された情報は、秘密鍵を持ってる人にしか解読できないんです。  
これが大前提。

例えばサーバにloginするときに、AさんのID、passwordでログインしました。IDとpasswordは公開鍵暗号方式で安全に送られています。  
しかし、AさんのID, passwordが流出して、BさんがAさんのID,
passwordでサーバにログインしてしまいました。いわゆる、BさんがAさんになりすました状態です。  
Aさんであろうが、Bさんであろうが、通信経路は公開鍵暗号方式で安全に通信できています。  
この時点で、公開鍵暗号方式での暗号化は意味あるものです。役に立ってるんです。  
じゃ、これで誰が盗み見ようとしてるのを防ぐことができているのか？  
それは、通信経路上に多数存在するサーバー達です。  
Windowsならコマンドプロンプトで`tracert -d
【接続先URL】`ってやってみてください。自分のPCからその接続先までに何台の機器を経由してるかが分かります。この間にいるヤツらに盗み見られるのを防げるんです。

もっと具体的に言うと...  
インターネットは、多数のサーバなどが蜘蛛の巣のように張り巡らされて構成されています。  
サーバAからサーバCへ通信する時、間にサーバBを介して通信していました。  
サーバAからサーバCへ送信された情報は、サーバBを通過していくわけです。このサーバBの運用者が悪意を持ってたらどうしましょう？当然、盗み見られてしまいます。  
じゃ、サーバAから安全にサーバCへ情報を送るにはどうすれば良いか？

サーバAは、サーバCが公開している公開鍵を取ってきます。  
公開鍵で暗号化した情報をサーバCへ送ります。途中にサーバBがあるけど、サーバBに届いた情報は、暗号化されてるので読めません。  
暗号化された情報は、サーバCへ届きます。サーバCは公開鍵とペアの秘密鍵を持ってるので復号化できます。  
これで、安全にサーバCへ情報が渡されました。
CC BY-SA 3.0
2015-05-29T02:13:26.780
10742
2015-05-29T02:13:26.780
2383
10664
answer