intenの忘備録

忘備用

暗号技術入門

色々あって暗号技術に興味をもった僕はこんな本を読みました。

暗号技術入門

で、正直なところネットで探せる情報よりさらに奥深く知られたかというと微妙なラインでしたが、体系だって学べました。しかし、そのまんまにしとくと忘れるのは目に見えてるのでここで暗号技術について自分なりにまとめを書いたのでそのまま載せます。

 

  1. 隠すことによるセキュリティ(security of obscurity)
    1. どのような攻撃が可能なのか調べて尽くすことができない。暗号とは今まで誰にも敗れていないという事実がその機密性を担保する。
  2. 暗号鍵
    1. 対称暗号
      1. XOR
      2. 使い捨てパッド
        1. 最強の暗号。破れない。しかし、鍵が平文と同じ長さになってしまうという本末転倒。量子暗号に期待
      3. DES、トリプルDES
        1. 古い暗号技術。使ってはいけない。ただしDESで使われるファイステルネットワークは多くのブロック暗号で利用されている。
        2. ラウンドを繰り返して暗号化する。この構造もほかのブロック暗号と同じ
        3. 差分解読法
        4. 線形解読法
      4. AES(Rijndael)
        1. DESが破られたのでDESの後継として開発。アルゴリズムがまったく違う。
        2. SPN構造
        3. ラウンド
          1. SubBytes
          2. ShiftRows
          3. MixColumns
          4. AddRoudKey
    2. ブロック暗号
      1. ECB(Electronic CodeBook)
        1. 愚直に暗号化。平文と暗号文の位置関係が保存される。(改変の余地がり危険)
      2. CBC (Cipher Block Chaining)
      3. CFB (Cipher-FeedBack)
      4. OFB (Output-FeedBack)
      5. CTR (CounTeR)
      6. CRYTREC推奨
        1. CBC, CFB, CTR
      7. Practical Cyptography推奨
        1. CBC, CTR
      8. 詳細
        1. 2者間で共有鍵を共有して、それ以外には秘密。低いビット数でも安全性が高く、高速に暗号化ができる。
        2. 鍵配送問題がある。
          1. 鍵の事前共有
            1. 鍵の個数の組み合わせ爆発が起こる。(保存しておけない)
          2. 鍵配布センタによる鍵配送(KDC:key distribution center)
            1. 暗号通信のたびに鍵配布センタの発行した鍵を使って通信する。鍵配布センタとの間の通信の鍵は事前共有する。KDCは暗号通信をすべて盗聴、改竄ができてしまう。
          3. Diffie-Hellman鍵交換
            1. https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%95%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%98%E3%83%AB%E3%83%9E%E3%83%B3%E9%8D%B5%E5%85%B1%E6%9C%89
          4. ハイブリッド暗号
          5. 3,4が有望。使われてる
    3. 公開鍵暗号
      1. RSA
        1. 超有名。素因数分解の困難さに依存した暗号。ビット長が長くなりがち
      2. 楕円曲線暗号
        1. 注目頭。RSAに比べ得て少ないビット数でできるのが特徴。楕円曲線上での「乗算」を定義しこの逆残が難しいことに依存。
      3. ElGamal方式
        1. mod Nで離散対数を求めるのが困難なことを利用。暗号文が平文の2倍の長さになる欠点がある。GnuPGに実装されている
      4. Rablin方式
        1. mod Nで平方根を求めるのが困難なことを利用。RSA素因数分解以外の方法で解読される危険性があるが、Rabinは素因数分解を行うのと同じだけの困難さがあることが保証されている。
    4. 一方向ハッシュ関数
      1. MD4,5(Message Digest)
      2. SHA-1, SHA-2(SHA-256(32bit用), SHA512(64bit用)とか)
        1. SHA-1は破られているので危険。
        2. SHA-254やSHA-512/224などもあるが、これはSHA-256、512から削ってるだけ
      3. SHA-3(Keccak)
        1. スポンジ構造
          1. 任意の長さの入力を受け入れる。(SHA-1は2^64 -1、SHA-2は2^128 -1という大きさの制約があった)
        2. デュプレックス構造
          1. 組込み系でも早くハッシュ値を逐次計算できる
      4. 弱衝突耐性
        1. あるハッシュと同じハッシュ値をだす平文を発見させない耐性
        2. プルートフォース
      5. 強衝突耐性
        1. ハッシュ値が同じような二つの平文を見つけさせない耐性
        2. 誕生日攻撃
    5. PBE(password based encryption)
      1. saltソルトを使った辞書攻撃に対する対処
    6. 擬似乱数生成器
      1. 乱数生成器の要素
        1. 乱数
          1. 暗号化ではこれは知られるもとして扱わなくてはならない
        2. 内部状態
          1. 乱数を生成するにあたって使われる値。乱数を生成するごとに更新される
          2. 知られてはいけない
          1. 最初に与えられる内部状態
      2. 無作為性
        1. 乱雑であること(必須)
      3. 予測不可能性
        1. ある乱数が知られても生成器の内部状態が明らかにならないこと(暗号化には必須)
      4. 再現不可能性
        1. 内部状態が物理的な乱雑さ(例:熱雑音)に依存させ完全な乱数を生成する。周期をもたない
        2. CPUレベルで組み込まれ、CPUのハードウェアが提供してくれる。
          1. intel
            1. エントロピー・ソースとして回路中の熱雑音を利用。これをAES-CBC-MACにかけて256bit(コンディションド・エントロピー・サンプル)を作る
            2. RDSEED
              1. 再現不可能性をもつ。ほかの疑似乱数生成器の種としての利用を想定
            3. RDRAND
              1. コンディションド・エントロピー・サンプルをCTRモードのAESで暗号化。決定論的に高速に乱数列を生成する。予測不可能性をもつ
              2. NIST SP800-90Aで定めたCTR_DRBという乱数生成器を使う
    7. 暗号かぎの強さ
      1. RFC6637参照
      2.  Curve name         ECC        RSA         Hash size   Symmetric
                              strength   strength,               key size
                                         informative

           NIST curve P-256   256        3072        256         128

           NIST curve P-384   384        7680        384         192

           NIST curve P-521   521        15360       512         256
    8. PGP(Pretty Good Privacy)
    9. SSL/TLS (Secure Socket Layer/ Transport Layer Security)
      1. TLSはSSL3.1にあたりSSL3.0は安全ではない。
 
正しく設計された暗号技術はたしかに破ることが難しい。しかし、なにも暗号で守られてデータにアクセスする方法は暗号を破るだけではなくソーシャルエンジニアリングなどで破ることができる。もっと言えば、結局のところ公開鍵基盤で得る信用というのはルート認証局への信用を源泉としているように、信用というものそのものが無から埋めないものである。人間の主観に依存するほかにないのが現状だ。自分以外に誰も信用できない状態ではまったく意味を持たない。