🔐

「暗号化技術入門」を読んだ個人的まとめ

2022/08/12に公開

概要

「暗号技術入門 第3版」という書籍を読んで、脳に定着させておきたい部分をまとめておきます。
https://www.sbcr.jp/product/4797382228/

内容まとめ

第1部 暗号

昔の暗号

現在では使われないものたちだが、歴史を知るのも大事ということで。

シーザー暗号

平文をそれぞれ何文字かずらす。 takoyaki を3文字ずつ後ろにずらして wdnrbdnl みたいに。
アルファベットの場合26パターンしかないのでブルートフォースアタック(総当たり攻撃)で瞬殺される。

単一換字暗号

単純にずらすのではなく、 awbh のようにランダムに置き換え先を割り当てる。
総当たり攻撃の心配はないが、よく使われる文字(eとかtとか)などを元にパズル的に解かれやすい。

エニグマ

エニグマというなんか機械を使って暗号化する。第二次世界大戦中にドイツ軍で使われた。
国防軍鍵表というものに書かれた日替わり鍵で通信鍵を暗号化するが、通信鍵は人が決めるためそこが弱点となったりした。

これをきっかけにAmazon Primeのウォッチリストに入り続けていた映画「イミテーション・ゲーム/エニグマと天才数学者の秘密」を観たところ、理解が深まるというほどではないがイメージはしやすくなった。

共通鍵暗号

暗号鍵と復号鍵が同じことから対称暗号とも呼ぶ。
暗号化と復号化の鍵が同じため取られたら即終わるという鍵配送問題などはあるが、公開鍵暗号よりも処理速度が遥かに早いため目的によっては使うことがある。

以下、暗号化アルゴリズム

DES

Data Encryption Standardの略。1977年に採用。
コンピューターの進歩によりブルートフォースアタックで破られるようになった。

トリプルDES

DESを3重でかけるようにしたもの。
現在も銀行などで使われるが処理速度は遅く、あえて使う理由はない。

AES

Advanced Encryption Standardの略。複数のアルゴリズム候補から2000年に選定。
現在使うならこれ。

公開鍵暗号

暗号化の鍵(=公開鍵)と復号化の鍵(=秘密鍵)を分ける。非対称暗号とも呼ぶ。
以下の流れでやり取りをする。

公開鍵暗号では処理速度の遅さがネックとなる場合がある。

RSA

Rivest、Shamir、Adlemanという3人の名前(覚えんでいい)の頭文字から取られた。
1978年に発表され、現在も公開鍵暗号アルゴリズムのデファクトスタンダード。
(若干古い本なのでそうなっていたが、今だとEd25519を使った方がより強いはず。)

平文を表す数 の E乗 の mod N(Nで割った時の余り) が暗号文になるというロジック。
複合化は D乗 の mod N。
EとNが公開鍵にあたり、DとNが秘密鍵にあたる。

RSAへの攻撃としては以下がある。

  • ブルートフォースアタック
    • Dにあたる数を総当たりで試す。Nは公開鍵と同一のためすでにわかっている。
    • いわゆる鍵長を 2048 以上にしておくと総当たりが現実的でない数になり安心。
      2030年までは 2048 で大丈夫で、コンピューターの発達により2031年〜は 4096 を使うべき。(と書いているがもはや近い将来使えなくなるので今の時点で 4096 にした方がいいと思う。)
  • Man in the middle攻撃
    • 名前がかっこいい。
    • 鍵の送信者と受信者の間に敵に入られてしまった状態。
      1. 受信者→送信者に渡される公開鍵が偽装される
      2. 暗号化されたデータを取られる
      3. 敵は(暗号化に使ってしまった偽装公開鍵とペアの)秘密鍵を持っているので複合化できる
    • これに勝つには証明書が必要になってくる。

ハイブリッド暗号

  • 共通鍵暗号は鍵配送問題がある
  • 公開鍵暗号は処理速度が遅い

という双方のデメリットを解消するために用いられる。

メッセージは共通鍵暗号で暗号化し、その鍵を公開鍵暗号で暗号化する。
共通鍵はメッセージより短いことが多いので、鍵を安全に受け渡ししつつ処理速度を高めることができる。

第2部 認証

一方向ハッシュ

ファイルの正真性(改変がされていないか(=完全性))を調べるために用いる。
一方向ハッシュ関数によってハッシュ値(メッセージダイジェスト)が計算され、これらは一方向性(不可逆性)を持つ。

改竄は検出できるがなりすましは検出できないので、認証が必要になる。

以下、一方向ハッシュ関数

MD4, MD5

