d'space
http://w.atwiki.jp/d1space/
d'space
ja
2012-07-11T16:55:47+09:00
1341993347
-
SSL
https://w.atwiki.jp/d1space/pages/24.html
// SSL
#contents()
----
//----------------------------------------------------
** SSL
- インターネットのようなオープンなネットワークを用いて、安全に秘匿通信をおこなうための2者間プロトコル
- 通信相手が本当に意図した相手であることを確認
- 通信途中でメッセージを改ざんされたり、中身を覗き見られたりするのを防ぐ
- 現代暗号のさまざまな要素技術を組み上げることで実現
&bold(){注意:}
SSLは、通信する2者間で相互に相手を認証するオプションももつが、
ここでは、もっともよく用いられているクライアント・サーバモードのみを扱う。
クライアント・サーバモードではクライアントは認証されず、サーバのみが認証される。
(クライアントは自身の公開鍵と秘密鍵ペアをもつ必要はない。)
*** SSLの歴史
- SSL 1.0 1994年、Netscape。設計レビューの段階で破棄。
- SSL 2.0 1994年、Netscape。ダウングレード攻撃が可能。
- SSL 3.0 1995年、Netscape。問題修正、機能追加。
- TLS 1.0 1997-1999年、IETF。SSL 3.0と同機能。
- TLS 1.1 2006年、IETF。AES暗号を追加。
- TLS 1.2 2008年、IETF。SHA256を追加。PRFをSHA256を使うように変更。
以下、とくに断らない限り、SSL とは SSL 3.0 = TLS 1.0 を意味する。
** SSLの概要
SSLは
- ハンドシェークフェーズ
- データ転送フェーズ
の2フェーズからなる。
ハンドシェークフェーズにおいてプロテクションパラメータを共有し、
プロテクションパラメータを用いてデータ転送フェーズで安全にメッセージを送受信する。
*** TLSメッセージヘッダ
|type(1)|major(1)|minor(1)|length(2)|TLS Message|
type:
#blockquote{{
typedef enum {
content_change_cipher_spec = 20,
2012-07-11T16:55:47+09:00
1341993347
-
文献
https://w.atwiki.jp/d1space/pages/23.html
** 文献
- 黒澤 馨, 現代暗号への招待, サイエンス社, 2010.
- Eric Rescorla, SSL and TLS: Designing and Building Secure Systems, Addison-Wesley Professional, 2000.
- Joshua Davies, Implementing SSL / TLS Using Cryptography and PKI, Wiley, 2011.
- [Vaudenay05] Serge Vaudenay, “A Classical Introduction to Cryptography: Applications for Communications Security”, Springer, 2005.
&link_up()
----
2012-06-28T20:46:02+09:00
1340883962
-
SSL再び
https://w.atwiki.jp/d1space/pages/22.html
// SSL再び
#contents()
----
//----------------------------------------------------
** SSL再び
SSL 3.0 を対象とする。
[[SSLの目的と概要]]を参照。
*** 典型的なハンドシェークフェーズの骨子
| &bold(){クライアント} | | &bold(){サーバ}|
| | 32バイトのクライアント乱数 R&sub(){client} → ||
| | ← 32バイトサーバ乱数 R&sub(){server}, サーバ証明書 ||
|サーバ証明書の検証 | E&sub(){server}(46バイトのプレマスター秘密 S&sub(){pre}) → ||
|48バイトのマスター秘密 S&sub(){master} の導出 | | 48バイトのマスター秘密 S&sub(){master} の導出 |
| | 確認認証子 mac&sub(){fin} → ||
| | ← 確認認証子 mac'&sub(){fin} ||
|mac'&sub(){fin}の検証 | | mac&sub(){fin}の検証 |
|鍵導出 | | 鍵導出 |
基本的な設計方針は、鍵共有プロトコル EB-SIG と同様。ただし、
- クライアントは認証せず、
- マスター秘密は、クライアント乱数、サーバ乱数およびプレマスター秘密の3つから計算し、
- 送信メッセージごとにデジタル署名を添付する代わりに、最後にMACを交換。
クライアント乱数とサーバ乱数の組は、(暗号技術的な)セッション識別子と解釈できる。
*** マスター秘密の導出
ハッシュ関数を用いて疑似的な疑似ランダム関数を実装している。
[[ハッシュ関数とMAC]]を参照。
それについて、
- プレマスター秘密を鍵としたときの、クライアント乱数とサーバ乱数の組からなるセッション識別子における値
をマスター秘密としている。
#blockquote{{
S&sub(){master} :=
- MD5(S&sub(){pre} || SHA1("A" || S&sub(){pre} || R&sub(){client} || R&sub(
2010-06-04T14:59:34+09:00
1275631174
-
鍵共有プロトコル
https://w.atwiki.jp/d1space/pages/21.html
// 鍵共有プロトコル
#contents()
----
//----------------------------------------------------
** 鍵共有プロトコル
*** 鍵共有プロトコルとは?
鍵共有プロトコルとは、セッション鍵を共有するための2者間プロトコルである。
鍵共有プロトコルを実行する、2者 P&sub(){1} と P&sub(){2} は、
#blockquote(){{
いくつかのメッセージを交換し、それら交換したメッセージをもとにそれぞれが計算を行い、ある同じビット列 k を出力する。
}}
この共有したビット列 k を&bold(){セッション鍵}と呼ぶ。
セッション鍵 k を用いて、その後の P&sub(){1} と P&sub(){2} 間の
- 通信内容を秘匿したり(k を鍵としてブロック暗号+暗号利用モード)、
- 通信内容を認証したりする(k を鍵としてMACを生成・検証)。
もちろん、鍵共有プロトコルには
#blockquote{{
&bold(){秘匿性:}
鍵共有プロトコルを実行する、2者P&sub(){1} と P&sub(){2} のやり取りするメッセージをすべて敵 A が覗き見しても、敵 A にはセッション鍵 k のどのような部分情報も得られない。
}}
が必要である。
*** 公開鍵暗号ベースの鍵共有プロトコル EB
公開鍵暗号 (G, E, D) を利用して、鍵共有プロトコル EB をつくることができる。
#blockquote{{
&bold(){鍵共有プロトコル EB: }
+ P&sub(){2} は、鍵生成アルゴリズムGを実行して鍵ペア (e,d) ← G(n) を生成し、公開鍵 e のみを P&sub(){1} に送る。
+ P&sub(){1} は、ランダムな n ビットのビット列 k を生成し、それを鍵 e で暗号化して暗号文 c ← E&sub(){e}(k) を作り、P&sub(){2} に送る。 k を出力する。
+ P&sub(){2} は、暗号文 c を復号して k ← D&sub(){d}(c)を得て出力する。
}}
&blankimg(center,EB.j
2010-06-03T13:14:48+09:00
1275538488
-
デジタル署名
https://w.atwiki.jp/d1space/pages/20.html
// デジタル署名
#contents()
----
//----------------------------------------------------
** デジタル署名
*** デジタル署名の機能
デジタル署名は
#blockquote{{
メッセージの真正性を、誰もが検証できる形で、保証する電子データ
}}
である。
各自は自分用の署名鍵と検証鍵の組をもつ。
#blockquote{{
署名鍵はメッセージの署名を生成するのに用い、検証鍵は署名を検証するに用いる。
}}
署名鍵は秘密に保管し、検証鍵は公開する。
実際にメッセージに署名を添付して送るには、以下のようにする。
#blockquote{{
+ 送信者 Alice は自分の検証鍵 pk&sub(){A} を公開しておく。
+ Alice は、自身の署名鍵 sk&sub(){A} を用い、メッセージ m の署名 σ を生成し、メッセージ m とともに受信者 Bob に送る。
+ メッセージと署名の対 (m, σ)を受け取った Bob は、Aliceの検証鍵 pk&sub(){A} を入手し、それを用いて対 (m, σ)の正当性を確認する。
}}
Aliceの署名鍵 sk&sub(){A} は秘密に保管され、検証鍵 pk&sub(){A} は公開されているので、
- 署名検証は Bob を含めてだれにでもできる。
- 署名生成は、署名鍵を知っている、Alice にしかできない。
ということが期待される。
これが本当に正しいのなら、
- 受信者 Bob から見て、受け取ったメッセージは確かに Alice が署名したと確信でき、
- 送信者 Alice から見ると、メッセージに署名したという事実を、Bobのみならず第3者に対しても否定できないことになる。
*** デジタル署名の定義
デジタル署名は、鍵生成アルゴリズム Gen、署名生成アルゴリズム Sign そして署名検証アルゴリズム Vrfy の3つの効率的なアルゴリズムの組である。
&bold(){鍵生成アルゴリズム} Genは、セキュリティパラメータ k を入力すると検証鍵 pk と署名鍵 sk の組を出力する:
(pk, sk)
2010-05-27T15:16:48+09:00
1274941008
-
公開鍵暗号
https://w.atwiki.jp/d1space/pages/19.html
// 公開鍵暗号
#contents()
----
//----------------------------------------------------
** 公開鍵暗号
*** 公開鍵暗号の機能
公開鍵暗号は
#blockquote{{予め秘密を共有しないで秘密の通信を行う方法。}}
暗号化には公開鍵を、復号には私有鍵を用いる。
#blockquote{{+ 受信者は自分の公開鍵を公開。
+ 送信者は、受信者の公開鍵を入手。
+ 送信者は、メッセージを&bold(){受信者の公開鍵で暗号化}し、受信者に送る。
+ 受信者は、暗号文を&bold(){自分の私有鍵で復号}し、もとのメッセージを得る。
}}
暗号文を復号できるのは、暗号化に用いた公開鍵と対になった私有鍵だけ。つまり、正当な受信者だけ。
&blankimg(center,pke.jpg)
*** 公開鍵暗号の定義
公開鍵暗号は、3つの効率的な確率的アルゴリズムの組:
#blockquote{{公開鍵暗号 = (G, E, D).}}
&bold(){鍵生成アルゴリズム G}は、セキュリティパラメータ k を入力すると公開鍵 e と私有鍵 d の組を出力:
#blockquote{{(e, d) ← G(k).}}
(セキュリティパラメータ k とは暗号の強度を指定するパラメータ。)
&bold(){暗号化アルゴリズム E}は、公開鍵 e とメッセージ m を入力すると暗号文 c を出力:
#blockquote{{c ← E(e, m).}}
&bold(){復号アルゴリズム D}は、私有鍵 d と暗号文 c を入力するとメッセージ m を出力:
#blockquote{{m ← D(d, c).}}
ただし、3つ組 (G, E, D) は以下の完遂性と一方向性を満たさなければならない。
#blockquote{{&bold(){完遂性:}
G によって生成された任意の鍵ペア (e, d) と任意のメッセージ m について、 D(d, E(e,m)) = m . }}
暗号化して復号したらもとのメッセージに戻るということ。
#blockquote{{&bold(){一方向性:}
2010-05-28T15:03:09+09:00
1275026589
-
整数論入門
https://w.atwiki.jp/d1space/pages/18.html
// 整数論入門
#contents()
----
//----------------------------------------------------
** 整数論入門
*** 整数と素数
0 および自然数および自然数を -1 倍して得られる数を&bold(){整数}と呼ぶ。
- &bold(){Z} = { ・・・, -2, -1, 0, 1, 2, ・・・}.
2つの整数 a, b について、b が a を&bold(){わる}とは、
- ある整数 c があって、a = b・c
とかけることをいう。このとき、
- b を a の&bold(){約数}
- a を b の&bold(){倍数}
と呼ぶ。
整数 p が約数として 1 と p しかもたないとき、それを&bold(){素数}と呼ぶ。
#blockquote{{
&bold(){整数論の基本定理:}
任意の整数 n は
- n = ± p&sub(){1}&sup(){e&sub(){1}} ・・・p&sub(){r}&sup(){e&sub(){r}}
と素数の積に(並べ替えを除いて)ただ一通りにかける。
}}
2つの整数 a, b の共通の約数(&bold(){公約数})のうち最大のものを&bold(){最大公約数}と呼び、
- gcd(a, b)
とかく。
2つの整数 a, b について、その最大公約数 gcd(a,b) が 1 に等しいとき、a と b は&bold(){互いに素}であるという。
2つの整数 a, b の共通の正の倍数(&bold(){公倍数})のうち最小のものを&bold(){最小公倍数}と呼び、
- lcm(a, b)
とかく。
最大公約数と最小公倍数の対は、もとの整数対の「再分配」を与える:
#blockquote{{
2つの整数 a, b について、
- a・b = gcd(a,b)・lcm(a,b)
}}
*** 合同式
正の整数 n と2つの整数a, bについて、&bold(){a が n を法として b に合同である}とは
- n が (a - b) をわる
こと、すなわち、
- ある整数 c があって、a = b + c n
2010-05-07T19:59:23+09:00
1273229963
-
ハッシュ関数とMAC
https://w.atwiki.jp/d1space/pages/17.html
// ハッシュ関数とMAC
#contents()
----
//----------------------------------------------------
** ハッシュ関数とMAC
*** ハッシュ関数
任意の長さの文字列をある固定長の文字列に(不可逆に)圧縮する関数を&bold(){ハッシュ関数}という。
- H : {0,1}* → {0,1}&sup(){k}
ただし、暗号技術では、ハッシュ関数Hに対し以下の安全性条件を要求する。
#blockquote{{
&bold(){原像困難性:}
与えられた文字列 y に対し、その原像 x 、すなわち H(x) = y となる x を求めることは計算量的に困難である。
}}
#blockquote{{
&bold(){第2原像困難性:}
与えられた文字列 x に対し、その第2原像 x' 、すなわち H(x') = H(x)となる、 x とは異なる x' を求めることは計算量的に困難である。
}}
#blockquote{{
&bold(){衝突困難性:}
衝突ペア (x, x')、すなわち H(x) = H(x')となる、異なる x と x' のペアを求めることは計算量的に困難である。
}}
**** バースデイ・パラドックス
N個のボールが袋に入っている。各ボールはh個の色のどれかに塗られている。色の分布に偏りはない。
この袋に同じ色のボールが2個以上入っている確率はどの程度だろうか?
- ボールのペアの総数は N(N-1)/2で、N&sup(){2}程度。
- ランダムなペアが同じ色である確率は、1 / h.
よって、袋に同じ色のボールが2個以上入っている確率は、 N&sup(){2} / h 程度。N が h&sup(){1/2} 程度以上になると無視できない。
#blockquote{{
nビット出力のハッシュ関数について、
- 2&sup(){n/2}程度のランダム文字列のハッシュ値を計算すると、ほぼ確実に衝突ペアがみつかる。
- つまり、nビット出力のハッシュ関数の衝突困難性は高々 n/2 ビットである。
}}
**** マークル・ダムガード変換
固定長入
2013-05-01T15:54:27+09:00
1367391267
-
暗号利用モード
https://w.atwiki.jp/d1space/pages/16.html
// 暗号利用モード
#contents()
----
//----------------------------------------------------
** 暗号利用モード
ブロック暗号 E&sub(){K}(・)を、任意の長さのメッセージ
- m = (m&sub(){1}, m&sub(){2}, ..., m&sub(){b})
を暗復号できるように変換する方法のことを&bold(){暗号利用モード}と呼ぶ。
*** XOR 演算
|$$\oplus$$|0|1|
|0|0|1|
|1|1|0|
常に、
- (a $$\oplus$$ b) $$\oplus$$ b = a.
*** ECB(electronic code book)モード
- &bold(){暗号化} c = (E&sub(){K}(m&sub(){1}), E&sub(){K}(m&sub(){2}), ..., E&sub(){K}(m&sub(){b}))
- &bold(){復号} m = (D&sub(){K}(c&sub(){1}), D&sub(){K}(c&sub(){2}), ..., D&sub(){K}(c&sub(){b}))
同じ内容のメッセージブロックは常に同じ暗号文ブロックに変換されるので、メッセージの部分情報を漏らしてしまっているといえる。
*** CBC(cipher block chaining)モード
- &bold(){暗号化}
-- IV ←&sup(){$} {0,1}&sup(){n}
-- c&sub(){1} = E&sub(){K}(IV $$\oplus$$ m&sub(){1})
-- c&sub(){2} = E&sub(){K}(c&sub(){1} $$\oplus$$ m&sub(){2})
-- ・・・
-- c&sub(){b} = E&sub(){K}(c&sub(){b-1} $$\oplus$$ m&sub(){b})
-- c = (IV, c&sub(){1}, c&sub(){2}, ・・・, c&sub(){b})
- &bold(){復号}
-- IV を c より取り出す。
2010-04-21T17:07:19+09:00
1271837239
-
ブロック暗号
https://w.atwiki.jp/d1space/pages/15.html
// ブロック暗号
#contents()
----
//----------------------------------------------------
** ブロック暗号
ブロック暗号は、&bold(){固定長メッセージ}を暗・復号するための共通鍵暗号である。共通鍵暗号では、送信者と受信者は同じ鍵を共有していることを前提とする。
|||鍵K||鍵K|||
|||↓||↓|||
|メッセージ|→|[暗号化]|→暗号文→|[復号]|→|メッセージ|
ブロック暗号の数学的実体は、
- &bold(){鍵}と呼ばれる k ビット文字列 K と
- &bold(){平文}と呼ばれる n ビット文字列 M
を入力とし、
- n ビットの&bold(){暗号文}と呼ばれる文字列 C
を出力する関数 E である:
#blockquote{{E : {0,1}&sup(){k} x {0,1}&sup(){n} → {0,1}&sup(){n}
E(K, M) = C.
}}
ただし、各鍵 K∈{0,1}&sup(){k} について
#blockquote{{関数 E&sub(){K}(・) = E(K,・) は置換でなければならない。
}}
関数 E&sub(){K}(・) を(計算するアルゴリズムを)&bold(){暗号化アルゴリズム}、逆関数 E&sub(){K}&sup(){-1}(・) を(計算するアルゴリズムを)&bold(){復号アルゴリズム}と呼ぶ。
ブロック暗号は、
- 鍵 K があれば、暗号化 C=E&sub(){K}(M) や復号 M=E&sub(){K}&sup(){-1}(C) を高速に実行できるが、
- 鍵 K がなければ、暗号文 C=E&sub(){K}(M) を見ても、その平文 M はわからない
ようにつくる必要がある。
#blockquote{{理想は各 E&sub(){K}(・) がランダム置換。
}}
*** DES
DESは鍵長 k=56、ブロック長 n=64 のブロック暗号である。
DESは、入力メッセージを左ブロックと右ブロックに分け、
#blockquote{{- 右ブロックを部分鍵に依存して撹拌したものを、
- 左ブロックに足
2010-04-21T14:41:09+09:00
1271828469