Upgrade to Pro — share decks privately, control downloads, hide ads and more …

暗号技術入門

Yuka Tsuboi
November 30, 2018
110

 暗号技術入門

20181130 adishエンジニア勉強会でお話ししたスライドです

Yuka Tsuboi

November 30, 2018
Tweet

Transcript

  1. 今日の内容 - 共通鍵暗号・公開鍵暗号・ハイブリッド暗号 - 一方向性ハッシュ関数 - メッセージ認証コード - デジタル署名 -

    SSL/TLS 今日の内容はざっくりこんな感じです 少し足早に進めるかも知れませんが、気にせずいつでも質問してください
  2. セキュリティ4大脅威 - 盗聴 - ボブ以外にメッセージが漏れる - 改ざん - メッセージが書き換えられる -

    なりすまし - アリスのふりをする - 否認 - アリスが後から「送っていない」と言う
  3. セキュリティ4大脅威に対する防衛 - 盗聴 → 暗号で守る!!! - ボブ以外にメッセージが漏れる - 改ざん →

    一方向性ハッシュ関数・メッセージ認証コード・デジタル署名で守る!!! - メッセージが書き換えられる - なりすまし → メッセージ認証コード・デジタル署名で守る!!! - アリスのふりをする - 否認 → デジタル署名で守る!!! - アリスが後から「送っていない」と言う
  4. 暗号 鍵を持つ人以外からメッセージを秘匿する技術 メッセージ(平文)の代わりに、メッセージを暗号化したもの(暗号文)を送る 盗聴されても暗号文からはもとの平文に戻せない 暗号文 平文 暗号文 平文 暗号文 アリス

    (送信者) ボブ (受信者) 暗号化 復号 暗号文を盗聴しても もとの平文が分からない 暗号化鍵 復号鍵 暗号鍵を持っている アリスは 平文を暗号化する 復号鍵を持っている ボブだけが もとの平文に戻せる
  5. 共通鍵暗号のメリットとデメリット メリット: 暗号化と復号の処理が高速 デメリット: 事前に安全な経路で鍵を共有するのが難しい(鍵配送問題) 管理する鍵の数が多い 暗号文 平文 暗号文 平文

    暗号文 アリス (送信者) ボブ (受信者) 暗号化 復号 共通鍵 共通鍵 盗聴されたら鍵が盗まれてしまう N人いるグループで 通信しあうには N-1個の鍵を管理 処理が高速 事前に鍵を生成・共有 N人いるグループで 通信しあうには N-1個の鍵を管理
  6. 公開鍵暗号 暗号化鍵と復号鍵に違う鍵を使用する方式 2つの鍵はペアになっていて、片方で暗号化したものは片方で復号できる 復号に使う鍵を秘密に管理して(秘密鍵)、暗号化に使う鍵は公開する(公開鍵) 暗号文 平文 暗号文 平文 暗号文 アリス

    (送信者) ボブ (受信者) 暗号化 復号 ボブの公開鍵 ボブの秘密鍵 誰もが使えるように 公開された ボブ専用の暗号化鍵 ボブが 厳重に保管する ボブ専用の復号鍵 アリスはボブの公開鍵を取得
  7. 公開鍵暗号のメリットとデメリット メリット: 鍵は公開できるので鍵配送問題が解決されている 1ペアの鍵で複数の相手からの受信が可能 デメリット: 暗号化と復号の処理に時間がかかる 暗号文 平文 暗号文 平文

    暗号文 アリス (送信者) ボブ (受信者) 暗号化 復号 ボブの公開鍵 ボブの秘密鍵 アリスはボブの公開鍵を取得 鍵配送問題クリア N-1個の鍵を保管 でも厳重管理する 必要はない 処理に時間がかかる 自分の秘密鍵だけ 厳重管理
  8. ハイブリッド暗号 共通鍵暗号と公開鍵暗号のいいとこどりをした方式 暗号化と復号は処理の高速な共通鍵暗号で行う 共通鍵暗号の鍵を公開鍵暗号で暗号化して共有する 暗号文 平文 暗号文 平文 暗号文 アリス

    ボブ 暗号化 復号 暗号化 共通鍵 共通鍵 ボブの公開鍵 暗号化した共通鍵 暗号化した共通鍵 復号 ボブの秘密鍵 暗号化した共通鍵 ※多くの場合、ハイブリッド暗号で使う共通鍵は  使い捨てなのでセッション鍵とも呼ばれる
  9. 暗号まとめ 共通鍵暗号 公開鍵暗号 ハイブリッド暗号 特徴 - 処理が高速 - 鍵の配送問題あり -

    管理する鍵が多い - 処理が低速 - 鍵の配送問題なし - 管理する鍵は少ない - 処理が高速 - 鍵の配送問題なし - 管理する鍵は少ない 代表例 AES, DES RSA, ECC PGP, S/MIME, SSL/TLS
  10. 小話: どの暗号アルゴリズムを採用すべきか 考案された当時には十分な安全性を持っていた暗号アルゴリズムも 新しい攻撃手法の発見やコンピュータの性能向上によって、安全性が低下する(=危殆化) そのため、公的機関では暗号技術の標準規格を作成している - NIST FIPS 140-2 "Security

    Requirements for Cryptographic Modules" - 2001年に公開。暗号モジュールのセキュリティ要件を規定したもの - CRYPTREC 暗号リスト - 2013年に公開。日本国内における電子政府で推奨される暗号技術リスト - NIST SP 800-131A Rev. 1 "Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths" - 2015年に公開。より長い鍵長とより強力な暗号アルゴリズムへの移行を目指した、暗号ア ルゴリズムの選定等に関する実践的なガイドライン
  11. 任意長のメッセージから固定長のハッシュ値を出力する 与えられた入力が同じなら出力も同じだが、1bitでも違えば出力も全く異なる ハッシュ値から元のメッセージを得ることが困難(一方向性) 代表例はMD5, SHA-1, SHA-2, SHA-3 こんにちは、今日はいい天気ですね 入力(メッセージ) 出力(ハッシュ値)

    こんにちは、今朝はいい天気ですね こんにちは、今日はいい天気ですね 天気 d2fa74e8e5712a8df65fad169b4655b8 d2fa74e8e5712a8df65fad169b4655b8 1b7dd2d7519ead2d27c13137fb9b2615 e082c9d81567377667df4568a3c73b72 一方向性 ハッシュ関数 一方向性ハッシュ関数
  12. 認証局同士の信頼関係のモデルを 信頼モデルという 最も代表的なものは階層モデル 上位のCAが下位のCAの証明書を発行し、 信頼のチェーンを構成する 最も上位のCAはルートCAといい、 トラストアンカーともいう ルートCAの証明書は自身で発行する (自己署名) 署名検証の際は、ルートCAに向かって

    信頼のチェーンを順に検証していく PKIの信頼モデル ルート CA 中間 CA1 中間 CA2 中間 CA3 利用者 利用者 利用者 利用者 ルート証明書 ルートCAの公開鍵 ルートCAの署名 中間CA1の 証明書 中間CA1の 公開鍵 ルートCAの署名 中間CA3の 証明書 中間CA3の 公開鍵 中間CA1の署名 信頼の起点 トラストアンカー 中間CA2の 証明書 中間CA2の 公開鍵 ルートCAの署名
  13. 世界で最も多く使われている暗号通信プロトコル 他のアプリケーション層プロトコル(HTTP, SMTP等)と組み合わせることができる SSL/TLS アプリケーション層 アリス (送信者) SSL/TLS HTTP トランスポート層

    インターネット層 リンク層 アプリケーション層 ボブ (受信者) HTTP SSL/TLS トランスポート層 インターネット層 リンク層 暗号化 復号 通信路
  14. - データの盗聴防止: 共通鍵暗号を使った暗号化 - 鍵交換: 公開鍵暗号を使った暗号化 (またはDiffie Hellman鍵交換) - なりすまし防止:

    PKIとデジタル署名を使ったサーバの認証 - 否認防止: PKIとデジタル署名を使ったクライアントの認証 - データの改ざん検知: データのハッシュ値に対するメッセージ認証コード SSL/TLSで使われている暗号技術
  15. TLSレコードプロトコルとTLSハンドシェイクプロトコルという 2つのプロトコルで構成される SSL/TLSで使われている暗号技術 SSL/TLS TLSハンドシェイクプロトコル 暗号スイートの合意と通信相手の認証、鍵交換の取り決め TLSレコードプロトコル データの暗号化と認証, 改ざん検知の取り決め ハンドシェイク

    プロトコル 暗号仕様変更 プロトコル アラートプロトコル アプリケーションデータ プロトコル - 使用する暗号スイートの合意 - PKIとデジタル署名を使った認証 - 共通鍵の生成 - 公開鍵暗号またはDiffie-Hellman 鍵交換を使った鍵交換 - 共通鍵暗号を使った暗号化と復号 - メッセージ認証コードを使ったパケット毎 の認証と改ざん検知
  16. TLSハンドシェイクプロトコル クライアント サーバ 認証局 Server:「私の証明書を作ってください、公開鍵はこれです」 サーバの証明書を 生成・署名 https://… でサーバにアクセス CA:「あなたの証明書はこれです」

    Client:「私が使える暗号スイートのリストはこれです」 Server:「ではこの暗号スイートで通信しましょう」 Server:「私のサーバ証明書はこれです」 サーバの共通鍵と公開鍵を生成 証明書を設置 Client:「認証局の公開鍵をください」 CA:「はい、認証局の公開鍵はこれです」 認証局の公開鍵で サーバ証明書の署名検証 サーバ証明書の公開鍵で 共通鍵を暗号化 Client:「これが暗号化した共通鍵です」 暗号化された共通鍵を サーバの秘密鍵を使い復号 Server:「OK, それでは暗号通信をはじめましょう」 ハンドシェイクが終わったら TLSレコードプロトコルによる通信が 行えるようになる!
  17. TLSレコードプロトコル クライアント サーバ ハンドシェイクで やりとりした共通鍵 ハンドシェイクで やりとりした共通鍵 メッセージ 圧縮文 ハッシュ値

    一方向性ハッシュ関数 MAC値 メッセージ認証コード 圧縮 暗号文 暗号化 Server:「暗号化したデータはこれです」
  18. $ openssl cryper -v 小話: どの暗号スイートを利用するか ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA

    Enc=AES(256) Mac=SHA384 ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 … 暗号スイート名 プロトコル 鍵交換 アルゴリズム 認証 アルゴリズム 暗号アルゴリズム MACアルゴリズム
  19. DES (Data Encryption Standard) 1. 平文を64bitごとのブロックに分割する 64bitの平文 64bitの暗号文 左の32bit 右の32bit

    関数f サブ鍵1 XOR 暗号化された左の32bit 右の32bit 2. 左右で32bitずつに分割する 3. あらかじめ鍵から16個のサブ鍵を生成している。 1個目のサブ鍵と右32bitを関数fに入力し、 その出力と左32bitとの排他的論理和を取る 4. 左右を入れ替える 5. 2-4が1ラウンド。これを16ラウンド繰り返す
 (NラウンドごとにN個目のサブ鍵が使われる) 6. 最終的な左右を合わせた64bitが暗号文 部分を16ラウンド繰り返す 右の32bit 暗号化された左の32bit
  20. DES (Data Encryption Standard) 1. 暗号文を64bitごとのブロックに分割する 64bitの暗号文 64bitの平文 16ラウンド目で暗号化された左の32bit 右の32bit

    関数f サブ鍵16 XOR 左の32bit 右の32bit 2. 左右で32bitずつに分割すると、左は16ラウ ンドで暗号化された32bitのはずである 3. 同じ鍵からは16個の同じサブ鍵を生成できる。 16個目のサブ鍵と右32bitを関数fに入力し、 その出力と左32bitとの排他的論理和を取る。 すると、元の左の32bitが取れる!!!
 4. 右は15ラウンドで暗号化された32bitのはずな ので、左右を入れ替える 5. 2-4が1ラウンド。これを16ラウンド繰り返す
 (Nラウンドごとに16-N個目のサブ鍵が使われる) 6. 最終的な左右を合わせた64bitが平文 部分を16ラウンド繰り返す 15ラウンド目で暗号化された右の32bit 左の32bit
  21. AES (Advanced Encryption Standard) 16bytesの平文 Sub Bytes Sub Bytes Sub

    Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes Sub Bytes MixColumns MixColumns MixColumns MixColumns ラウンド鍵とのXOR 16bytesの暗号文 1. 暗号文を16bytesごとのブロックに分割する 2. SubBytes: 1bytesごとの値(0~255)をイン デックスとした換字表Sから得た値に変換する 3. ShiftRows: SubBytesの値を1bytesごとに 混ぜて、4bytesのまとまりにする 4. MixColumns: 4bytesのまとまりにビット演算 をかけて、別の4bytesに変換する 5. AddRoundKey: 鍵から生成したラウンド鍵と の排他的論理和を取る 部分を10~14ラウンド繰り返す 6. 2-5が1ラウンド。これを10-14回繰り返す 7. 最終的な16bytesが暗号文