質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.35%

  • ネットワーク

    381questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

  • セキュリティー

    364questions

    このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

  • 暗号化

    60questions

    ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

複合されにくい暗号化の方法を教えてください

解決済

回答 5

投稿 2017/11/24 13:07 ・編集 2017/11/24 15:10

  • 評価
  • クリップ 3
  • VIEW 399

DDxlk

score 102

暗号化を施す際、keyをハードコードすると簡単に複合されてしまいますよね?
では、簡単に複合されないように暗号化するにはどうしたらいいんですか?

(これはあまり良くない例ですが、世界中で被害を出したランサムウェアの中には、簡単には複合出来ないように暗号化するものもありますよね?)

また、オンザフライ暗号化というのが何かも教えていただきたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keieicho

    2017/11/24 14:12

    「セキュリティ」タグもつけておいた方がよろしいかと。

    キャンセル

  • DDxlk

    2017/11/24 15:09

    そうですね!ありがとうございます

    キャンセル

回答 5

+4

こんにちは。

では、簡単に複合されないように暗号化するにはどうしたらいいんですか?

毎回暗号化キーを変え、かつ、復号に必要なキー(対称鍵暗号なら暗号化キー)を復号を許可する人に安全確実に届ける(手渡しが確実かも。ただし、暗号化データとは別に)ことです。

あまり現実的ではない話はさておき、暗号化したデータについては、復号出来る人と出来ない人をどうやって区別するのか?が問題です。復号化キーを持っている人は復号でき、持っていない人は復号できないのが一般的でしょう。
この復号化キーを固定(ハードコーディング)するとどこか1箇所で漏れると、全ての当該復号化キーを持つデータを復号できるので危険ということです。

毎回、復号化キーが異なるようにすれば安全っぽく見えますが、今度は毎回その復号化キーを復号したい人へ届ける必要があります。当然データとは別のルート、かつ、盗聴も成りすまし(他の人が受け取ってしまう)もできないルートを用意する必要がありますが、ここにも脆弱性が発生するリスクがありますし、手間もかかります。
復号化キー配布の手間と安全性を秤にかけて、バランスの良い暗号化システムを構築します。

ですので、全ての場合に適用できる安全なシステムはありません。

また、オンザフライ暗号化というのが何かも教えていただきたいです。

オンザフライ暗号化という言葉は初耳ですが、ググったらVeraCryptがでてきました。
これの前身のTrueCryptは知ってます。暗号化ドライブを作成し、そのドライブから読み出す操作で復号化、書き込む操作で暗号化されます。この暗号化/復号化操作を自動的にリアルタイムにやってくれることを「オンザフライ暗号化」と呼ぶ人が居るのだと思います。

投稿 2017/11/24 13:26

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 17:04

    回答ありがとうございます!
    そうですね。公開鍵暗号方式を上手く使うといいようですね。
    また、オンザフライ暗号化に関してもわかりました。ありがとうございました

    キャンセル

checkベストアンサー

+2

RSAなどの公開鍵暗号方式を使うのが良いと思います。
公開鍵暗号方式は、1組(公開鍵[PublicKey]と秘密鍵[SecretKey])の暗号鍵を使うもので、一方の鍵で暗号化したデータを復号できるのは、もう一方の鍵だけという性質を使います。

一例として、AさんとBさんの間でデータ交換する場合:
<前提>
・Aさんの公開鍵(Pa)と、Bさんの公開鍵(Pb)は、両者の間で共有されています。(他の人がPaやPbを知っていてもかまいません)
・Aさんの秘密鍵(Sa)と、Bさんの秘密鍵(Sb)は、それぞれ本人のみが知っています(他の人に知られてはいけません)

AさんからBさんにデータを送る場合の手順:
<Aさんがデータを送る>
1) データをBさんの公開鍵(Pb)で暗号化します。暗号化されたデータは、Bさんの秘密鍵(Sb)でしか復号できません。
2) 1で暗号化したデータをAさんの秘密鍵(Sa)で暗号化します。暗号化されたデータは、Aさんの公開鍵(Pa)で復号し、さらにBさんの秘密鍵(Sb)で複合しないと元のデータになりません。
3) AさんからBさんに2で暗号化したデータを送ります。

