Upload
-
View
714
Download
0
Embed Size (px)
Citation preview
暗号
暗号アルゴリズムは繰り返し使いたいが、平文に暗号アルゴリズムだけでは解読される可能性が高い
アルゴリズムに変更可能な部分を用意し、入力ごとに変える 変更の仕方を鍵という
平文 暗号文暗号アルゴリズム
シーザー暗号
CaptureTheFlag FdswxuiWkhIodj
この暗号に対しては、鍵は0~25の26通りしか存在しないので、全探索で容易に解読される
ブルート・フォース・アタックと呼ばれる
鍵:3
平文 暗号文
二次大戦中のドイツで使われた暗号機械
プラグボードは自由に繋ぎ変えられる ローターは自由に回転させられる
打鍵ごとにローターは回転する
(画像:https://ja.wikipedia.org/wiki/エニグマ_(暗号機))
DES (Data Encryption Standard)
鍵長が実質56bitなので、鍵空間が256しかない 任意の平文から暗号文を得られるとき、選択平文攻撃
が有効となる 差分読解法により247程度の探索で解読できる 線形解読法により243程度の探索で解読できる
ファイステルネットワークを採用
ファイステルネットワーク
この操作をラウンドと呼び、左右を入れ替えて複数回行う
復号化のときは、サブ鍵を逆順に使うとよい
左 右
ラウンド関数
サブ鍵1
暗号化された左 暗号化された右
ラウンド関数
サブ鍵2
ラウンド関数
サブ鍵3
ファイステルネットワーク
この操作をラウンドと呼び、左右を入れ替えて複数回行う
復号化のときは、サブ鍵を逆順に使うとよい
左 右
ラウンド関数
サブ鍵3
暗号化された左 暗号化された右
ラウンド関数
サブ鍵2
ラウンド関数
サブ鍵1
DES (Data Encryption Standard)
DESでは... ブロック長は64bitなので、右と左は32bit ラウンド関数は16段 鍵は64bitだがうち8bitはパリティビット 鍵をローテートしてサブ鍵を生成する ラウンド関数は、Sボックス(ルックアップテーブル)
トリプルDES (DES-EDE3)
DESの鍵を3つ用意し、暗号化→復号化→暗号化の順に行う(Encrypt-Decrypt-Encrypt)
DESと互換がある 3つの鍵に同じ鍵を使うとただのDES
鍵長は56x3 = 168ビット
トリプルDES (DES-EDE3)
現在でも銀行などで使われている
処理速度はあまり早くない
IPAは使用は2030年までにするよう勧告 中間一致攻撃により2112程度の探索で突破できるかもしれない
(補足) 中間一致攻撃
ダブルDESが使われない理由
平文を全通りの鍵で暗号化したものと、暗号文を全通りの鍵で復号化したものを列挙する
一致するものがあればそれが鍵
ダブルDESなら257の探索で済む
平文 暗号文
AES (Advanced Encryption Standard)
NIST(アメリカ国立標準技術研究所)が公募で選定 コンペ方式による標準化
Rijndael(ラインダール)が最終的に選定され、AESとなった
AES (Advanced Encryption Standard)
ブロック長は128bit、鍵長は128/192/256bitから選べる
アルゴリズムが単純で、軽量
SPN構造 (Substitution Permutation Network Structure)
Sボックスの結果をPボックスが並び替える
AES (Advanced Encryption Standard) 128bitのブロックを1byteずつに分割、4x4の行列
として並べて処理する
ラウンドは次の4つの処理から構成される SubBytes … Sボックスで変換 ShiftRows … 行をシフト MixColumns … 列にビット演算 AddRoundKey … ラウンド鍵とのxor
AES (Advanced Encryption Standard) SubBytes
a0,0a0,1a0,2a0,3
a1,0a1,1a1,2a1,3
a2,0a2,1a2,2a2,3
a3,0a3,1a3,2a3,0
Sボックス b0,0b0,1b0,2b0,3
b1,0b1,1b1,2b1,3
b2,0b2,1b2,2b2,3
b3,0b3,1b3,2b3,0
AES (Advanced Encryption Standard) ShiftRows
a0,0a0,1a0,2a0,3
a1,0a1,1a1,2a1,3
a2,0a2,1a2,2a2,3
a3,0a3,1a3,2a3,0
a0,0a0,1a0,2a0,3
a1,1a1,2a1,3a1,0
a2,2a2,3a2,0a2,1
a3,3a3,0a3,1a3,2
b0,0b0,1b0,2b0,3
b1,0b1,1b1,2b1,3
b2,0b2,1b2,2b2,3
b3,0b3,1b3,2b3,0
AES (Advanced Encryption Standard) MixColumns
a0,0a0,1a0,2a0,3
a1,0a1,1a1,2a1,3
a2,0a2,1a2,2a2,3
a3,0a3,1a3,2a3,0
行列計算
b0,0b0,1b0,2b0,3
b1,0b1,1b1,2b1,3
b2,0b2,1b2,2b2,3
b3,0b3,1b3,2b3,0
AES (Advanced Encryption Standard)
AddRoundKeya0,0a0,1a0,2a0,3
a1,0a1,1a1,2a1,3
a2,0a2,1a2,2a2,3
a3,0a3,1a3,2a3,0
k0,0
k0,1
k0,2
k0,3
k1,0
k1,1
k1,2
k1,3
k2,0
k2,1
k2,2
k2,3
k3,0
k3,1
k3,2
k3,0
AES (Advanced Encryption Standard)
ラウンドは鍵長に応じて10~14回繰り返す 少ないラウンド数でも十分ビットが撹拌される
ファイステル構造とは違い、復号化には各ステップ毎に逆変換が必要
今のところ有効な攻撃方法は見つかっていない
ブロック暗号のモード DESやAESは平文を固定長のブロックに分けて暗号化
する
しかし、固定長に区切った平文を暗号化したものをそのまま暗号文とするのは推奨されない
平文と暗号文が一対一になる 暗号文で一致する区画があると攻撃の対象
ブロック暗号のモード 主に次のモードがある
ECBモード (電子符号表モード) CBCモード (暗号ブロック連鎖モード) CFBモード (暗号フィードバックモード) OFBモード (出力フィードバックモード) CTRモード (カウンタモード)
ECBモード (Electronic CodeBook)
平文ブロックを暗号化したものがそのまま暗号ブロックになる
暗号ブロックの順番を入れ替えて も平文は復元される
暗号文を解読できなくても平文を操作できる
平文ブロック
暗号文ブロック
暗号化
CBCモード (Cipher Block Chaining) 一つ前の暗号ブロックとxorをとる
平文ブロック
暗号文ブロック
暗号化
初期化ベクトル
平文ブロック
暗号文ブロック
暗号化
平文ブロック
暗号文ブロック
暗号化
CBCモード (Cipher Block Chaining) 最初の平文には1つ前の暗号文ブロックが存在しない
ので、初期化ベクトルが必要 ランダムなビット列を用いる(BEAST Attack等)
暗号文が破損すると2ブロック影響する
途中の平文ブロックだけ暗号化はできない
(補足) BEAST Attack
平文ブロック
暗号文ブロック
暗号化
前の暗号文ブロック
初期化ベクトル
初期化ベクトル ⊕トライする平文 ⊕前の暗号ブロック
暗号文ブロック
暗号化
平文ブロック
暗号化
観測できた通信
一致すればトライは成功
CBCモード (Cipher Block Chaining) 平文がブロックサイズの整数倍でないとき、最後のブロックにはパディングが行われる
パディングは攻撃の対象になりうる パディングオラクル攻撃 POODLE攻撃
平文 パディング
ブロック
(補足) パディングオラクル攻撃
平文ブロック
暗号文ブロック
暗号化
前の暗号文ブロック
前の暗号文ブロック
⊕
トライする平文⊕
パディング暗号文
ブロック
複合化
パディングチェック
※一番最後のブロックに挿入
平文ブロック
暗号化
観測できた通信
CFBモード (Cipher FeedBack) 一つ前の暗号ブロックを暗号化していく
平文ブロック
暗号文ブロック
暗号化
初期化ベクトル
平文ブロック
暗号文ブロック
平文ブロック
暗号文ブロック
暗号化 暗号化
CFBモード (Cipher FeedBack) 復号化するときも暗号化を行う
平文ブロック
暗号文ブロック
暗号化
初期化ベクトル
平文ブロック
暗号文ブロック
平文ブロック
暗号文ブロック
暗号化 暗号化
CTRモード (CounTeR) カウンタは、ランダムな値ノンスとブロック番号の結合
暗号文ブロック1
暗号化
平文ブロック1
カウンタ1
暗号文ブロック2
暗号化
平文ブロック2
カウンタ2
暗号文ブロック3
暗号化
平文ブロック3
カウンタ3
RSA N, L, E, Dを求める
Nは素数p,qを用いてN = p x q フェルマーテスト、ミラーラビンテストなどを使う
LはL = lcm(p-1, q-1) Eは1 < E < Lで、Lと互いに素な数
乱数を使って探索 Dは1 < D < Lで、E x D mod L = 1な数
拡張ユークリッドの互除法を使う
RSA aED ≡ a mod N の軽い証明
(与式) a⇔ ED ≡ a mod p a∧ ED ≡ a mod q であるaED ≡ a mod p を考えるaがpの倍数のときは自明定義より、ED=m(p-1)+1とおけるよって、 aED ≡ am(p-1) x a ≡ 1m x a mod p
(∵フェルマーの小定理)
RSA
RSAはNのビット数は1024 ~ 4096で選べる
RSAチャレンジで、2009年にはRSA-768が解読された
RSA-1024は新規には使えない
NISTは2048ビットのRSAは2030年までにする方針
ハイブリッド暗号 平文を共通鍵暗号で暗号化する
共通鍵暗号で使った鍵を公開鍵暗号で暗号化 共通鍵暗号の鍵をセッション鍵という セッション鍵は乱数で与える セッション鍵は公開鍵暗号にとっては平文
公開鍵は予め知っておく必要がある
一方向ハッシュ関数
任意の入力を固定長のハッシュ値に変換する関数
メッセージの正真性を検証するのに使われる ハッシュ値が衝突するような異なるメッセージの組を
見つけるのが非常に困難である必要がある(衝突が存在しないハッシュ関数は存在しない)
一方向ハッシュ関数 SHA-2
SHA-256, SHA-384, SHA-512はすべてSHA-2 まだ強衝突耐性は破られていない NISTが開発
SHA-3 コンペによる標準化で選定 SHA3-224, SHA3-256, SHA3-384, SHA3-512がある
SHA-3 コンペによる標準化で選ばれたKECCAKという
アルゴリズムである
解析しやすい、クリーンな構成をしている 複数のラウンドを回すことやマトリョーシカ構造より、弱いKECCAKを
容易に実装でき、それを攻撃することで強度が見積もれる
SHA-2と全く異なる構造をしている
SHA-3
KECCAKの内部状態は5x5xzの直方体 SHA-3ではz = 64で、状態は1600bit
θ, ρ, π, χ, ιの5つのステップで1ラウンドである
SHA-3では24ラウンド繰り返す(画像:http://keccak.noekeon.org/)
一方向ハッシュ関数 誕生日攻撃 (衝突攻撃)
同じハッシュ値を持つ2つのメッセージを探索する 強衝突耐性を破ろうとする攻撃 誕生日のパラドックスに由来 誕生日攻撃の試行回数はブルート・フォース・アタック
よりずっと少なくて済む
誕生日のパラドックス 誕生日が同一の2人が50%以上の確率で存在するには、何人集めればよいでしょうか?
23人いればよい H個の値の集合からn個を無造作に選んだとき、同じ値
が2度以上選ばれる確率が50%以上になるには、Hが大きいときおよそn √H≒
メッセージ認証コード (MAC) Message Authentication Code 略してMAC
なりすましや改竄を検出できる
メッセージと共通鍵から計算されるMAC値を比較して認証する 一方向ハッシュ関数、ブロック暗号を使って実現される
メッセージ認証コード (MAC) 共通鍵暗号で暗号化した文章を送るのと違うのか?
共通鍵暗号だけでは ランダムなビット列を正しい鍵で暗号化したもの 適当なビット列を誤った鍵で暗号化したもの
の区別ができない
HMAC HMACは
hash(opadkey + hash(ipadkey + message))但し、
ipadkey = key ipad⊕ (ipadは00110110の繰返し) opadkey = key opad⊕ (opadは01011100の繰返し) keyは鍵に、hashのブロック長まで0でパディング
したもの
メッセージ認証コード (MAC) メッセージの否認防止ができない
つまり第三者に対する証明ができない
MAC値を計算可能なのは、アリスとボブの2人存在する
アリスが作成したメッセージではなく、ボブ自身が作成したメッセージかもしれない
デジタル署名 RSA
ElGamal方式
DSA (Digital Signature Algorithm) ElGamal方式の変種
楕円曲線DSA (Elliptic Curve Digital Signature Algorithm)
Rabin方式
デジタル署名 中間者攻撃
デジタル署名では予め公開鍵を入手する
この公開鍵は本物なのか?→ 別の信頼できる人に公開鍵を署名してもらう
デジタル署名された公開鍵を証明書という この署名にも公開鍵が必要...
公開鍵基盤 (Public-Key Infrastructure)
Alice BobBobの公開鍵
信頼できる第三者Trent
認証局リポジトリ 署名
Bobの公開鍵
Trentの署名
証明書
ダウンロード 登録
証明書 利用者のプライベート鍵が盗まれたりした場合
公開鍵を破棄する必要がある
認証局は証明書破棄リスト (CRL) を作成する 破棄された証明書の一覧に署名したもの
CRLは最新のものなのか、しっかり確認する必要がある
証明書 CRLの隙を突く攻撃
BobがAliceにメールを送ってから、CAに公開鍵を破棄してもらう通知をする
AliceはメールをBobのものだと思う BobはAliceに届いたメールを否認する
これを完全に防ぐのは無理
乱数 鍵の生成、初期化ベクトルなど、予測不可能な値が必要な場合がしばしばある
乱数には次の性質がある 無作為性… 統計的な偏りがない 予測不可能性 … 過去の数列から次の値が予測できない 再現不可能性 … 同じ数列を再現できない
乱数 乱数を生成するソフトウェアを擬似乱数生成器 (PRNG)
とよぶ 擬似乱数生成器には種(seed)が必要
ハードウェアからの情報を使えば再現不可能性を満たすことができるかもしれない
そのようなハードウェアを乱数生成器とよぶ
乱数 線形合同法
R0 = (seed) とする
Rn+1
= (A x Rn + C) mod M で乱数を生成する
うまくA, C, Mを選べば無作為性は満たされる 過去の数列があればA, C, Mは逆算できる
予測不可能性を持たないので暗号技術には使えない
乱数 一方向ハッシュを使う方法
counter = (seed) で初期化する R
n = hash(counter) で乱数を得て、counterに1を足す
乱数を予測するにはhashの一方向性を破る必要がある
乱数 暗号を使う方法
seedはカウンタ初期化用と鍵用の2つに分ける counter = (seed1) で初期化する R
n = encrypt(counter, seed2) で乱数を得て、
counterに1を足す
乱数を予測するには暗号を解読する必要がある
SSL/TLS (Secure Socket Layer/Transport Layer security)
世界で最も利用されている暗号通信の方法(プロトコル) httpsで用いられている httpsでは、SSL/TLSの上にhttpが乗っている http以外にもプロトコルを乗せられる
例えばメールのプロトコルSMTP, POP3
SSL/TLS (Secure Socket Layer/Transport Layer security)
SSLはNetScape社(現Mozilla)の作ったプロトコル
TLSはSSL3.0を元にIETFによって作られたプロトコル TLS1.0はSSL3.1に相当する
SSL3.0まではPOODLE攻撃より使用を推奨されない
SSL/TLS (Secure Socket Layer/Transport Layer security)
TLSは暗号通信の枠組みを提供する 使用する暗号技術を選択できる 実際には暗号スイートから選ばれることが多い
SSL/TLS (Secure Socket Layer/Transport Layer security)
TLSハンドシェイクプロトコル 以下のサブプロトコルがある
ハンドシェイクプロトコル 暗号仕様変更プロトコル 警告プロトコル アプリケーションデータ
プロトコル TLSレコード
プロトコル
TLSプロトコル
ハンドシェイク
プロトコル
暗号仕様変更
プロトコル
警告
プロトコル
アプリケーション
データプロトコル
TLSハンドシェイクプロトコル
SSL/TLS (Secure Socket Layer/Transport Layer security)
TLSレコードプロトコル TLSハンドシェイクプロトコルのデータを分割、圧縮し、
MACをつけて共通鍵暗号で暗号化する
初期化ベクトル、共通鍵暗号とMACの鍵はマスターシークレットから生成する
暗号文にヘッダをつけて送信データとする
SSL/TLS (Secure Socket Layer/Transport Layer security)
ハンドシェイクプロトコル 使用する暗号を合意する 証明書を交換する マスターシークレットを得る 最初のハンドシェイクでは「暗号化なし」という
暗号化スイートを使っている
SSL/TLS (Secure Socket Layer/Transport Layer security)
暗号仕様変更プロトコル 暗号を切り替える合図をする
警告プロトコル エラーを伝える
アプリケーションデータプロトコル httpなどのデータが乗る
SSL/TLS (Secure Socket Layer/Transport Layer security)
既知の主な脆弱性 OpenSSLのHeartBleed脆弱性 POODLE攻撃 FREAK攻撃
おわりに 暗号技術はセキュリティの一部でしかない
SSL/TLSは通信経路で第三者から読まれることはないが、通信前と通信後は分からない
サービス拒否攻撃をすると暗号技術は無意味
人間はパスワードを漏らすかもしれない 人間はマルウェアを動かすかもしれない
暗号通貨 中本哲史という謎の人物の論文が元
“Bitcoin: A Peer-to-Peer Electronic Cash System” ビットコインは通貨というよりは、P2Pネットワーク上
で動作する決済システム
ビットコインの最小単位0.00000001 BTCは筆者の名前にちなんで1 satoshi と名付けられた
暗号通貨の送金 通貨はビットコイン・アドレス間で取引される
ビットコイン・アドレスは公開鍵をSHA-256とRIPEMD-160の2つのハッシュ関数を通したもの
暗号アルゴリズムは楕円曲線暗号 使われている楕円曲線はx2 = y3 + 7
暗号通貨の送金 送金する人が、「どのアドレスからどのアドレスに
いくら送金するか」を決める この取引をトランザクションと呼ぶ
送金する人はトランザクションにデジタル署名をして公開鍵とともにP2Pネットワークに送信する
暗号通貨の送金 採掘者はトランザクションプールの中から好きな
トランザクションを検証し、ブロックを作成する
採掘者は作成したブロックが承認されると一定の報酬と手数料を得ることができる
手数料が多いほうが検証されやすい 少ないとトランザクションが成立するのに時間がかかる
暗号通貨の採掘 ビットコインの取引は全てブロックチェーンという
公開取引簿に記録されている ブロックチェーンを参照することで任意のアドレスの残高が求まる
ブロックチェーンはブロックが連鎖したものである
暗号通貨の採掘 ブロックチェーンに新たなブロックを繋ぐ競争
直前のブロックのハッシュ値 検証したトランザクション全体のハッシュ値 あるノンス
からなるヘッダでハッシュ値を計算すると、上位ビットに0が一定個数並ぶようなノンスを探索する
(
暗号通貨の採掘 ビットコインではハッシュ関数にSHA-256を2重にし
て使用する
平均で10分に1つのブロックが追加されるように、0
の並ばないといけない数(difficulty)を調整する 2016ブロック毎に、平均10分を超えているかで判断
暗号通貨の採掘 このようなハッシュ値の計算は、ビットコインの偽造
を防ぐために行われる Proof of Work; PoWとよぶ 過去のトランザクションを改竄するには、その
ブロックから全てのハッシュ値を計算し直す必要があるが、追いつくのは厳しい
暗号通貨の採掘 ブロックを生成、承認しているのは採掘者
採掘者の過半数が善良な採掘者であることが前提
採掘者の過半数の計算資源を掌握できれば 少数派のブロックを拒否できる 不正なトランザクションを含んだブロックを承認させられる
などの攻撃が可能 (51%攻撃)