すでに強衝突耐性(ハッシュ値が一致する別のメッセージを見つけ出すことが困難なこと)が破られているので使うべきではない。

SHA-1

160ビットのハッシュ値を持つ。
強衝突耐性が破られているので使うべきでない。

SHA-2

SHA-256、SHA-384、SHA-512などの総称。256ビットor512ビット。
まだ破られていない。

SHA-3

SHA-1が破られたことを受けて2012年に作られた。Keccakというアルゴリズムが採用されているらしい。
まだ破られていない。

RIPEMD-160

ビットコインで使われるらしい。
改訂元のRIPEMDは破られているが、こちらはまだ大丈夫。

メッセージ認証コード(MAC)

メッセージ&共有鍵の入力を元に出力(MAC値)を計算する。
受信者は共有鍵を持っている場合にMAC値が計算でき、送信者から受け取ったMAC値と一致した場合に認証成功となる。

対象暗号と同様の鍵配送問題が発生するのと、以下を行うこともできない。

  • 第三者に対する証明
    → MAC値を計算したのが自分ではなく相手であることの証明
  • 否認防止
    → 送信者にメッセージを送っていないと言われること(受信者が自作自演したことにされること)の防止

これらを解決するためにデジタル署名が行われる。

HMAC

一方向ハッシュ関数を用いてメッセージ認証コードを構成する手法。
HMAC-SHA1、HMAC-SHA256など。

デジタル署名

メッセージの署名に秘密鍵を使い、メッセージの署名の検証に公開鍵を使う。
公開鍵を持つ人なら誰でも署名の検証を行うことができる。

公開鍵暗号と鍵を逆に使っているようなイメージ。

秘密鍵 公開鍵
公開鍵暗号 受信者が復号に使う 送信者が暗号化に使う
デジタル署名 署名者が署名の作成に使う 検証者が署名の検証に使う

デジタル署名の検証には正しい公開鍵が必要になり、それを担保するために証明書が用いられる。

証明書(公開鍵証明書)

認証局(CA)によるデジタル署名が行われた公開鍵。
認証局の証明書を別の認証局が作るという階層構造になっており、最上位をルートCAと呼ぶ。
ルートCAは自身の公開鍵をセルフ署名している。

以下、用語

X.509

証明書の標準規格。

公開鍵基盤(PKI)

公開鍵を運用するために定められた規格や仕様の総称。
利用者、認証局、リポジトリからなる。

CRL

証明書破棄リスト(Certificate Revocation List)。
検証者は認証局の最新のCRLを見て証明書が有効化を確認する。

第3部 鍵・乱数・応用技術

鍵と乱数

鍵の生成には乱数が用いられる。
乱数は「無作為性」「予測不可能性」「再現不可能性」を持つべきである。

PGP(Pretty Good Privacy)

Windows、Mac、Linuxなど多くのプラットフォームで動作する暗号ソフトウェア。

暗号文やデジタル署名の形式を定めたOpenPGPという規格があり、それに従って作られたフリーの暗号化ソフトウェアGnuPG(GPG / GNU Privacy Guard)がある。

詳細はまた別途調べてみたい。
https://gnupg.org/

SSL/TLS

通信暗号化プロトコル。SSL(Secure Socket Layer)の後継がTLS(Transport Layer Security)。
HTTPやSMTPなどをSSL/TLSの上に乗せて通信を暗号化する。

SSL/TLSは暗号通信のフレームワークを提供する形で、その中の暗号アルゴリズムやハッシュ関数などの組み合わせを暗号スイートと呼ぶ。

TLSプロトコルはTLSレコードプロトコルとTLSハンドシェイクプロトコルからなる。
ハンドシェイクプロトコルでのやりとりはざっくり以下のようになる。

これについては以下の資料をちゃんと読もうとして放置してたのを思い出し、こちらも参考になりそう。
https://www.digicert.co.jp/welcome/pdf/wp_ssl_negotiation.pdf

所感

暗号技術の初心者にも読みやすい書き方になっており、部分部分知っていた単語や概念がある程度体系的に整理できました。
一方で暗号アルゴリズムの細かい仕組みについては読み飛ばしてしまった部分もあったので、活力がある時に読み直すことでより理解を深められそうです。

とりあえず日常レベルで実践できるのは以下のあたりでしょうか。

  • (あるのか不明だが)共通鍵を作る時はAESを利用する。
  • 公開鍵暗号のキーペアを作る時は鍵長の大きいRSAかEd25519を利用する。
  • ハッシュ関数はSHA-2(SHA-256など)かSHA-3を利用する。
  • GPGについてはもう少し調べたり触ってみようと思った。

Discussion