=
<Bさんが届いたデータからデータを取り出す>
4) BさんはAさんから届いた暗号化データをAさんの公開鍵(Pa)で復号します。復号でエラーが出たら、その暗号化データはAさんの秘密鍵(Sa)で暗号化されたものではないという事ですから、Aさんになりすました誰かが送り付けた怪しいデータだと判断できます。復号できたら送り主はAさんだと確認できます。
5) 複合したデータを、更にBさんの秘密鍵(Sb)で復号すれば元のデータが得られます。

このように公開鍵暗号方式は、秘密にすべき鍵は本人が持っていれば良くて、相手に知らせる鍵を送る必要がありません。そのため、セキュリティに問題があるネットワークであっても安全にデータのやりとりができます。(秘密鍵を保存しているPCのセキュリティに問題がある(秘密鍵が盗まれる恐れがある)場合は、暗号化をどんなに工夫してもダメですけど)

投稿 2017/11/24 14:01

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 16:57

    回答ありがとうございます!
    「公開鍵方式は、公開鍵で暗号化したモノを秘密鍵で複合出来る」というのは知っていましたが、秘密鍵で暗号化して公開鍵で複合する処理を噛ませることで本人確認が出来るというのを初めて知りました!
    「電子署名が出来る」みたいな事をどこかで読みましたが、よく分からないまま放置していたので助かりました。

    キャンセル

+1

現代暗号は、鍵を類推しにくくする(総当たり以外の方法では類推できず、かつ総当たりにかかる時間が天文学的時間になる)ことによって強度を担保しています。
ですから鍵をどこかに保管して、その鍵をどう守るか、が主眼です。

key をハードコードしてはいけないのは、この「鍵を守る」点において問題があるからです。

質問の趣旨とはちょっと違うかもしれませんが、公開鍵暗号を使えば、「暗号化するための鍵」は公開しても、復号するための鍵さえ守れていれば容易には復号できません。

投稿 2017/11/24 13:37

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 17:01

    回答ありがとうございます!
    公開鍵暗号を使えば色々工夫できることがわかりました

    キャンセル

+1

例示されているランサムウェアの仕組みについて回答します。
公開鍵暗号の仕組みを用いれば、ランサムウェアに復号キーを持たせずとも、以下のような流れで目的を果たせます。

まず攻撃者(ランサムウェアの作者)は

  • 公開鍵暗号での公開鍵秘密鍵を用意。
  • ランサムウェアには公開鍵だけを持たせる。

被害者マシン上でのランサムウェアは

  • まず適当な共通鍵Aを生成し、この共通鍵で被害者のデータを暗号化する。
  • 上記の共通鍵A攻撃者の公開鍵で暗号化したデータBを被害者に通知する。

被害者がデータを復号してほしい場合は

  • Bを攻撃者に送る。
  • 攻撃者はB攻撃者の秘密鍵で復号して得た共通鍵Aを被害者に渡す。
  • 被害者マシン上のランサムウェアはこの共通鍵Aで被害者のデータを復号する。

参考:ランサムウェアを作ってみた(シェルスクリプトで)

投稿 2017/11/24 13:41

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 17:00

    恐らく、公開鍵暗号方式に加えて共通鍵を利用しているのは、各自で複合させるため(暗号化された被害者のデータが大きすぎるためデータを送るのは現実的でない)からですよね。
    なるほど箇条書きでとてもわかりやすい解説ありがとうございました!

    キャンセル

0

いちばん確実なのは、鍵はデータとして保管せずに、復号の都度、人間が入力する方法です。キーロガーやソーシャリエンジニアリングのリスクはありますが、これで正しく実装すればデータだけ流出しても総当り以外の手段はありません。

(どういう状況で使うかがわからなくて、的はずれな回答となっているかもしれません)

投稿 2017/11/24 13:17

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/24 17:08

    回答ありがとうございます!
    今回はやり取りするデータを暗号化する際のベストプラクティスについて質問しました。
    もちろん極論どこかで会ってKeyを教え合って、その都度手打ちすれば漏えいの心配は皆無なのでしょうが、やはりプログラム内部で暗号化/複合するのが現実的ですよね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.35%

同じタグがついた質問を見る

  • ネットワーク

    381questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

  • セキュリティー

    364questions

    このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

  • 暗号化

    60questions

    ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

閲覧数の多いセキュリティーの質問