PromleeBlog
サイトマップ
このブログについて
メニュー
loading..🐩🐩🐩🐩
学習
Security Theory
Hash Mac
MAC:メッセージ認証コード
MAC:メッセージ認証コード
📅
メッセージ認証コード:MAC
MACの性質
デジタル署名との比較
MACの設計
ハッシュ関数に基づくMAC:HMAC
HMACの構成
HMACの安全性
ブロック暗号に基づくMAC:CBC-MAC
復習:CBC暗号化モード
CBC-MACの説明
メッセージ認証コード:MAC (Message Authentication Code: MAC)
🔗
メッセージの完全性と認証のためのコードです。
AliceとBobは、伝送中のメッセージ
x
x
x
が改ざんされていないことを確認したいと考えています。
Bobは、メッセージ
x
x
x
と、共有した秘密鍵
k
k
k
の関数としてMAC(y)を作ります。
y
=
MAC
k
(
x
)
y = \text{MAC}_k(x)
y
=
MAC
k
(
x
)
Aliceへ
(
x
,
y
)
(x, y)
(
x
,
y
)
を送ります。
Aliceは、共有した秘密鍵
k
k
k
と受信メッセージ
x
x
x
を使い、
y
y
y
を検証します。
安全性の要件:秘密鍵
k
k
k
がなければ、MACを作れないことです。
MACの性質 (Properties of MAC)
🔗
暗号学的なチェックサムです。
MACは、メッセージの完全性を保証します。
対称的な技術です。
任意長の入力に対し、固定長の出力を返します。
メッセージの完全性を提供します。
メッセージ認証を提供します。
否認防止は提供しません(No nonrepudiation)。
デジタル署名との比較 (Comparison with Digital Signature)
🔗
長所:デジタル署名より高速です。
短所:否認防止は提供しません。
MACの設計 (Design of MAC)
🔗
ハッシュ関数を使う方法。
ブロック暗号を使う方法。
ハッシュ関数に基づくMAC:HMAC (Hash-based MAC: HMAC)
🔗
暗号学的ハッシュ関数を、基本的な構成要素として使います。
IPセキュリティスイート、TLS(Transport Layer Security)、SET(Secure Electronic Transaction)などで使われます。
特定の仮定の下で、HMACの安全性を証明できます。
HMACの構成 (Construction of HMAC)
🔗
K
K
K
の左側に0を加えて、
b
b
b
ビットの文字列
K
+
K^+
K
+
を作ります。
S
i
=
K
+
⊕
ipad
S_i = K^+ \oplus \text{ipad}
S
i
=
K
+
⊕
ipad
を計算します。ipadは、0x36を
b
/
8
b/8
b
/8
回繰り返した値です。
S
i
S_i
S
i
へ
M
M
M
を連結します。
H
(
S
i
∥
M
)
H(S_i \| M)
H
(
S
i
∥
M
)
を計算します。
S
o
=
K
+
⊕
opad
S_o = K^+ \oplus \text{opad}
S
o
=
K
+
⊕
opad
を計算します。opadは、0x5Cを
b
/
8
b/8
b
/8
回繰り返した値です。
H
(
S
i
∥
M
)
H(S_i \| M)
H
(
S
i
∥
M
)
を、
S
o
S_o
S
o
へ連結します。
H
(
S
o
∥
H
(
S
i
∥
M
)
)
H(S_o \| H(S_i \| M))
H
(
S
o
∥
H
(
S
i
∥
M
))
を計算し、出力します。
HMACの安全性 (Security of HMAC)
🔗
証明可能な安全性を提供でき、特定の仮定の下でHMACは安全です。
有効なMAC出力を作ることは、使用しているハッシュ関数に対する、次のいずれかの攻撃に相当します。
攻撃者に知られていない、ランダムで秘密のIVを使い、圧縮関数の出力を計算すること。
ランダムかつ秘密のIVが設定されたハッシュ関数で、衝突を見つけること。
⇒
\Rightarrow
⇒
使用しているハッシュ関数の衝突を見つけることに関係します。
ブロック暗号に基づくMAC:CBC-MAC (Block Cipher-based MAC: CBC-MAC)
🔗
ブロック暗号と暗号利用モードを組み合わせます。
実務では、AESとCBCが最もよく使われます。
復習:CBC暗号化モード (Review: CBC Encryption Mode)
🔗
Enc
(
K
,
P
i
)
=
{
EncBlock
(
K
,
I
V
⊕
P
1
)
첫 블록의 경우
EncBlock
(
K
,
C
i
−
1
⊕
P
i
)
다른 블록의 경우
\text{Enc}(K, P_i) =\begin{cases}\text{EncBlock}(K, IV \oplus P_1) & \text{첫 블록의 경우}\\\text{EncBlock}(K, C_{i-1} \oplus P_i) & \text{다른 블록의 경우}\end{cases}
Enc
(
K
,
P
i
)
=
{
EncBlock
(
K
,
I
V
⊕
P
1
)
EncBlock
(
K
,
C
i
−
1
⊕
P
i
)
첫
블록의
경우
다른
블록의
경우
Dec
(
K
,
C
i
)
=
{
DecBlock
(
K
,
C
1
)
⊕
I
V
첫 블록의 경우
DecBlock
(
K
,
C
i
)
⊕
C
i
−
1
다른 블록의 경우
\text{Dec}(K, C_i) =\begin{cases}\text{DecBlock}(K, C_1) \oplus IV & \text{첫 블록의 경우} \\\text{DecBlock}(K, C_i) \oplus C_{i-1} & \text{다른 블록의 경우}\end{cases}
Dec
(
K
,
C
i
)
=
{
DecBlock
(
K
,
C
1
)
⊕
I
V
DecBlock
(
K
,
C
i
)
⊕
C
i
−
1
첫
블록의
경우
다른
블록의
경우
CBC-MACの説明 (Description of CBC-MAC)
🔗
CBC-MACの生成
秘密鍵
k
k
k
、初期値
I
V
IV
I
V
があり、メッセージ
x
x
x
を
n
n
n
個のブロック
x
1
,
x
2
,
⋯
,
x
n
x_1, x_2, \cdots, x_n
x
1
,
x
2
,
⋯
,
x
n
に分けたとします。
y
1
=
Enc
B
l
o
c
k
(
k
,
I
V
⊕
x
1
)
y_1 = \text{Enc}_{Block}(k, IV \oplus x_1)
y
1
=
Enc
Bl
oc
k
(
k
,
I
V
⊕
x
1
)
y
i
=
Enc
B
l
o
c
k
(
k
,
y
i
−
1
⊕
x
i
)
y_i = \text{Enc}_{Block}(k, y_{i-1} \oplus x_i)
y
i
=
Enc
Bl
oc
k
(
k
,
y
i
−
1
⊕
x
i
)
2
≤
i
≤
n
2\leq i \leq n
2
≤
i
≤
n
について計算し、
(
x
,
y
n
)
(x, y_n)
(
x
,
y
n
)
を送ります。
CBC-MACの検証
(
x
,
y
n
)
(x, y_n)
(
x
,
y
n
)
が与えられたら、次を確認します。
y
n
=
?
CBC-MAC
k
(
x
)
y_n \stackrel{?}{=} \text{CBC-MAC}_k(x)
y
n
=
?
CBC-MAC
k
(
x
)
CBC-MACは、メッセージの
完全性
と
認証
を保証します。
MAC:メッセージ認証コード | PromleeBlog